位于casa/WEB-INF/classes/com/vmware/ops/casa/api/ClusterDefinitionController.class
有一个路由/nodes/thumbprints
这里接收POST传入的值作为address
传入getNodesThumbprints
方法,跟进ClusterDefinitionService#getNodesThumbprints
这里实例化了一个HttpMapFunction
类并调用了execute
方法,可以看到返回的结果保存在response中,后面就是对返回结果的处理,从变量名和后面操作的行为就可以猜测execute方法里面就是发出请求也就是造成ssrf的地方,跟进看一看
这里的hosts也就是我们传入的address转为数组的形式,接着将hosts赋值给var4,然后进入for循环遍历host通过HttpTask.createInstance
创建任务实例,跟进HttpTask#createInstance
这里的op从实例化HttpMapFunction那儿可以知道值为RequestMethod.GET
,所以这里返回了一个发送GET请求的任务HttpGetTask
,回到execute
方法中,将得到的任务task
放入tasks
中,最后通过invokeAll
开始多线程执行。
位于casa/classes/com/vmware/vcops/casa/appconfig/CertificateController.class
有一个路由
这里接收了两个post参数name和file,然后跟进CertificateService#handleCertificateFile
这里创建了一个File对象,然后直接使用transferTo函数上传文件,两个参数都是可控的所以就造成了任意文件上传漏洞,复现这个漏洞有一个前提是需要有Authorization。
思路是ssrf获取Authorization然后配合文件上传漏洞getshell
复现ssrf的时候已经接收到了Authorization(8.3之前的版本会有,不包括8.3),然后就利用文件上传漏洞写webshell。