十七、服务端请求伪造
作者:Peter Yaworski
描述
服务端请求伪造,或者 SSRF,是一种类型,它允许攻击者使用目标服务器来代表攻击者自己执行 HTTP 请求。这和 CSRF 类似,因为两个漏洞都执行了 HTTP 请求,而不被受害者察觉。在 SSRF 中,受害者是漏洞服务器,在 CSRF 中,它是用户的浏览器。
这里的潜力非常大,包括:
- 信息暴露,其中我们欺骗服务器来暴露关于自身的信息,在示例 1 中使用 AWS EC2 元数据描述。
- XSS,如果我们让服务器渲染远程 HTML 文件,其中带有 JavaScript。
示例
1. ESEA SSRF 和 AWS 元数据请求
难度:中
URL:https://play.esea.net/global/media_preview.php?url=
报告链接:http://buer.haus/2016/04/18/esea-server-side-request-forgery-and-querying-aws-meta-data/
报告日期:2016.4.18
奖金:$1000
描述:
电子运动娱乐联盟 (ESEA) 是一个电子运动视频竞技比赛的社区,由 ESEA 建立。最近他们启动了一个漏洞奖励计划,Brett Buerhaus 在上面发现了一个不错的 SSRF 漏洞。
使用 Google Dorking,Brett 搜索site:https://play.esea.net/ ext:php
。这让 Google 在play.esea.net
域中搜索 PHP 文件。查询结果包括https://play.esea.net/global/media_preview.php?url=
。
看看这个 URL,似乎 ESEA 从外部站点渲染内容。在寻找 SSRF 的时候,这是一个危险标志。像他描述的那样,Brett 尝试它自己的域名:https://play.esea.net/global/media_preview.php?url=http://ziot.org
。但是没有作用,结果,ESEA 寻找图片文件,所以它尝试包含图片的载荷。首先使用 Google 作为域名,之后是它自己的,https://play.esea.net/global/media_preview.php?url=http://ziot.org/1.png
。
成功了。
现在,这里真实的漏洞是,欺骗服务器渲染其它内容,而不是预设的图片。在他的博文中,Brett 描述了通常的技巧,例如使用空字符(%00
),额外的斜杠以及问号来绕过或欺骗后端。在它的例子中,它向 URL 添加了?
:https://play.esea.net/global/media_preview.php?url=http://ziot.org/?1.png
。
它所做的就是将前面的文件路径,1.png
转换为参数,并且不是实际要渲染的 URL 的一部分。因此,ESEA 渲染了它的页面。换句话说,它绕过了第一个测试的额外检查。
现在,这里你可以尝试执行 XSS 载荷,像他描述的那样。只需创建一个带有 JavaScript 的简单 HTML 页面,让站点渲染它,就这么简单。但是它更进了一步。使用来自 Ben Sadeghipour 的输入(在我的 YouTUbe 频道和 Polyvore RCE 的 Hacking Pro Tips Interview #1 中提到过),它测试了 AWS EC2 实例元数据的查询。
EC2 是 Amazon 的弹性计算云。它们提供了查询自身的功能,通过它们的 IP,来拉取关于实例的元数据。权限很明显限制为实例自身,但是由于 Brett 能够控制服务器从哪里加载内容,它能够使其调用自身并拉取元数据。
EC2 的文档在这里:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2instance-metadata.html
。这里是一些你可以抓取的敏感信息。
重要结论
Google Dorking 是一个不错的工具,它能在发现所有类型的可能利用时,节省你的时间。如果你正在寻找 SSRF 漏洞,要留意任何在远程内容中拉取的目标 URL。这里,它的标志是
url=
。其次,不要仅限于你的第一想法。Brett 完全能够报告 XSS 载荷,但是这不太深入。通过深入挖掘,它就能发现漏洞的真正价值。但是这样做的时候,要小心不要越界。
总结
服务端请求伪造在服务器可悲利用来代表攻击者执行请求时出现。但是,并不是所有请求最终都能利用。例如,由于站点允许你提供图片的 URL,但它会复制并在自己站点上使用(就像上面的 ESEA 示例),并不意味站点存在漏洞。发现它们只是第一步,随后你需要确认它们的潜能。对于 ESEA,虽然站点寻找图片文件,它并不验证收到的东西,并且可以用于渲染恶意 XSS,以及对自己的 EC2 元数据执行 HTTP 请求。