必须先用repeater手动验证基础注入点,通过'、"、)等最简payload探测响应差异,再结合xia_sql插件进行四维差异化分析,而非盲目使用intruder扫描。

直接判断:别用Intruder硬扫,先让Repeater确认基础注入点
绝大多数人一上来就开Intruder跑字典,结果不是被WAF拦截就是误报一堆。真正高效的SQL注入探测,必须从Repeater里手动验证开始——这是你判断目标是否“可注入”的第一道门槛。
常见错误现象:id=1 返回正常页面,id=1' 直接500或空白,但id=1'-- 又恢复正常,这说明后端SQL拼接未过滤单引号,且注释生效;如果id=1 AND 1=1 和 id=1 AND 1=2 响应内容有差异(比如一个返回数据、一个空列表),那就是典型的布尔盲注特征。
- 优先测试位置:URL路径参数、
POST表单字段、Cookie中的sessionid或user_token、JSON body里的id或filter字段 - 不要跳过响应头:留意
Content-Length是否随Payload变化而稳定差异,比肉眼判断页面内容更可靠 - 避免触发WAF:第一次测试只用最简Payload,如
'、"、)、1' OR '1'='1,别一上来就上UNION SELECT
用xia_sql插件做差异化响应分析,而不是靠肉眼比对
人工对比几十次响应太容易漏掉细微差异,比如Content-Length差1个字节、响应时间多出87ms、或者某个隐藏字段值悄悄变了。xia_sql插件的核心价值,就是把这种“肉眼不可见的异常”变成高亮标记。
它不是简单发包,而是基于Baseline请求做四维比对:状态码、响应体哈希、响应时间、关键词命中(如mysql_fetch、ORA-)。V1.9+版本还支持自定义“相似度阈值”,对前端渲染框架(如Vue/React)导致的DOM结构抖动更鲁棒。
- 必须先在Repeater中右键发送一次原始请求,作为Baseline,否则插件无法计算差异
- 插件默认Payload集针对MySQL/MSSQL做了区分,但若目标是PostgreSQL,需手动勾选
pg_sleep()类时间盲注Payload - 遇到CDN或反向代理缓存时,响应时间维度会失效,此时要关闭
Time-based detection,专注状态码和内容哈希
绕过WAF的关键:Payload变形不是堆长度,而是改语义
很多新手以为加/**/或%00就能绕WAF,结果被规则库精准拦截。真正有效的变形,是让Payload在数据库层面执行逻辑不变,但在WAF规则视角下“不像攻击”。
比如SELECT被拦截,可以换成SEL/**/ECT(MySQL支持)、SELE%00CT(部分旧版IIS解析漏洞)、或用CHAR(83)+CHAR(69)+CHAR(76)+CHAR(69)+CHAR(67)+CHAR(84)拼接(MSSQL)——重点是让WAF的正则引擎无法匹配到完整关键字,而非单纯增加字符数。
- 在Intruder的Payloads标签页,用
Character substitution类型替换SELECT为SEL\x00ECT,比用Numbers类型暴力枚举更高效 - 若WAF检测
UNION,可尝试UNIunionON(利用MySQL注释特性)或UN/**/ION,但注意Oracle不支持/**/ - 时间盲注慎用
SLEEP():MySQL 5.7+默认禁用,改用BENCHMARK(1000000,MD5(1))更稳妥
为什么sqlmap常卡在“not injectable”?因为没喂对上下文
sqlmap报[CRITICAL] all tested parameters do not appear to be injectable,往往不是没漏洞,而是你给它的请求缺乏关键上下文——比如没带登录态Cookie、没设置Referer、或没还原原始Accept头。Burp Suite导出的.http文件直接丢给sqlmap,成功率远高于手工构造curl命令。
真实案例:某后台接口要求Content-Type: application/json且必须携带X-Requested-With: XMLHttpRequest,sqlmap默认不带这两个头,自然探测失败。
- 导出请求务必选
Copy as curl command或Save item生成.http文件,别手敲 - 若目标有Token校验,在sqlmap命令里加
--header="Authorization: Bearer xxx",而不是指望它自动提取 - 遇到JSON参数,用
-r request.http -p "data.id"指定具体字段,避免sqlmap误判整个body为一个参数
UNION SELECT;一个sqlmap跑不出结果,也不代表没漏洞。真正需要你花时间的,是看响应差异背后的数据库行为——是报错回显?还是布尔逻辑可控?或是时间延迟稳定?这些判断没法自动化,得你盯着Repeater里那几行HTTP头和Body,一帧一帧地读。











