Tomcat upload war bypass
我想偷光日月潮汐和你慢慢的聊, 最好有张摇椅可以慢慢的摇
慢慢的缩小 眼尾长出线条, 在漫漫的时光里一起变老
0x00 介绍
之前在zsxq提了一个问题 https://t.zsxq.com/0cU40i3uo,大概是 假设有一个环境,可以上传war包,但是文件名不能超过4个字符,怎么rce。 (默认tomcat环境)
于是在这里也简单的分享一下,虽然没有什么用。。。。
0x02 分析代码
这里只是从tomcat代码上研究bypass
后缀名大小写绕过
上传的war支持大小写
问题
如果我们上传的war文件名不能超过4个怎么办?也就是只能上传 .war
这个问题会有什么影响?我本地测试了一下。在webapps下上传**.war**并没有成功生成文件夹和解压出我们的webshell。
看看tomcat是什么代码逻辑
org.apache.catalina.startup.HostConfig#deployWAR
设置路径
所以this.context.getPath() == “” 上传的.war给ContextName处理
因为获取不到pathname名(为**.**)就为ROOT
然后在给war进行解压的时候,判断docBase存不存在,因为是ROOT文件,肯定存在就不会解压.war 流程结束
所以:为什么上传 .war没有解压出我们的webshell。
是因为处理的路径为””,然后就用ROOT来判断存不存在,而ROOT默认是存在的所以不能解压.war
bypass
知道了原因,那么我们怎么bypass。
方法一:
想办法删除ROOT文件夹。上传 .war,解压的文件就会重新在ROOT生成
方法二:
我们在看看org.apache.catalina.startup.HostConfig#deployWAR的逻辑
在真正的部署war之前,判断了有没有META-INF/context.xml文件之后解析。
那么就简单了。我们上传 .war文件是META-INF/context.xml
内容是:
1 | <Context> |
上传之后直接进行了jndi注入,并没有生成文件夹。成功利用!
路径穿越 失败
在调试的过程中想到,war不就是jar嘛而jar也是zip结构,那么就可能存在一个路径穿越的问题。
解压出war里面的文件发现可能是存在路径穿越
但是这里进行了判断,判断处理之后的文件路径是不是canonicalDocBasePath开头,不然就报错。
0x03 总结
感觉这个trick没有什么用但是可以用去出CTF。(或者可能有人这样写防御)
在分享一下自己的zsxq……(王婆卖瓜…..)