CTF实战:用Sqlmap破解表单输入型SQL注入题(输入账号密码/usernamepassword)
目录
引言
步骤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。
(注:本文实验环境为模拟场景,请勿用于非法渗透测试。)