Alibaba
开源限流熔断组件Sentinel
是阿里巴巴发行的面向分布式服务架构的高可用防护开源组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性。
github源码地址及更多介绍:https://github.com/alibaba/Sentinel/
2021年11月,SecCoder Security Lab
的threedr3am
发现了Sentinel
中的管控平台sentinel-dashboard
存在认证前SSRF漏洞,恶意用户无需认证即可通过该接口进行SSRF攻击。
拉取源码: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
即可启动服务后台
nc -lvvp 12345
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接收到了请求
在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利用。
对比最新版本代码,官方修复方式是在src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java
中调用IPAddressUtil
工具类对IP地址增加合法检验,只有合法的IPv4和v6地址可以正确传入
3 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!