文章目录
- 前言
- 复现问题
- 漏洞分析
- 解决办法
- 相关阅读
前言
CVE-2016-1000027 安全漏洞,该漏洞在5.x的最新版本(5.3.27)依然存在,官方未给出任何解决办法。在spring-web6.0之后,则不存在该漏洞。
受影响范围:spring-web<6.0
解决办法:升级到spring6的最新版本,由于spring6开始支持的最小jdk是jdk17,所以jdk版本如果低于17,则需要先升级jdk。
复现问题
代码:https://github.com/artem-smotrakov/cve-2016-1000027-poc
导入源码后,启动server
使用ysoserial 生成调用链,我们可以看到server使用的common-collections的版本为3.1
使用ysoserial 查看能使用的payload,这里选择CommonsCollections6
命令执行
java -jar ysoserial-all.jar CommonsCollections6 "calc" > CommonsCollections6.bin
ysoserial-all.jar下载地址 https://github.com/frohoff/ysoserial/releases/tag/v0.0.6
执行Exploit ,注入的命令路径为CommonsCollections6.bin
执行后,弹出计算器。
漏洞分析
在server控制台,可以看到堆栈的关系信息,实际发生的问题在HttpInvokerServiceExporter和RemoteInvocationSerializingExporter
那么我们就可以知道,实际上是由于输入流直接反序列化后被执行,而没有经过检测。
解决办法
方法一:对应的我们可以检测输入流,防止危险指令,当然这可能会被绕过。
方法二:改写底层依赖,直接屏蔽该代码。直接重写handerRequest的方法体,屏蔽方法内容,这样就不存在执行危险输入流的问题了。我们可以直接找到spring-web.jar修改后重新编译。
方法三:使用AOP的方式拦截执行handleRequest方法
- 引入AOP的依赖
<!--AOP核心依赖aspectjweaver-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<!--其它外围依赖仅供参考-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83_noneautotype</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
- 编写拦截的代码
package com.gypsyengineer.server;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* CVE-2016-1000027安全漏洞补丁方案
*/
@Component
@Aspect
@Slf4j
public class HttpInvokerServiceExporterAspect {
/**
* 设置AOP切点
*/
@Pointcut("execution(* org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(..))")
public void mypointcut() {
}
/**
* 执行方法环绕
*
* @param point
*/
@Around(value = "mypointcut()")
public Object aroundHandleRequest(ProceedingJoinPoint point) throws Throwable {
log.info("-----------禁用org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest,防止CVE-2016-1000027安全漏洞------------");
return null;
}
}
- 再次重启server和Exploit ,验证是否会调起计算器。可以看到此时计算器应用未被调起,表示漏洞该漏洞已经解决。
相关阅读
Sonatype vulnerability CVE-2016-1000027 in Spring-web project
java 5.x.x版本中的Spring-Web极高漏洞
https://github.com/lengcz/cve-2016-1000027-poc
https://github.com/openanalytics/shinyproxy/issues/270