WAF 绕过笔记写过雷池侧对抗,这篇讲主机侧查杀引擎(安全狗/D 盒/HIDS)的免杀。
0x01 先懂检测:两类引擎的分工
静态引擎:不运行代码,匹配特征——完整高危函数名(eval/system/assert)、样本哈希、正则规则。对抗:让特征不完整。
动态引擎:沙箱里跑一遍,污点追踪用户可控数据($_GET['x'])流向危险函数(eval/system)的路径,流动即报警。对抗:切断污点链。
0x02 中断污点追踪的两种方式
- 语法报错(最彻底):在污点传播路径插一个致命语法错误(把
eval拼成evm),引擎执行到此处直接终止。难点是代码要过引擎侧语法检查、只在追踪侧报错; - 过滤函数”洗白”:污点源与危险函数间插一层处理(自定义过滤/编码转换),让追踪器以为数据已净化(污点可能仍被标记)。
配套技巧是全局变量多层递归:污点数据在 global 引用链上循环,追踪力度随深度衰减,几轮后跟丢。
0x03 沙箱与环境差异:检测端的天然裂缝
HIDS/沙箱精简运行环境,真实环境完整——差异即绕过点:
- 恶意分支依赖沙箱缺失的扩展/配置(如
error_reporting项):沙箱报错终止 → 判”无害”,真实环境正常执行; - 时间与随机数触发:仅凌晨 3 点执行、随机数命中才执行——沙箱短时快跑走不到恶意分支。
另有”高级接口盲区”:引擎不检查的功能(自定义 Session Handler 回调、生僻 SPL 接口)——“找它不看的地方下手更有效”。
0x04 具体手法清单
静态层绕过
- 关键词拆分/拼接:
$f='ev'.'al'; $f($_POST['x']); - 函数别名:
use function system as test;后test()可直接调用(PHP 5.3+),WAF 对别名识别薄弱;\system()(5.6+,全局命名空间)同理; - 数组拼接:
sys、tem分进数组再 join,用分隔符(逗号/大括号)干扰匹配; - 哈希碰撞对抗双重检测:先传无害
1.php让引擎记录”文件名+哈希”,再传碰撞改造后的恶意文件(内容变了但引擎按文件名+缓存哈希放行)。
动态层绕过
- Session Handler 动态写入:自定义
session handler把 payload 写进 session 存储路径(session_start()建文件失败会泄露路径),再由包含触发——落地的是”正常 session 文件”,检测面避开; - 上传落地兜底:Windows 下写文件被 HTML 实体转义/特殊字符截断时,先下载 txt 再
COPY改后缀为 php; - 命令执行选型:
assert在 PHP 7.3 不可用、5.6 崩溃——先探 PHP 版本,7.x+ 走system/反引号/array_map回调链。
落点选择
- C2/回调监听用 80 端口而非 9999 之类生僻端口——非常见端口检测严格得多;
- 数据回传放云服务器(阿里云等大厂域名)比自建 IP 可信度高。
0x05 一条原则收尾
免杀是对检测原理的理解竞赛——每个绕过先答三问:检测什么数据(静态特征/数据流)?在哪检测(传输/落盘/执行)?引擎与真实环境差在哪?