| name | sqlmap-validation |
| description | 用于在授权目标上使用 sqlmap 验证疑似 SQL 注入。适合用户提供 URL、参数、原始 HTTP 请求、Nuclei 发现或手工测试线索时使用。默认采用低风险低强度参数,优先证明问题存在,不默认导出数据或执行系统命令。 |
SQL 注入验证
这份技能提供使用 sqlmap 验证 SQL 注入线索时的判断方法和影响控制知识。命令示例是常见起点,应结合请求语义、授权范围和已有证据调整。
目标
用 sqlmap 验证疑似 SQL 注入,同时避免不必要的数据读取、状态改变和高请求量。
适用输入
- 疑似存在 SQL 注入的 URL。
- 指定参数,例如
id、q、page。
- 原始 HTTP 请求。
- Burp 保存的 request。
- Nuclei、手工测试或日志中的 SQL 注入线索。
- 带 Cookie/Header 的认证请求。
开始前先判断
确认:
- 目标是否授权。
- 哪个参数可测。
- 是否允许携带登录态。
- 是否只需证明漏洞存在。
- 是否允许读取数据库名称、当前用户。
- 是否允许更深入的数据枚举。
- 请求速率是否有限制。
如果当前目标只是确认问题是否存在,低风险验证通常已经足够;读取业务数据或扩大影响需要额外的验证理由和授权。
一种低影响验证路径
这条路径适合从弱线索开始逐步提高可信度。若已有可靠手工证据,可以直接聚焦指定参数;若请求会改变业务状态,应先寻找更安全的替代证明方式。
保存可复现请求
mkdir -p sqli/{input,raw,final,notes}
优先把原始请求保存为:
sqli/input/request.txt
如果只有 URL:
cat > sqli/input/target.txt <<'EOF'
https://example.com/item?id=1
EOF
理解请求语义和影响
对原始请求先人工看:
- 请求方法。
- 参数位置:query、body、JSON、Cookie、Header。
- 是否有 CSRF token。
- 是否有一次性参数。
- 是否会执行状态变更,例如购买、删除、提交订单。
如果是状态变更请求,先理解重复请求的业务影响,再判断能否安全使用 sqlmap,或是否应改用人工最小化验证。
从低风险参数开始探测
原始请求输入:
sqlmap -r sqli/input/request.txt \
--batch \
--level=1 \
--risk=1 \
--threads=1 \
--smart \
--flush-session \
--output-dir=sqli/raw
URL 输入:
sqlmap -u "$(cat sqli/input/target.txt)" \
--batch \
--level=1 \
--risk=1 \
--threads=1 \
--smart \
--output-dir=sqli/raw
聚焦已知参数
如果知道参数名:
sqlmap -r sqli/input/request.txt \
-p id \
--batch \
--level=1 \
--risk=1 \
--threads=1 \
--output-dir=sqli/raw
用最小额外信息增强证据
在确认存在注入后,可以只取低敏感上下文:
sqlmap -r sqli/input/request.txt \
--batch \
--level=1 \
--risk=1 \
--current-user \
--current-db \
--hostname \
--threads=1 \
--output-dir=sqli/raw
判断线索是否成立
从输出中提取:
- 是否 vulnerable。
- DBMS 类型。
- 注入参数。
- 注入技术:boolean、time、error、union、stacked。
- 证明用的 payload 或响应差异。
- 是否存在超时、WAF、误报迹象。
工具使用要点
原始请求模式
最推荐:
sqlmap -r request.txt --batch --level=1 --risk=1
优点:
- 保留 Method、Header、Cookie、Body。
- 更适合认证场景。
- 复现性更好。
URL 模式
适合简单 GET 参数:
sqlmap -u "https://example.com/item?id=1" --batch --level=1 --risk=1
指定参数
sqlmap -r request.txt -p id --batch --level=1 --risk=1
JSON 请求
如果原始请求是 JSON,仍然优先用 -r request.txt。必要时可以指定参数或让 sqlmap 自动识别。
常用参数
--batch:非交互。
--level:测试深度,默认 1。
--risk:测试风险,默认 1。
--threads:线程,默认 1。
-p:指定参数。
--current-user:当前数据库用户。
--current-db:当前数据库。
--hostname:数据库主机名。
--flush-session:清理历史缓存。
高影响参数及使用前提
以下能力会读取数据、写入文件、执行命令或显著放大请求量。使用前需要明确它们对当前验证是否必要,并确认授权和影响范围:
--dump
--dump-all
--os-shell
--os-pwn
--file-read
--file-write
--sql-shell
--risk=3
--level=5
高线程数
未理解影响的 tamper 脚本
失败和降级
如果没有结果:
- 确认参数是否真的参与后端查询。
- 确认请求是否需要 Cookie 或 CSRF token。
- 检查是否被 WAF 拦截。
- 尝试指定参数
-p。
- 降低请求频率。
- 不要盲目提高
risk 和 level。
值得保留的证据
- 可复现的原始请求、实际测试参数和必要认证上下文。
- 识别到的 DBMS、注入技术、稳定响应差异或时间特征。
- 能证明问题存在的最小 payload 或工具证据。
- WAF、网络抖动、一次性参数、状态变更风险和未执行动作。
证据应帮助区分“参数看起来可疑”“sqlmap 给出弱信号”和“注入已经可靠确认”。
判断与复核要点
- 如果仅需证明问题存在,通常无需读取业务表。
- 执行系统命令和写文件属于不同影响层级,不能仅因注入已确认就自动继续。
- 对时间盲注要说明误报可能和网络抖动影响。