CVE-2017-12149 JBOSS反序列化漏洞学习
字数 1235 2025-08-15 21:31:44

JBOSS反序列化漏洞(CVE-2017-12149)深度分析与实践指南

0x00 漏洞概述

CVE-2017-12149是JBOSS应用服务器中存在的一个严重反序列化漏洞,影响JBOSS 5.x/6.x版本。该漏洞允许攻击者通过构造恶意的序列化数据在目标服务器上执行任意代码。

0x01 漏洞成因分析

漏洞位置

漏洞位于JBOSS的/invoker/readonly接口,具体文件路径为:

server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet\ReadOnlyAccessFilter.class

根本原因

ReadOnlyAccessFilter过滤器在处理请求时存在以下问题:

  1. 未对输入数据进行任何校验
  2. 直接对用户提供的输入流进行反序列化操作
  3. 服务器使用了存在漏洞的第三方库(commons-collections 3.1)

0x02 漏洞复现

环境准备

  • 受影响版本:JBOSS 5.x/6.x
  • 工具:ysoserial.jar

复现步骤

  1. 使用ysoserial生成恶意序列化数据:
java -jar ysoserial.jar CommonsCollections6 "calc.exe" > poc.ser
  1. 发送恶意请求:
curl http://[目标IP]:8080/invoker/readonly --data-binary @poc.ser

0x03 漏洞原理深入分析

反序列化触发点

漏洞利用的关键在于sun.reflect.annotation.AnnotationInvocationHandler类的readObject方法,该方法在反序列化过程中会被自动调用。

反射链构造

  1. 构造方法获取

    • getDeclaredConstructor():获取所有类型的构造方法(包括private)
    • getConstructor():仅获取public构造方法
  2. AnnotationInvocationHandler关键代码

    // 获取Target.class实现的接口
    // 检查是否为注解类型
    // 读取输入流并处理
    
  3. 反射链触发流程

    • 读取输入流
    • 解析注解类
    • 获取成员类型值
    • 检查并设置值
    • 触发transform操作

关键方法调用链

  1. readObject() 反序列化入口
  2. memberTypes 获取成员类型
  3. setValue() 设置值
  4. transform() 最终执行点

0x04 POC编写原理

核心思路

  1. 利用commons-collections库中的Transformer链
  2. 通过AnnotationInvocationHandler的readObject方法触发
  3. 构造恶意的序列化数据

关键代码分析

// 获取构造器
Constructor<?> constructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler")
        .getDeclaredConstructor(Class.class, Map.class);

// 实例化对象
Object instance = constructor.newInstance(Target.class, transformerMap);

0x05 防御措施

  1. 临时解决方案

    • 删除/invoker/readonly接口
    • 升级commons-collections库
  2. 长期解决方案

    • 升级到不受影响的JBOSS版本
    • 实施输入验证和过滤
    • 使用白名单控制反序列化类
  3. 安全配置

    • 限制不必要的JMX和HTTP接口
    • 实施网络访问控制

0x06 技术总结

CVE-2017-12149漏洞展示了Java反序列化漏洞的典型利用模式:

  1. 存在不受限制的反序列化入口
  2. 存在可利用的第三方库
  3. 通过精心构造的反射链实现任意代码执行

理解该漏洞需要对Java序列化机制、反射API以及commons-collections库有深入认识。防御此类漏洞的关键在于严格控制反序列化操作,及时更新依赖库,并实施最小权限原则。

JBOSS反序列化漏洞(CVE-2017-12149)深度分析与实践指南 0x00 漏洞概述 CVE-2017-12149是JBOSS应用服务器中存在的一个严重反序列化漏洞,影响JBOSS 5.x/6.x版本。该漏洞允许攻击者通过构造恶意的序列化数据在目标服务器上执行任意代码。 0x01 漏洞成因分析 漏洞位置 漏洞位于JBOSS的 /invoker/readonly 接口,具体文件路径为: 根本原因 ReadOnlyAccessFilter 过滤器在处理请求时存在以下问题: 未对输入数据进行任何校验 直接对用户提供的输入流进行反序列化操作 服务器使用了存在漏洞的第三方库(commons-collections 3.1) 0x02 漏洞复现 环境准备 受影响版本:JBOSS 5.x/6.x 工具:ysoserial.jar 复现步骤 使用ysoserial生成恶意序列化数据: 发送恶意请求: 0x03 漏洞原理深入分析 反序列化触发点 漏洞利用的关键在于 sun.reflect.annotation.AnnotationInvocationHandler 类的 readObject 方法,该方法在反序列化过程中会被自动调用。 反射链构造 构造方法获取 : getDeclaredConstructor() :获取所有类型的构造方法(包括private) getConstructor() :仅获取public构造方法 AnnotationInvocationHandler关键代码 : 反射链触发流程 : 读取输入流 解析注解类 获取成员类型值 检查并设置值 触发transform操作 关键方法调用链 readObject() 反序列化入口 memberTypes 获取成员类型 setValue() 设置值 transform() 最终执行点 0x04 POC编写原理 核心思路 利用commons-collections库中的Transformer链 通过AnnotationInvocationHandler的readObject方法触发 构造恶意的序列化数据 关键代码分析 0x05 防御措施 临时解决方案 : 删除 /invoker/readonly 接口 升级commons-collections库 长期解决方案 : 升级到不受影响的JBOSS版本 实施输入验证和过滤 使用白名单控制反序列化类 安全配置 : 限制不必要的JMX和HTTP接口 实施网络访问控制 0x06 技术总结 CVE-2017-12149漏洞展示了Java反序列化漏洞的典型利用模式: 存在不受限制的反序列化入口 存在可利用的第三方库 通过精心构造的反射链实现任意代码执行 理解该漏洞需要对Java序列化机制、反射API以及commons-collections库有深入认识。防御此类漏洞的关键在于严格控制反序列化操作,及时更新依赖库,并实施最小权限原则。