Sentinel中的管控平台sentinel-dashboard存在认证前SSRF漏洞,恶意用户无需认证即可通过该接口进行SSRF攻击(CVE-2021-44139)。
0x00 漏洞简介
Alibaba
开源限流熔断组件Sentinel
是阿里巴巴发行的面向分布式服务架构的高可用防护开源组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性。
github源码地址及更多介绍:https://github.com/alibaba/Sentinel/
2021年11月,SecCoder Security Lab
的threedr3am
发现了Sentinel
中的管控平台sentinel-dashboard
存在认证前SSRF漏洞,恶意用户无需认证即可通过该接口进行SSRF攻击。
0x01 环境搭建及复现
拉取源码:https://github.com/alibaba/Sentinel.git
导入idea,切换branch到release-1.8
git checkout release-1.8
运行Sentinel/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java
即可启动服务后台
- 本地监听端口12345,
nc -lvvp 12345
- 构造url发起攻击,
curl -XGET '<http://your-ip:8080/registry/machine?app=SSRF-TEST&appType=0&version=0&hostname=TEST&ip=your-ip:12345%23&port=0'
nc接收到了请求
0x02 漏洞分析
在src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java
的receiveHeartBeat
方法打断点调试
发送payload跟进
进入receiveHeartBeat
方法后,对端口进行了检验,需要正整数,而对ip进行了 非空 和 长度(小于128) 的检验后便传入machineInfo
,跟进addMachine
方法
继续步入
仅仅是把传入的app等字符取出,没有做其他检验就返回给machineInfo
至于machineInfo
的值在何处被调用,需要看src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java
start
方法在构造方法中被调用
跟进start
方法中的fetchAllApp
方法
该函数获取所有app对象放进list中,再把list传入app遍历调用doFetchAppMetric
进入到fetchOnce
,对app的信息做判断
machineInfo
对象的值在这里取出
之后拼接到url中,发出get请求,同时可以构造#
注释后面拼接的内容。
整个过程中没有有效的参数过滤和校验,可以构造特殊参数进行ssrf利用。
0x03 修复
对比最新版本代码,官方修复方式是在src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java
中调用IPAddressUtil
工具类对IP地址增加合法检验,只有合法的IPv4和v6地址可以正确传入
0x04 参考
- 本文作者: 3r1cCheng
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1839
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!