漏洞解释
SSRF(Server-Side Request Forgery,服务器请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统(正因为请求时由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统)
SSRF漏洞形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制.例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造,SSRF利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器
漏洞攻击方式
- 对外网,服务器所在内网,本地进行端口扫描,获取一些服务的banner信息.
- 攻击运行在内网或本地的应用程序
- 对内网Web应用进行指纹识别,识别企业内部的资产信息
- 攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如strust2,SQli等)
- 利用file协议读取本地文件等
-
漏洞分析
在页面SSRF.php中.程序获取GET参数URL.通过curl_init()初始化curl组件后,将参数URL带入curl_setopt($ch,CURLOPT_URL,$url),然后调用curl_exec请求该URL,由于服务端会将banner信息返回客户端,所以可以根据banner判断主机是否存在某些服务,代码如下:
<?php
function curl($url){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_exec($ch);
curl_close($ch);
}
$url=$_GET['url'];
curl($url);
?>
漏洞利用方式
SSRF漏洞利用的测试地址:http://127.0.0.1/ssrf.php?url=http://127.0.0.1/test.php
页面ssrf.php实现的功能是获取GET参数URL,然后将URL的内容返回网页上,如果将请求改为http://www.baidu.com.则页面会显示http://www.baidu.com的网页内容
如果我们将url的参数篡改为内网地址,则会泄露内网信息,例如当url=192.168.0.2:3306时,就可以知道该ip是否存在mysql服务
将url参数篡改为内网资源地址时,就会读取本地文件,这和文件包含漏洞很类似!
漏洞防御策略
- 限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS请求
- 限制不能访问的内网IP,以防止对内网进行攻击
- 屏蔽返回的详细信息