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 服务端:
- 开启服务:
python sqlmapapi.py -s -H 127.0.0.1 -p 8775 - 调用流程:通过 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 操作)
测试后台接口或需要登录的页面时必用:
--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 连接。