简谈SSRF漏洞
一、SSRF漏洞定义
SSRF(Server-Side Request Forgery:服务请求伪造)是一种由攻击者构造请求,从而让服务端发起请求的一种安全漏洞。它将一个可以发起网络请求的服务当作跳板来攻击其他内部服务。SSRF的攻击目标一般是与外部隔离的内网资源。
二、SSRF漏洞原理
当服务端提供了从其他服务器获取数据的功能(如:从指定URL地址获取网页文本内容、加载指定地址的图片、下载等),但是没有对目标地址做过滤与限制时就会出现SSRF。
三、主要攻击方式
1、对外网、服务器所在内外、本地进行端口扫描,获取一些服务的banner信息
2、测试运行在内网或本地的应用程序
3、利用file协议读取本地文件等
4、对内网web应用进行指纹识别,识别企业内部的资产信息
5、攻击内外网的web应用,主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli)
四、SSRF漏洞利用
1、存在SSRF漏洞的简要代码
<?php
function curl($url){ //curl函数用来发送请求
$ch = curl_init(); //初始化curl
curl_setopt($ch,CURLOPT_URL,$url); //将参数URL代入
curl_setopt($ch,CURLOPT_HEADER,0);
curl_exec($ch); //执行请求该URL
curl_close($ch);
}
$url = $_GET['url']; //用户通过构造url来进行访问
curl($url);
?>
页面ssrf.php实现的功能是获取GET参数URL,然后将URL的内容返回网页上。当设置参数为URL为内网地址时,则会泄露内网信息。当访问.../ssrf.php?url=file: ///C: /Windows/win.ini即可读取本地文件。
2、php中可能存在SSRF漏洞的函数
1) file_get_content()
2) fsockopen()
3) curl_exec()
...
五、漏洞绕过
部分存在漏洞,或者可能产生SSRF的功能中做了白名单或者黑名单的处理,来达到阻止对内网服务和资源的攻击和访问。因此想要达到SSRF的攻击,需要对请求的参数地址做相关的绕过处理,常见的绕过方式如下:
1、限制请求IP不为内网地址
- 采用短网址绕过。比如百度短地址https://dwz.cn/
- 采用可以指向任意域名的xip.io。127.0.0.1.xip.io,可以解析为127.0.0.1
- 采用进制转换。127.0.0.1八进制:0177.0.0.1。十六进制:0x7f.0.0.1。十进制:2130706433
2、限制请求只为http协议
利用 https://tinyurl.com 生成302跳转地址。
六、漏洞修复
1、屏蔽返回的详细信息。例如请求文件时,只返回文件是否请求成功,请求不成功的文件统一返回错误信息。
2、对请求地址设置白名单,只允许请求白名单内的地址。
3、禁用除http和https外的协议,如:file://,gopher://,dict://等。
4、限制请求的端口为固定服务端口,如:80,443。