Spring RCE远程执行漏洞(CVE-2022-22965)

Spring RCE远程执行漏洞(CVE-2022-22965)

这个洞22年3月底被大佬发现公布,由于Spring框架的影响范围太大了。复现条件又很低,本身就是高危的RCE漏洞可以直接拿到服务器的shell,像作者说的一样确实是一个核弹漏洞。

影响范围

JDK>8

Spring Framework<5.3.18

Spring Framework<5.2.20

条件

类对象中有get/set方法

Spring controller接口中有对象传入

漏洞原理

User类,有name和Department两个属性

public class User {
   
   
    private String name;
    private Department department;public String getName() {
   
   
        return name;
    }public void setName(String name) {
   
   
        this.name = name;
    }public Department getDepartment() {
   
   
        return department;
    }public void setDepartment(Department department) {
   
   
        this.department = department;
    }}

Department类具有name属性

public class Department {
   
   
    private String name;

    public String getName() {
   
   
        return name;
    }

    public void setName(String name) {
   
   
        this.name = name;
    }
}

一会准备测试的接口,注意:其中并没有调用User的get/set方法

@Controller
public class UserController {
   
   
    @RequestMapping("/testUser")
    public @ResponseBody String testUser(User user) {
   
   
        System.out.println("==testUser==");
        return "OK";
    }
}

打断点后DEBUG启动

在这里插入图片描述
携带参数请求该接口

http://localhost:8888/testUser?name=tpa&department.name=code

User对象没有调用get/set方法但其属性却有了值,这是因为Spring的参数绑定特性,而department.name则是多级绑定。(若department中也存在一个具备name属性的area对象,传入参数department.area.name其属性也会更改。)实际上department.name在后台的调用链路为

User.getDepartment() => Department.setName()

department.area.name则为

User.getDepartment() => Department.getArea() => Area.setName()

在这里插入图片描述
因为是封装类private私有属性,能更改类的属性不直接调用get/set肯定是通过反射了。而JDK自带的一个类PropertyDescriptor就可以通过反射来获取设置对象的属性。实现Spring框架参数绑定自动调用get/set方法的关键类BeanWrapperImpl就是对其进行的封装。

public class PropertyDescriptorTest {
   
   
    public static void main(<
### ### 漏洞原理与攻击方式 CVE-2022-22965,也被称为 **SpringShell**,是 Spring Framework 中一个严重的远程代码执行RCE漏洞。该漏洞的核心在于 Spring MVC 或 Spring WebFlux 应用在处理带有特定数据绑定的请求参数时,允许攻击者通过构造恶意请求,触发基于 Java 的表达式语言(SpEL)的执行,从而在目标服务器上执行任意代码。 此漏洞的利用依赖于 Spring 框架在 JDK 9+ 环境下对 `java.beans.FeatureDescriptor` 类的处理方式。攻击者可以通过构造特定的 HTTP 请求参数,将恶意表达式注入到数据绑定过程中,最终导致远程代码执行。 例如,攻击者可能构造如下请求: ```http POST /test Content-Type: application/x-www-form-urlencoded name=T(java.lang.Runtime).getRuntime().exec("calc") ``` 该请求尝试利用 Spring 的数据绑定机制执行 `calc` 命令,若目标应用未进行有效防护,该命令将在服务器上执行,从而实现远程控制。 Spring Framework 在处理 `@Controller` 或 `@RestController` 注解的类时,若未正确限制表达式解析路径,攻击者可通过构造特定的属性路径触发 SpEL 注入,导致任意代码执行 [^2]。 --- ### ### 漏洞影响范围 CVE-2022-22965 影响以下版本的 Spring Framework: - Spring Framework 5.3.0 至 5.3.17 - Spring Framework 5.2.0 至 5.2.19 - Spring Boot 2.6.x、2.5.x、2.4.x - Spring Cloud Function 3.1.x 及更早版本 该漏洞的利用条件相对宽松,仅需目标应用存在可触发数据绑定的接口即可,因此在互联网暴露面较大的应用中具有较高的风险 [^3]。 --- ### ### 漏洞修复方案 Spring 官方在以下版本中修复了该漏洞- Spring Framework 5.3.18+ - Spring Framework 5.2.20+ - Spring Boot 2.6.8+ - Spring Cloud Function 3.2.4+ 修复的核心机制是限制了对敏感类属性的访问,具体包括: - 在数据绑定过程中禁用对 `class`、`classLoader`、`protectionDomain` 等敏感属性的绑定 - 对表达式解析路径进行限制,防止攻击者通过构造路径访问危险类或方法 开发者应升级至上述修复版本,并确保所有依赖库同步更新。此外,建议在应用中启用安全配置,如限制数据绑定的字段白名单,避免用户输入直接用于表达式解析 [^1]。 --- ### ### 安全加固建议 除了升级框架版本外,还建议采取以下措施增强应用安全性: - **限制数据绑定字段**:在 `@InitBinder` 中配置 `setDisallowedFields` 方法,禁止绑定敏感字段 - **关闭调试信息输出**:避免在生产环境中暴露堆栈信息,防止攻击者获取更多攻击线索 - **使用安全反序列化机制**:启用反序列化白名单,防止不可信数据导致的代码执行 - **启用 Web 应用防火墙(WAF)**:拦截包含 `T(java.lang.Runtime)` 等特征的恶意请求 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值