什么是XXE漏洞?(原理+实战+防御)
什么是XXE简单来说XXE漏洞是攻击者利用Web应用程序对XML数据的解析缺陷通过构造恶意的XML数据让服务器执行非预期的操作。这些操作可能包括读取服务器上的敏感文件如配置文件、密码文件。探测内网端口和服务。发起拒绝服务攻击DoS。 前置知识XML与“实体”要理解XXE我们需要先了解两个概念XML和实体。. XML是什么XML可扩展标记语言是一种用来存储和传输数据的格式类似于JSON。比如一个正常的用户登录请求可能是这样的xml编辑?xml version1.0 encodingUTF-8? user usernameadmin/username password123456/password /user. 什么是“实体”在XML的设计规范DTD中允许定义“实体”。你可以把它理解为变量或占位符。比如我们可以定义一个内部实体xml编辑!DOCTYPE note [ !ENTITY company MySecureCorp ] note messageWelcome to company;/message /note当解析器读到 company; 时它会自动替换成 MySecureCorp。这本身是个很方便的功能。 漏洞原理当“实体”指向了外部文件问题的关键在于XML不仅允许定义内部实体还允许定义外部实体。也就是说这个“变量”的值可以来自一个文件或者一个网址。如果服务器端的XML解析器没有禁用外部实体加载功能攻击者就可以构造如下恶意代码xml编辑?xml version1.0 encodingUTF-8? !DOCTYPE data [ !-- 定义一个外部实体名字叫 xxe指向本地文件 -- !ENTITY xxe SYSTEM file:///etc/passwd ] root !-- 引用这个实体 -- usernamexxe;/username /root发生了什么攻击者发送了这段XML。服务器解析器读到 !ENTITY xxe SYSTEM ...它很“听话”地去读取了服务器本地的 /etc/passwd 文件。解析器读到 usernamexxe;/username它把 xxe; 替换成了刚才读到的文件内容。最终服务器把包含敏感文件内容的响应返回给了攻击者。 XXE能造成什么危害重点XXE不仅仅是读个文件那么简单它的危害主要体现在以下几个方面读取敏感文件这是最常见的利用方式。攻击者可以读取 /etc/passwd、C:\Windows\win.ini、数据库配置文件、源代码等。探测内网SSRF攻击者可以将实体指向内网地址如 http://192.168.1.1:8080利用服务器作为跳板去扫描内网端口。拒绝服务攻击通过构造“实体爆炸”Billion Laughs Attack让解析器陷入无限递归耗尽服务器内存导致服务瘫痪。远程代码执行在某些特定环境下甚至可以控制服务器。 实战常见的XXE Payload如果你在渗透测试中遇到了XML接口可以尝试以下几种Payload来检测漏洞1. 基础文件读取Linuxxml编辑?xml version1.0? !DOCTYPE foo [ !ENTITY xxe SYSTEM file:///etc/passwd] fooxxe;/foo2.基础文件读取Windowsxml编辑?xml version1.0? !DOCTYPE foo [ !ENTITY xxe SYSTEM file:///c:/windows/win.ini] fooxxe;/foo3. 探测内网端口SSRFxml编辑?xml version1.0? !DOCTYPE foo [ !ENTITY xxe SYSTEM http://127.0.0.1:8080] fooxxe;/foo️ 如何防御对于开发者来说防御XXE其实非常简单核心原则就是不要相信用户的输入并禁用不需要的功能。核心防御方案在代码中配置XML解析器禁用外部实体加载。Java (DOM解析器):java编辑DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance(); dbf.setFeature(http://apache.org/xml/features/disallow-doctype-decl, true);PHP:php编辑libxml_disable_entity_loader(true);Python (lxml):python编辑parser etree.XMLParser(resolve_entitiesFalse) 总结XXE漏洞虽然听起来专业但本质上是利用了XML解析器的“过度信任”。作为安全从业者我们在测试时要多留意 Content-Type: application/xml 的请求作为开发者务必在初始化解析器时关闭外部实体功能从根源上堵住漏洞。