CVE-2016-1000027安全漏洞分析和解决方案

前言

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方法

  1. 引入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>
  1. 编写拦截的代码
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;
    }
}

  1. 再次重启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

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值