NCTF2021ezjava的出题思路
前言
先说说这个的题的背景吧,构思挺久的题目。
当时在学习java安全的时候在看java代码审计那本书,里面有提到jeecms对压缩包的不正确解压导致的目录穿越,当时觉得这个点挺有趣的就打算来出一下,但是直接上传jsp太简单了肯定不行。于是在学习java写文件rce的时候看到了些文章
主要就是对这2篇文章研究了一下进行复现,发现是个很好的方法,一下就拓宽了攻击面。所以打算用这个点来作为最后的rce点
但是在研究的过程中,发现zip的相关操作会去调用charset
,导致charsets.jar
被加载进去,无法触发。自己也没有发现其他可以利用的jar(太菜惹~
只好作罢去找其他加载类的方法。最终发现java在实现反序列化的时候会去classpath中加载class,所以可以通过这一点去加载恶意的class从而执行恶意代码。
wp
这个题其实也是一个在不支持jsp的情况下任意文件写的rce利用
前面部分先对代码进行审计,我们可以上传zip,然后在解压这里发现
他没有对压缩包文件内的文件进行检查,这里就可以导致解压目录穿越。这里可以通过一个脚本去生成这样的zip:
1 | import zipfile |
那么我们现在就相当与可以写入任意文件了。那么就是在spring boot运行时并且不支持jsp没有热部署的情况下要如何去rce的问题了
其实这里给了一个后门是用来反序列化,这里的提示其实很明显了,我们就可以把恶意类文件写入到classpath,如何通过反序列化去加载我们恶意类中重新的readObject方法,就可以达成rce。
题目给的附件是war,然后也有tomcat的路径可以很轻松的得到classpath,然后通过unzip把恶意类解压到classpath下,再通过后门的反序列化去触发即可。(这里一开始没给tomcat路径是因为tomcat的路径是默认的而且可以通过zip路由去确认是否存在该路径,但是一直没有解就当hint去提示师傅们了:)
1 | package com.x1c.nctf; |
1 | backdoor?cmd=rO0ABXNyABBjb20ueDFjLm5jdGYuUG9jLTxEyChKw8gCAAB4cA== |
反弹shell就可以了
尾声
比赛中题目环境一直出问题,还请各位师傅谅解,主要还是希望和师傅们分享这样一种思路,感谢各位师傅的捧场。