SSRF简介
- SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
- 原理:由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。这个功能若被恶意使用,可利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
- 危害
1、可以对服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息
2、攻击运行在内网或本地的应用程序(比如溢出)
3、对内网web应用进行指纹识别,通过访问应用存在的默认文件实现;
4、攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2漏洞利用,sql注入等)
5、利用file协议读取本地敏感数据文件
6、利用Redis未授权访问,HTTP CRLF注入达到getshell
7、DOS攻击(请求大文件,始终保持连接keep alive always) - 引发ssrf漏洞的PHP函数
file_get_contents:文件写入字符串,当url是内网文件的时候,会先去把这个文件的内容读出来再写入,导致了文件读取。
<?php
if (isset($_POST['url']))
{
$content = file_get_contents($_POST['url']); //获取文件内容
$filename ='./images/'.rand().';img1.jpg'; //生成一个随机的文件名保存到images这个文件中
file_put_contents($filename, $content); //写入文件内容
echo $_POST['url'];
$img = "<img src=\"".$filename."\"/>";
}
echo $img;
?>
fsockopen()
<?php
function getfile($host,$port,$link){
//fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
$fp = fsockopen($host,intval($port),$errno,$errstr,30);//打开一个网络连接或者一个unix套接字连接
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()函数将内容写入一个打开的文件当中
fwrite($fp, $out);
$content = '';
while (!feof($fp)) { //检查是否已经达到文件末尾
$contents .= fgets($fp,1024);
# code...
}
fclose($fp)mianshiti
return $contents;
}
}
echo(getfile("127.0.0.1","80","index.php"));
?>
curl_exec()
<?php
//curl是一个利用URL语法在命令行下工作的文件传输工具
function curl($url){
$ch = curl_init();//初始化一个新的curl会话,返回一个curl句柄
curl_setopt($ch, CURLOPT_URL,$url);//设置一个curl传输选项,需要获取的url地址
curl_setopt($ch, CURLOPT_HEADER,0);//启动时候将头文件的信息作为数据流输出
curl_exec($ch);//执行一个curl会话
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>
- 协议
file:在有回显的情况下,利用 file 协议可以读取任意内容
dict:泄露安装软件版本信息,查看端口,操作内网redis服务等
gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
http/s:探测内网主机存活
验证SSRF
- 查看源代码判断是否是从本地进行了请求;
eg:若该资源地址类型为 http://www.xxx.com/a.php?image=URL中,URL参数若是其他服务器地址就可能存在SSRF漏洞 - 抓包:ssrf漏洞的原理是让服务器发送的请求,所以分析发送的请求是不是由客户端发送的,若不是,则可能存在漏洞
漏洞利用
SSRF漏洞利用手段:
1.可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
2.攻击运行在内网或本地的有漏洞程序(比如溢出);
3.可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
4.攻击内网或外网有漏洞的Web应用;
5.使用file:///协议读取本地文件(或其他协议)
SSRF漏洞出现点:
1.分享:通过URL地址分享网页内容
2.转码服务(手机适配)
3.在线翻译
4.图片加载与下载:通过URL地址加载或下载图片
5.图片、文章收藏功能
6.未公开的api实现及调用URL的功能
7.从URL关键字中寻找,如share,wap,url,link,src,source,target,sourceURL,imageURL,domian
漏洞绕过
- 利用@:http://example@127.0.0.1
例如:http://www.baidu.com@10.10.10.10与http://10.10.10.10 请求是相同的 - 添加端口号:http://127.0.0.1:8080
- 利用短地址:http://dwz.cn/11SMa
- ip 地址进制转换
- 可以指向任意ip的域名:xip.io
漏洞防御
- 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
- 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
- 限制请求的端口为http常用的端口,比如,80,443,8080,8090。
- 黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
- 禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。