sqlmap工具批量化注入

无人值守

在进行批量化自动化注入测试时,最核心的痛点是 sqlmap 在运行过程中经常会停下来询问用户(Y/N)。要实现真正的批量化,必须使用自动化确认参数。

  • --batch(必加参数) 从不询问用户输入,所有提问都默认使用 sqlmap 的默认选项(通常是 Y)。这是批量化脚本的灵魂。

批量加载目标的方式

sqlmap 提供了多种直接批量导入目标进行扫描的方式,无需手动逐一输入 -u

基于文件列表扫描 (-m)

如果你已经通过其他信息收集工具(如 fofa、xray、爬虫等)收集了一批可能存在注入的 URL,可以将其存放在一个文本文件中(每行一个 URL)。

  • 命令sqlmap -m urls.txt --batch

  • 适用场景:已有明确的目标清单,进行统一验证。

基于 Google Dorks 自动扫描 (-g)

利用 Google 搜索引擎语法,sqlmap 可以自动搜索匹配的 URL 并逐个进行测试。

  • 命令sqlmap -g "inurl:\".php?id=1\"" --batch
  • 适用场景:漫无目的的漏洞挖掘或特定 CMS 的批量漏洞验证。(注意:国内网络环境需配置代理或挂载全局梯子)

基于请求日志扫描 (-l)

可以导入 Burp Suite 或 WebScarab 等代理工具导出的 HTTP 请求日志文件,sqlmap 会解析日志中的所有请求并进行批量测试。

  • 命令sqlmap -l burp_history.log --batch
  • 适用场景:日常渗透测试中,将浏览过的所有网站流量直接交给 sqlmap 后台批量验证。

站点级别的自动化与深度发现

有时候你的目标是一个主域名,你想让 sqlmap 自动在这个站点内寻找注入点,而不是只测你给的单一 URL。

  • --crawl=<深度>:自动爬取目标网站内的链接并进行测试。通常深度设置为 2-3。
  • --forms:自动解析目标页面中的表单(如登录框、搜索框),并对表单参数进行注入测试。
  • 综合命令sqlmap -u "http://example.com" --crawl=2 --forms --batch

批量化性能与效率优化(提速关键)

批量扫描最怕的就是速度慢和被封禁。以下参数可以显著提升批量化扫描的效率:

  • --smart(强烈推荐) 智能模式。开启后,sqlmap 只有在启发式扫描中发现 URL 存在明显注入特征时,才会进行深度测试。这能为你节省大量时间,过滤掉 90% 毫无意义的静态页面测试。
  • --threads=<最大10>:设置最大并发线程数。默认为 1,批量时可调高至 5-10,加快发包速度。
  • --timeout=<秒>:设置超时时间,遇到死链直接跳过,防止程序卡死(例如 --timeout=10)。
  • --random-agent:使用随机的 User-Agent,降低被基础 WAF 拦截或封 IP 的概率。
  • --delay=<秒>:如果目标站点有限速,可设置每次请求间的延迟,防止因频率过高被封。

命令示例

场景:你有一个包含 500 个 URL 的文件 targets.txt,需要最高效地筛选出存在注入的站点。

sqlmap -m targets.txt --batch --smart --random-agent --threads 5 --timeout 10

使用 Sqlmap API (sqlmapapi.py)

对于需要将 sqlmap 深度集成到自己的自动化扫描平台(或 Python 脚本)中的高阶玩家,直接调用命令行效率较低且不好解析结果。

sqlmap 官方提供了一个轻量级的 RESTful API 服务端:

  1. 开启服务python sqlmapapi.py -s -H 127.0.0.1 -p 8775
  2. 调用流程:通过 Python 的 requests 库向 http://127.0.0.1:8775 发送 JSON 请求:
    • 创建任务 (/task/new)
    • 设置扫描参数 (/option/<taskid>/set)
    • 启动扫描 (/scan/<taskid>/start)
    • 轮询获取结果 (/scan/<taskid>/data)

HTTP 绕过与伪造

在批量注入或单点深挖时,默认的请求往往会被防火墙拦截或因为没有登录凭证而失败。以下参数用于深度定制你的发包行为:

精准控制测试范围(省时间利器)

当一个 URL 有多个参数,但你明确知道哪些不用测、哪些必须测时使用:

  • -p指定要扫描的具体参数。
    • 示例sqlmap -u "http://xxx/?user=a&id=1" -p "id" (只测 id 参数)
  • --skip排除指定的参数不扫描。
    • 示例sqlmap -u "http://xxx/?user=a&id=1" --skip "user"
  • --param-del改变参数分隔符。有些奇葩网站不用 & 传参,可能用分号 ;
    • 示例sqlmap -u "http://xxx/?id=1;user=a" --param-del=";"

测试后台接口或需要登录的页面时必用:

  • --cookie:带上你的身份凭证进行扫描。
    • 示例sqlmap -u "http://xxx" --cookie="PHPSESSID=123456; security=low"
  • --drop-set-cookie(极重要) 忽略服务器返回的 Set-Cookie 头。有些网站只要发包就会重置你的 Cookie 导致掉线,加上这个参数强制只用你提供的 Cookie。

3. 头部伪造 (Bypass 基础防御)

针对基于 Header 头部的注入,或者伪装正常用户的行为:

  • --user-agent:手动指定浏览器标识。
  • --random-agent(强烈建议常驻) 随机使用自带的常见浏览器标识,防止被基于 UA 的 WAF 规则秒封。
  • --host / --referer:测试 Host 头注入或 Referer 头注入,也可以用来绕过部分防盗链机制。
  • --headers:万能头部添加。当你需要添加自定义的 Header 时使用。
    • 示例sqlmap -u "http://xxx" --headers="X-Forwarded-For: 127.0.0.1\nToken: abc" (注意用 \n 换行)

4. 请求方法与底层行为

  • --data:把请求强制转为 POST,并指定 POST 请求体的数据。(注:你截图里误写成了 --date)
    • 示例sqlmap -u "http://xxx/login" --data="user=admin&pass=123"
  • --method:强制指定请求方式(如 PUT、DELETE 等)。
    • 示例sqlmap -u "http://xxx" --method=PUT
  • --force-ssl:当目标是 HTTPS,但由于端口非标准(比如 8443)导致 sqlmap 无法自动识别时,强制使用 HTTPS 连接。