我的云服务器上挂着雷池(SafeLine)WAF 和 HFish 蜜罐,这让我有个独特的便利:同一个 payload,我能同时看到攻击侧的样子和防守侧的拦截日志。这篇从 WAF 原理讲起,到绕过手法、木马免杀,最后是我自己的攻防滑一体观察。
WAF 在干什么
主流 WAF 的核心是规则匹配 + 语义分析:
- 规则匹配:特征库(正则)黑名单,看到
union select就拦。弱点是容易被变形绕过。 - 语义分析(雷池走这条路线):把 payload 还原成 SQL/代码再判断意图,抗变形能力强很多——这也是我选雷池挂自己服务器的原因。
- 拦截位置:反向代理串在流量必经之路上(我的链路:公网 → SafeLine → 后端 nginx)。
常见绕过手法(按我的实测有效性排序)
1. 编码与混淆(对规则型有效)
大小写混合: UnIoN SeLeCt
双重编码: %2527(%27 再编一次)
内联注释: /*!union*/ /*!select*/
等价替换: && → %26%26,空格 → /**/、%a0、括号
2. 协议层与解析差异
- HTTP 参数污染:
?id=1&id=2' union select...——WAF 看第一个,后端取最后一个(PHP/Apache 行为) - 分块传输:
Transfer-Encoding: chunked把 payload 切碎,老 WAF 拼不回来 - Content-Type 切换:
application/x-www-form-urlencoded↔multipart/form-data, multipart 的 boundary 里还能塞注释干扰
3. 语义级的对抗(对雷池这类)
语义 WAF 不吃变形,但有别的口子:
- 数据库特性差异:WAF 按标准 SQL 解析,后端 MySQL 的方言(如
/*!50000select*/版本注释)可能解析分歧 - 性能阈值:超长 payload / 深层嵌套可能让 WAF 超时放行
- 业务白名单:JSON 接口、文件上传接口常被放宽检测
我的实测结论:雷池对常见变形拦截率很高,但解析差异类仍有口子——攻永远是”找两边解析不一样的地方”。
木马免杀思路
免杀的核心是破坏特征匹配,分层做:
| 层 | 手法 |
|---|---|
| 语法层 | 变量拆分、异或加密、字符串变形($a = 'ev'.'al') |
| 结构层 | 函数回调执行(call_user_func)、匿名类、断言 |
| 流量层 | 冰蝎/哥斯拉加密通信(流量无特征) |
| 落地层 | 内存马(不落盘,见 Java 反序列化那篇) |
检测与反检测是螺旋:特征码杀软吃语法层,行为分析吃结构层,所以真到实战要多层组合。
防守侧的观察(自己当蓝队)
挂蜜罐和 WAF 几个月,几个印象深刻的观察:
- 扫描器流量极其明显:sqlmap 的 UA、目录爆破的频率特征,雷池日志里一抓一个准
- 蜜罐命中率最高的是 SSH 爆破和 Web 弱口令,每天稳定有”客人”
- 真实攻击者会踩点:先一个无害 GET 看响应,隔几小时再回来打——低频慢扫是趋势
这给我做攻击侧时的启发:流量卫生和速率控制比 payload 花活更重要。
小结
WAF 绕过的本质是解析差异,免杀的本质是特征对抗。两边都玩过的最大收获是:看防守日志能反过来校准攻击手法,自己的服务器就是最好的实验室。