作者Github提交地址:https://github.com/alibaba/Sentinel/issues/2451
在 idea 进行部署,启动,访问:http://127.0.0.1:8080
。
1、漏洞代码分析
文章中已经给出了漏洞的触发点,以及漏洞利用的 POC,我们做参考分析。
首先漏洞的触发点在com.alibaba.csp.sentinel.dashboard.metric.MetricFetcher#fetchOnce
。
httpGet
是ApacheHttpClient
库中的一个类,用于创建Http Get
请求,最终使用execute
方法执行HTTP
请求。
现在我们已经大致了解代码了,清楚漏洞触发点了,下面追踪一下参数传入的过程。
1、通过 HttpGet 传入了 url 参数。
2、追踪发现String url
中从machine.getIp()
和machine.getPort()
获取了 IP 地址和端口号。
3、接着判断了machine
参数是否活着,是否健康。
4、而machine
是从 for-each 循环中的machines
获取值后将值赋予给machine
。
5、继续追踪machines
,发现在第 182 行处从appInfo.getMachines()
处获取值,然后中间判断了一下machines
是否为空。
6、进入appInfo.getMachines()
方法,在这段代码中getMachines
中return
了 machines
,从注释翻译得到,这里就是获取当前机器,而变量machines
使用了ConcurrentHashMap.newKeySet()
方法来创建一个线程安全的 Set 集合,其中machines
值是由addMachine
方法添加进去的,ConcurrentHashMap
的读取操作不会被写入操作所阻塞,这意味这在添加机器信息的同时,其他线程可以安全的读取machines
中的信息,因此,在别的代码中可以安全地使用getMachines()
获取添加地机器信息,如下图所示:
这里做了一个移除操作,又返回做了一个添加操作。
7、下面就是追踪谁调用了addMachine
方法,按住 Ctrl+鼠标左键,可以看到调用关系,SimpleMachineDiscovery
类中的重写了addMachine()
方法,如下图所示:
8、继续追踪addMachine()
方法,查看调用关系,发现有两处调用,一处是MachineRegistryController
,另一处是AppManagement
,首先我们需要查看MachineRegistryController
接口层,去寻找接口。
9、进入 Controller 层,其主要作用是,获取请求中的参数,并进行相应的处理和判断,最终将机器信息添加到应用管理中,并返回注册的结果。
10、下面通过 42 行道 76 行,通过代码可以得出接口地址为:/registry/machine
,得到传入参数有 app,appType,v,hostname,ip,port,并对传入的 app,ip 和 port 参数进行了判断是否为 null 的操作。
11、继续分析,简单的说就是将从请求中获得的数据,分别设置成machineInfo
的属性值,最后调用appManagement.addMachine(machineInfo)
;方法添加注册机机器信息。
至此,整个流程我们追踪完了,现在总结下大致流程就是,参数从MachineRegistryController
传进来,其中涉及 IP 和 port,通过 appManagement.addMachine(machineInfo)
方法添加机器信息,最终在 MetricFetcher 中使用了 start() 方法定时执行任务,其中有个任务是调用 fetchOnce 方法执行HTTP GET 请求。
12、接着构造 url:http://127.0.0.1:8080/registry/machine?app=0&ip=127.0.0.1&port=8000
python3 开启 http 服务:
python -m http.server
,收到回显。
原文始发于微信公众号(赤弋安全团队):Alibaba Sentinel的SSRF
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论