云服务器上挂着雷池(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,boundary 里还能塞注释干扰
3. 语义级的对抗(对雷池这类)
- 数据库特性差异:WAF 按标准 SQL 解析,后端 MySQL 方言(如
/*!50000select*/版本注释)可能解析分歧 - 性能阈值:超长 payload / 深层嵌套可能让 WAF 超时放行
- 业务白名单:JSON 接口、文件上传接口常被放宽检测
结论:雷池拦常见变形很准,但解析差异类仍有口子——攻击就是找两边解析不一样的地方。
木马免杀思路
免杀核心是破坏特征匹配,分层做:
| 层 | 手法 |
|---|---|
| 语法层 | 变量拆分、异或加密、字符串变形($a = 'ev'.'al') |
| 结构层 | 函数回调执行(call_user_func)、匿名类、断言 |
| 流量层 | 冰蝎/哥斯拉加密通信(流量无特征) |
| 落地层 | 内存马(不落盘,见 Java 反序列化那篇) |
检测与反检测是螺旋:特征码杀软吃语法层,行为分析吃结构层,实战要多层组合。
防守侧的观察(自己当蓝队)
挂了几个月蜜罐和 WAF,几个观察:
- 扫描器流量极其明显:sqlmap 的 UA、目录爆破的频率特征,雷池日志一抓一个准
- 蜜罐命中率最高的是 SSH 爆破和 Web 弱口令,每天稳定有”客人”
- 真实攻击者会踩点:先一个无害 GET 看响应,隔几小时再回来打——低频慢扫是趋势
对攻击侧的启发:流量卫生和速率控制比 payload 花活更重要。
小结
WAF 绕过的本质是解析差异,免杀的本质是特征对抗;看防守日志能校准攻击手法,自己的服务器就是最好的实验室。