sqlmap需显式指定输入位置才能准确识别注入点:GET用-u,POST用--data或-r,Cookie需--cookie并设--level 3,Header字段须--user-agent配合-p,且必须加--batch和--level 3以覆盖全部参数并避免交互中断。

sqlmap 能自动发现大多数 SQL 注入点,但前提是你要给它可识别的输入位置和足够权限的请求环境;盲目跑 sqlmap -u "url" 很可能漏掉关键注入点,或被 WAF 直接拦截。
怎么让 sqlmap 正确识别注入点
sqlmap 不是靠猜 URL 路径,而是靠分析「参数行为」——它需要明确知道哪个字段参与了 SQL 拼接。如果目标用 POST 提交、带 Cookie 登录态、或从 HTTP 头取值,不显式告诉 sqlmap,它默认只测 URL 查询参数。
- GET 参数直接用
-u:比如sqlmap -u "http://x.com/page?id=1",它会自动测试id参数 - POST 数据必须用
--data或-r:抓包保存为req.txt后运行sqlmap -r req.txt,否则 sqlmap 完全不知道 body 里有什么 - Cookie 注入要加
--cookie或--cookie-file,且建议配合--level 3(默认只测 level 1,不扫 Cookie) - User-Agent/Referer 这类头字段注入,得用
--user-agent+-p "user-agent"显式指定,不然不会碰
为什么加 --batch 和 --level 3 很关键
不加 --batch,sqlmap 遇到每个检测分支都会停住问你“继续吗?Y/N”,一晚上都跑不完;--level 决定它探测多深——level 1 只测 URL 参数,level 3 才覆盖 Cookie、Header、POST body 里的所有字段。
-
--batch是自动化前提,避免交互中断流程 -
--level 3和--risk 2是平衡点:level 5 太暴力容易触发 WAF,risk 3 会发堆叠注入(可能写文件),日常检测用 risk 2 更稳 - 若目标有登录态,务必带上完整 Cookie,否则 sqlmap 测的是未授权页面,结果无效
常见失败原因和绕过思路
sqlmap 报 “no injection detected” 不代表没漏洞,常因响应不明显或 WAF 干扰。重点看它是否真发出了 payload,而不是只信最终结论。
- 响应时间差异小?加
--time-sec 5让时间盲注更敏感 - 页面返回乱码或 403?先试
--random-agent换 UA,再加--tamper "space2comment"绕简单 WAF - 报错注入被过滤?用
--technique="E"强制只走报错型,避免 sqlmap 自动切布尔型导致误判 - 连基础请求都超时?检查代理设置(
--proxy "http://127.0.0.1:8080")或加--timeout 30
导出数据前必须确认的两件事
执行 --dump 前,sqlmap 其实已经做过指纹识别和表结构探测,但这两步容易被跳过——尤其当目标响应不稳定时,它可能直接报错退出,而不告诉你数据库名或表名是什么。
- 先跑
--current-db确认当前库名,再用-D "dbname" --tables列表,别直接--dump - 如果
--tables返回空,不是没表,可能是权限不够或表名被过滤,试试--search -T "%user%"模糊搜 -
--dump默认只导前几行,加--limit 1000或--start 100才能控范围,避免卡死
真正难的从来不是命令怎么敲,而是判断哪次响应变化算有效、哪类 WAF 规则该用什么 tamper 绕过、以及什么时候该停下来手工验证——这些没法靠参数自动解决。


















