SSRF漏洞总结
1.SSRF漏洞概述
服务端请求伪造(Server-side Request Forge):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。很多web应用都提供了从其他的服务器上获取数据的功能。使用指定的URL,web应用便可以获取图片,下载文件,读取文件内容等。SSRF的实质是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。一般情况下, SSRF攻击的目标是外网无法访问的内部系统,黑客可以利用SSRF漏洞获取内部系统的一些信息(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
2.SSRF漏洞的危害
1.内外网的端口和服务扫描
2.攻击运行在内网或者本地的应用程序
3.对内网web应用进行指纹识别,识别企业内部的资产信息
4.攻击内网的web应用,主要是使用GET参数就可以实现的攻击
5.向内部任意主机的任意端口发送精心构造的pPayload
6.利用file协议读取本地敏感文件
3.漏洞代码例子
curl造成的SSRF
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);
file_get_contents造成的SSRF
$url = $_GET['url'];
echo file_get_contents($url);
fsockopen造成的SSRF
<?php
function Getfile($host, $port, $link){
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if(!$fp){
echo "$errstr (error number $errno) \n";
}else{
$out = "GET $link HTTP/1.1\r\n";
$out .= "HOST $host \r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$content = '';
while(!feof($fp)){
$contents .= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
4.SSRF漏洞利用
下面就简单实现一下第三部分中curl造成的SSRF的代码,利用SSRF漏洞实现一些简单的攻击.这里再看一下网页代码,将代码写在文件testSSRF.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);
利用该网页访问其他网页
打开网页向url参数传入www.baidu.com,发现就可以访问百度的主页。
利用file协议读取文件
给参数url传入file://D:\PHPstudy_v8\install\phpstudy_pro\WWW\test\123.txt,结果可以发现可以访问123.txt文件中的内容。
利用dict协议查看端口开放情况
利用gopher协议反弹shell......
5.SSRF常见出没位置
(1).分享:通过URL地址分享网页内容
(2)转码服务
(3)在线翻译
(4)图片加载与下载:通过URL地址加载或下载图片
(5)图片、文章收藏功能
(6)未公开的api实现以及其他调用URL的功能
(7)从URL关键字中寻找:share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain等。
6.SSRF漏洞修复
- 限制协议为HTTP、HTTPS,禁止不常用的协议,这样就可以防止file,dict,gopher等引起的问题
- 不用限制302重定向
- 设置URL白名单或者限制内网IP
- 统一错误信息,避免用户可以根据错误信息来判断远程服务器的状态
- 过滤返回的信息,如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准
7.参考