基础系列只提了一句绕过,WAF 绕过笔记是从防守方视角写的。这篇按课堂顺序整理注入侧的绕过分类学——先分清”哪些绕过已经死了”,再学”为什么还活着的那些能活”。
0x01 五类基础绕过速查(面试必备,实战多已失效)
| 被过滤 | 等价替换 |
|---|---|
| 空格 | /**/ 注释、%0a %0b %09(换行/制表)、括号包裹 |
| 引号 | 十六进制字面量(0x61646D696E 代替 'admin') |
| 逗号 | JOIN 替代 UNION SELECT;substr(str FROM 1 FOR 1) 替代 substr(str,1,1);LIMIT 1 OFFSET 0 替代 LIMIT 0,1 |
| 大小写 | Or/oR/And 变形;关系运算符 > < = 替代 AND/OR 逻辑 |
| 函数名 | substr → MID/LEFT/RIGHT;同类功能函数替换 |
双写绕过针对”replace 删除式过滤”:过滤 and 时输入 anandd,删除中间的 and 剩下 and;过滤 on 时 iinformationn_schema 同理。适用前提是单轮 replace 无循环。
课上把边界说得直接:这五类在 Fly Lab 21-30 关练完就该放下——现代 WAF 面前基本全失效,但面试仍会问,因为它们考察的是”你知不知道过滤发生在哪一层”。
0x02 还活着的手法
内联注释与正则回溯
MySQL 方言 /*!50000and*/ 内联注释在部分拦截规则下可过;更有通用性的是正则回溯(上次反序列化篇讲过的机制在注入上的应用):WAF/后端用 preg_match 检测时,垫百万级字符耗尽 pcre.backtrack_limit,检测函数返回 false 被当成”未匹配”——真实案例里正是靠它过了拦截拿到管理员数据。
十六进制子查询
引号被拦时,把整个子查询结果以十六进制传递再 unhex 还原,绕开对引号内容的全量检测。
为什么”塞垃圾字符撑爆长度限制”不现实
有人建议在注入语句前塞几万字符指望 WAF 因长度限制放行后半段。课堂判断很明确:专业 WAF 处理几万字符无压力,这条路对现代产品无效——但对自己写的简陋过滤脚本(strlen 判断那种)有时真能过,知道即可,别当主力。
0x03 雷池与长亭系 WAF 的绕过策略
课堂用雷池旧版本做了复现,策略层总结三条:
- 找解析差异而非规则漏洞:WAF 和后端对同一 payload 的解码不一致(URL 二次编码、分块传输、参数污染
?id=1&id=2)才是高价值点,“变形关键词”是低价值点; - 检测引擎的资源模型:正则引擎有回溯上限、静态引擎靠关键词匹配——上一条的正则回溯就是打资源模型;
- 绕不开就走别的口:WAF 拦 GET 注入点就转 POST 注入点;主站拦截就找不做防护的子域/内部系统——实战案例里”主站 412 拦截→换突破面”是标准操作。
雷池的部署和拦截分析我之前写过:云服务器部署雷池 WAF + HFish,两边对照着看,攻防视角就闭环了。
0x04 面试视角
- WAF 绕过是面试高频题,且面试官常借此判断实战深度;答基础五类说明”知道”,答回溯/解析差异说明”打过”;
- 类似的”反常识”题还有:“SSL 绕过”是个伪命题(TLS 算法本身不可破,能绕的只是实现层校验)——不懂加密体系的人才会这么问/答;
- 回答套路建议:先问清楚拦的是”什么产品哪一层”(网络层 WAF?应用层正则?主机 HIDS?),再按层给方案,比背 payload 清单显得专业。