米斯特白帽培训讲义 漏洞篇 SSRF
讲师:gh0stkey
整理:飞龙
很多 Web 应用都提供了从其他服务器上获取数据的功能。使用用户指定的 URL,web 应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的 Web 应用作为代理,攻击远程和本地服务器。这种形式的攻击成为服务器请求伪造(SSRF)。
原理
$url = @$_GET['url'];
if($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$co = curl_exec($ch);
curl_close($ch);
echo $co;
}
这段代码从 URL 中读取url
参数,之后访问url
参数所指向的 URL 资源,最后把资源显示在页面上。(当然这个代码有些简陋了,不是真正的代理,有些资源可能处理不好。)
我们将其保存为ssrf.php
并部署。之后我们访问localhost/ssrf.php?url=http://www.baidu.com
:
可以看到显示正常。这个漏洞还可以用于访问本地的图片,我们再访问file:///C:/Windows/win.ini
:
页面上是乱的,但是我们查看源代码,也可以正常显示。
利用
可以对服务器所在内网以及本地进行端口扫描,获取服务的指纹信息。指纹识别通过访问默认文件来实现:
这张图中,我们访问了10.50.33.43
的 Tomcat 服务的默认文件。10.50.33.43
是内网,我们直接访问是访问不了的,但是通过 SSRF 就可以。并且,我们通过访问 Tomcat 的默认文件确定了这台机子上部署了 Tomcat 服务。
确定了所部署的服务之后,我们就可以有针对性的攻击内网部署的应用。比如 ST2 和 SQL 注入这种通过 GET 方法实施的攻击。
我们还可以利用该漏洞读取服务器中的配置文件,比如上面的win.ini
。
挖掘
以下业务场景容易出现这种漏洞:
应用从用户指定的 URL 获取图片,然后把它用一个随机名称保存在硬盘上,并展示给用户:
应用获取用户指定 URL 的数据(文件或者 HTML)。这个函数会使用 socket 和 服务器建立 TCP 连接,传输原始数据。
应用根据用户提供的 URL,抓取用户的 Web 站点,并且自动生成移动 Wap 站。
应用提供测速功能,能够根据用户提供的 URL,访问目标站点,以获取其在对应经纬度的访问速度。
Web 功能
我们从上面的概述可以看出,SSRF 是由于服务端获取其它服务器的相关信息的功能中形成的,因此我们可以列举几种在 Web 应用中,常见的从服务端获取其它服务端信息的功能。
1)分享:通过 URL 分享网页内容
早期分享应用,为了更好地提供用户体验,WEB 应用在分享功能汇总,通过会获取目标 URL 地址网页内容中的