跳到主要内容

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 数据,重新进行探测。

二、 最佳实践

  1. 结合 Burp Suite 使用 (最推荐的姿势) 直接使用 -u 参数往往难以处理复杂的登录态、CSRF Token 或复杂的 JSON 请求。
  • 实践:在 Burp Suite 中拦截目标请求,右键 "Copy to file" 保存为 req.txt,然后使用命令 sqlmap -r req.txt -p 目标参数 --batch
  1. 精准打击,提升效率 SQLMap 默认会测试所有参数并尝试所有数据库类型,这非常耗时且容易产生大量垃圾日志暴露行踪。
  • 实践:如果你通过信息收集已经知道目标是 PHP+MySQL,并且只想测试 id 参数,请明确指定: sqlmap -u "..." -p "id" --dbms="MySQL" --technique=U (优先尝试联合查询)。
  1. WAF 绕过与隐蔽测试 默认的 User-Agent 会直接暴露你正在使用 SQLMap (sqlmap/1.x...),极容易被 WAF 直接拦截。
  • 实践:永远养成加上 --random-agent 的习惯。如果遇到简单的 WAF,尝试组合 Tamper 脚本,例如: sqlmap -r req.txt --random-agent --tamper="space2comment,apostrophemask" --delay=1
  1. 安全地获取数据 (控制 Risk 与 Dump) 不要轻易使用 --risk=3,它包含的基于时间的盲注可能会使用带有 OR 条件的长时间睡眠语句,或者进行写入操作,极易导致生产环境数据库雪崩或数据被破坏。
  • 实践:获取数据时,如果表非常大(比如有几十万用户),千万不要直接 --dump,这会占用极大的网络带宽。使用 --start=1 --stop=5 只获取前 5 条证明漏洞存在即可。
  1. 清理缓存 有时候目标服务器修复了部分问题,或者你换了网络环境,SQLMap 会直接读取本地之前失败的缓存,导致判断错误。
  • 实践:当结果不符合预期时,加上 --flush-session 重试。