sqlmap基础扫描需提供完整可访问的带参URL(如http://test.com/page.php?id=1),参数须参与SQL查询且经URL编码;用--technique=U加速验证,--dbms指定正确数据库类型,--tamper优先试space2comment与randomcase绕WAF。

sqlmap 怎么跑通第一个基础扫描
没配好环境或参数错一个,sqlmap 就卡在“target URL not specified”或者直接报 invalid URL format。它不自动猜路径、不补协议头,必须给完整可访问的带参数 URL。
- 确保目标 URL 能被你本地浏览器打开,且参数是真实参与数据库查询的(比如
?id=1、?name=test) - 用
-u参数传 URL,协议不能省:sqlmap -u "http://test.com/page.php?id=1" - 如果参数值含特殊字符(如空格、&),要先 URL 编码,否则
sqlmap会截断;?q=hello world得写成?q=hello%20world - 遇到 302 跳转或 WAF 拦截,先加
--batch跳过交互,再加--level=3 --risk=1控制探测强度,避免触发封禁
怎么判断当前 URL 真的可注入
sqlmap 默认只测 GET 参数,且默认不跑 ORDER BY 或 UNION 类高风险 payload——它得先确认“这个参数确实进 SQL 语句”,否则直接跳过后续。
- 加
--technique=U强制试UNION注入,比默认的布尔盲注快得多,也更容易验证回显是否可控 - 如果返回 “no injection points detected”,先手动访问
?id=1'看是否报错(如MySQL syntax error),再试?id=1 AND 1=1和?id=1 AND 1=2观察页面差异 -
--dbms=mysql这类指定库类型参数不是可选的“优化项”,而是影响 payload 构造逻辑的关键开关;错设会导致漏检(比如目标是 PostgreSQL 却设成 mysql)
绕过简单 WAF 的实用参数组合
很多测试环境开着云 WAF 或 ModSecurity,默认规则会拦 UNION SELECT、AND、OR 等关键词,但 sqlmap 内置的 tamper 脚本不是全都能用,乱堆容易失效。
- 优先试
--tamper="space2comment,randomcase":把空格变/**/,大小写混用,覆盖大多数基于正则的关键词拦截 - 别一上来就堆 5 个 tamper,
sqlmap会组合爆炸,响应超时或返回空结果;先单个验证,再叠加 - 如果目标用 Nginx + lua-resty-waf,
--delay=1比 tamper 更管用——它靠频率限流,不是内容过滤 - 注意
--proxy=http://127.0.0.1:8080配 Burp 时,得关掉 Burp 的“Intercept is on”,否则所有请求卡住不动
导出数据时为什么总卡在“fetching entries”
不是网络慢,大概率是目标字段太多、行数太大,或数据库权限不够导致 sqlmap 反复重试失败。
- 用
--dump -T users -D testdb前,先--tables确认表名大小写——MySQL 默认小写,但某些配置下表名区分大小写,USERS和users是两张表 - 如果卡住,加
--start=100 --stop=200分段拉,比默认从头扫更稳;配合--threads=3控制并发,避免被 reset - 导出报
unable to retrieve the table's columns?说明没权限查INFORMATION_SCHEMA,换--columns -T users手动指定字段名试试
真正麻烦的从来不是命令怎么敲,而是你不知道目标到底用了什么中间件、开了哪层过滤、数据库用户权限卡在哪一级——这些没法靠参数堆出来,得看响应细节里藏的那半行错误提示。










