看着y4er师傅写的分析,第一次看有点懵逼,所以简单的补充一下。
首先漏洞点在该路由的 dumpProjectDiagnosisInfo方法中project可控。
跟着进去,可以看到runDiagnosisCLI方法之后正常执行命令并且project一直可控。所以非常有机会RCE了!
唯一绕过就是不让 projectInstance为null,不然就throw抛异常。所以我们看看projectInstance得到如何获得。
首先通过 convertStringToBeAlphanumericUnderscore方法进行替换,输入 touch 123则替换之后就为 touch123
之后通过 getProject方法去找有没有 touch123这个项目。看下面是通过**projectMap.get(projectName);**去获得如果有就不会抛异常就成功命令执行。
所以我们在看看得到才什么类中获取,也就是去看 projectMap是指的那个类。
然后跟上ProjectInstance,则到了如下代码,可以看到setname进去,所以我们最开始需要setname进去和 touch123相同就可以了
向上跟踪
然后去跟踪 createProject方法,之后到了 saveProject方法
可以看到传递的是json格式然后去获得name,并且通过isAlphanumericUnderscore判断了,但是如果执行命令肯定set进去的name是 tuoch123,巧的是 tuoch123刚刚好去绕过。
从而成功执行命令。
y4er师傅的图
先创建项目名
执行命令
传入cmd的参数改为projectName而非http传入的project,projectName经过convertStringToBeAlphanumericUnderscore() 处理,所以无法输入非字母数字下划线的字符来触发命令执行。
(除非单个命令可以创成严重危害。。。。。