0%

SSRF漏洞总结

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。

一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

SSRF漏洞原理

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

比如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器

漏洞产生函数

file_get_contents

<?php
$url = $_GET['url'];
echo file_get_contents($url);

fsockopen

该函数在PHP中用于打开一个网络连接或者一个Unix套接字连接。进而来获取用户指定的url数据,其使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限。

<?php 
function GetFsock($host, $port, $link)
{
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if(!$fp){
echo "连接失败: $errno - $errstr";
}
else
{
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: close\r\n\r\n"; //构造$out,设置请求头
fwrite($fp, $out);
$contents = '';
while(!feof($fp)){
$contents .= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
$content = GetFsock("192.168.1.12", 80, "/eclipse_workspace/firstpro/flag");
echo $content;

curl_exec

该函数用于执行由curl_init初始化的cURL会话。

<?php 
function CurlExec($link)
{
$ch = curl_init(); //初始化cURL会话
curl_setopt($ch, CURLOPT_POST, 0); //设置为 0,表示使用 GET 方法请求数据。
curl_setopt($ch, CURLOPT_URL, $link); //设置要请求的 URL。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//表示将 cURL 的输出作为字符串返回,而不是直接输出到浏览器。
$result = curl_exec($ch);//执行 cURL 会话
curl_close($ch); //关闭cURL会话
echo $result;
}
if(isset($_POST['url'])){
CurlExec($_POST['url']);
}
#url=192.168.1.12/eclipse_workspace/firstpro/flag

注意:

1.一般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
4.curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
5.curl_exec() //默认不跟踪跳转,
6.file_get_contents() // file_get_contents支持php://input协议

漏洞检测方式

3.1.排除法:浏览器f12查看源代码看是否是在本地进行了请求

比如:该资源地址类型为 http://www.xxx.com/a.php?image=URL,URL参数若是其他服务器地址就可能存在SSRF漏洞

3.2.dnslog等工具进行测试,看是否被访问(可以在盲打后台,用例中将当前准备请求的url和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求)

3.3.抓包分析发送的请求是不是通过服务器发送的,如果不是客户端发出的请求,则有可能是存在漏洞。接着找存在HTTP服务的内网地址

  • 从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
  • 通过二级域名暴力猜解工具模糊猜测内网地址
  • 通过file协议读取内网信息获取相关地址

3.4.直接返回的Banner、title、content等信息

3.5.留意布尔型SSRF,通过判断两次不同请求结果的差异来判断是否存在SSRF,类似布尔型sql盲注方法。

SSRF中URL的伪协议

当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL伪协议

file:/// 从文件系统中获取文件内容,如,file:///etc/passwd
dict:// 字典服务器协议,访问字典资源,如,dict:///ip:port/info:
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务,可使用gopherus生成payload
file:///etc/hosts   #显示当前操作系统网卡的IP
file:///proc/net/arp #显示arp缓存表(寻找内网其他主机)
file:///proc/net/fib_trie #显示当前网段路由信息

参考文章:

SSRF漏洞(原理、挖掘点、漏洞利用、修复建议) - Saint_Michael - 博客园

SSRF漏洞原理攻击与防御(超详细总结)-CSDN博客