SSRF
SSRF(Server-Side Request forgery,服务器端请求伪造)是一种攻击者构造请求,由服务器端发起请求的web安全漏洞,很多时候的SSRF攻击的目标是外网无法访问的内部主机系统,因为由服务器发起的请求很多时候是外网无法访问的内部系统。可以算是内部信息泄露。
SSRF漏洞原理:SSRF的形成大多是由于服务器端提供了从其他相联的服务器应用获取数据的功能且没有对目标地址做过滤和限制。 THE HACKER 操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等等,利用的是服务端的请求伪造。SSRF利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器。
主要攻击方式。
- 对外网,服务器所在内网,本地进行端口扫描,获取服务的banner信息。
- 攻击运行在内网或本地的应用程序。
- 对内网WEB应用进行指纹识别,识别企业内部的资产消息。
- 攻击内往网的Web应用,主要是使用HTTP GET 请求就可以实现的攻击(比如struts2,SQli等)。
- 利用file协议读取本地文件等。
SSRF漏洞利用
现在服务器上有一个ssrf.php的页面,该页面的功能是获取URL参数,然后将URL的内容显示到网页页面上。
<?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页面中,程序获取GET参数URL,通过curl_init()初始化curl组建后,将参数URL带入curl_setopt($ch,CURLOPT_URL,$url),然后调用curl-exec请求改URL,由于服务端会将banner信息返回客户端,所以可以根据banner判断主机是否存在某些服务
此时更改后缀url为www.baidu.com,再次访问得到下面页面
但是当设置参数URL为内网地址时,则会泄露内网信息,例如输入一个192.168.0.2:3306
说明在3306端口存在MySQL服务,这就是最简单的一个服务信息泄露。
SSRF漏洞修复建议
- 限制请求端口只能为web端口,只允许访问HTTP和HTTPS的请求
- 限制不能访问内网IP
- 屏蔽返回的详细信息