java反序列化链学习——URLDNS链

java反序列化hello world

与php的不同点就是,java的反序列化中,或者说java的类,没有php那么多的魔术⽅法。但是java的反序列化时,使⽤的readObject⽅法是可以重写的,所有的java反序列化漏洞,也是出于这个重写的时候出现的问题。

package serialize;

import java.io.*;

class User implements Serializable {
   
   
    private String name;

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

    public String getName() {
   
   
        return name;
    }
}

public class Main {
   
   
    public static void main(String[] args) throws Exception {
   
   
        User user = new User();
        user.setName("hello world");

        byte[] serializeData = serialize(user);

        FileOutputStream fout = new FileOutputStream("user.bin");
        fout.write(serializeData);
        fout.close();

        /*
         * ...
         * ...
         * ...
         * 中间有一堆流程
         */

        User user2 = (User) unserialize(serializeData);
        System.out.println(user2.getName());
    }

    // 将对象序列化成字节流
    public static byte[] serialize(final Object obj) throws Exception {
   
   
        ByteArrayOutputStream btout = new ByteArrayOutputStream();
        ObjectOutputStream objOut = new ObjectOutputStream(btout);
        objOut.writeObject(obj);
        return btout.toByteArray();
    }

    // 将字节流反序列化成对象
    public static Object unserialize(final byte[] serialized) throws Exception {
   
   
        ByteArrayInputStream btin = new ByteArrayInputStream(serialized);
        ObjectInputStream objIn = new ObjectInputStream(btin);
        return objIn.readObject();
    }
}

这是一个正常地反序列化过程,不存在问题

反序列化漏洞形成原因

假设,在整个jvm环境中,存在这样⼀个类

import java.io.Serializable;

class Evil implements Serializable {
   
   
    private String name;

    public void setName(String name) {
   
   
        this.name = name;
    
### Java 反串行化漏洞的常见路及其利用方法 #### 背景介绍 Java 反序列化漏洞是一种常见的安全问题,攻击者可以通过构造恶意输入来触发目标程序中的不安全行为。这种漏洞通常发生在应用程序对接收到的数据进行反序列化的过程中,如果数据被篡改或者包含恶意代码,则可能导致远程代码执行 (RCE) 或其他严重后果。 #### 常见条及利用方式 ##### 1. **Apache Commons Collections** 这是最经典的 Java 反序列化漏洞之一。它依赖于 `Apache Commons Collections` 库中的某些类实现的功能组合[^3]。以下是其主要特点: - 利用 `Transformer` 和 `InvokerTransformer` 类构建自定义转换逻辑。 - 使用 `ChainedTransformer` 将多个 `Transformer` 连接起来形成复杂的命令执行路径。 - 构造一个特殊的 Map 对象(如 `TransformedMap`),当该对象的内容发生变化时会自动调用预设的 Transformer 条。 最终效果是在反序列化过程中触发动态代码加载或系统命令执行。 ```java // 示例代码片段展示如何创建恶意 AnnotationInvocationHandler 实例并注入 TransformedMap import java.lang.reflect.Proxy; import java.util.HashMap; public class Exploit { public static void main(String[] args) throws Exception{ HashMap<String, String> map = new HashMap<>(); // 创建恶意的 TransformedMap... Object payload = createPayload(map); System.out.println(payload); } } ``` ##### 2. **URLDNS ** 此条主要用于 DNS 请求外泄场景下探测内部网络结构或其他敏感信息泄露情况[^1]。具体机制如下: - 攻击者先准备一个特制的对象图谱,在其中嵌入指向外部可控服务器地址的信息节点; - 当受害者端完成对该对象图形恢复之后便会尝试访问指定位置从而暴露自身环境细节; 例如通过设置 HTTP 协议头字段值为特定格式字符串形式达到相同目的。 ##### 3. **CC2 Chain with PriorityQueue** 在这个版本里引入了新的组件——即优先队列(`PriorityQueue`)作为辅助工具参与整个流程控制之中[^4]: - 定义了一个比较器(comparator),使得每次插入新元素都会间接引发之前设定好的回调动作发生; - 结合前面提到过的那些危险操作符共同作用即可达成预期危害结果。 上述过程展示了完整的 CC2 工作原理以及它是怎样一步步引导至最终成功实施攻击行动的关键环节所在之处。 ##### 4. **AnnotationInvocationHandler 方法** 这种方法涉及到了 JDK 自身提供的 API 功能点 —— 特别是指向代理模式下的动态处理器部分[^5] : - 制作虚假注解类型的 Invocation Handler 并赋予关联属性 memberValues 的初始状态为空白字典表单样式; - 接着按照既定计划填充进去经过特别设计后的映射关系列表项内容; - 最后再经历标准编码保存步骤后发送出去等待接收方解析还原出来的时候就会激活隐藏在内的潜在威胁因子啦! --- ### 总结说明 以上列举了几种典型的针对 Java 平台上的序列/反序处理功能缺陷所开发出来的有效载荷生成方案。每一种都有各自适用范围局限性和应对措施建议可供参考借鉴学习之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值