• JAVA 反序列化攻击


    Java 对象分解成字节码过程叫做序列化,从字节码组装成 Java 对象的过程叫做反序列化,这两个过程分别对应于的 writeObject 和 readObject 方法。问题在于 readObject 在利用字节流组装 Java 对象时不会调用构造函数, 也就意味着没有任何类型的检查,用户可以复写 readObject() 方法执行任何希望执行的代码。

    这可能会导致三方面问题:

    1. 序列化对象修改了对象或者父类的某个未加保护的关键属性,导致未预料的结果。 例如:

        class Client {
    private int value;
    public Client(int v) {
            if (v <= 0) {
                throw new RuntimeException("not positive number");
            }
            value = v;
        }
        public void writeObject(ObjectOutputStream oos) throws IOException {
            int value = 0; //这里该值被改为0。(现实中可以通过调试模式,修改serialize字节码或者class instrument等多种方式修改该值)
            oos.defaultWriteObject();
        }
    }class Controller {
        private ArrayBlockingQueue<Client> queue;
        public void receiveState(oin) throws IOException, ClassNotFoundException {
            Client s = (Client)oin.(); //反序列化不调用构造函数,value的非零检查不会触发        queue.add(s);
        }
        public Client getClient() throws InterruptedException {
            return (Client)queue.take();
        }
    }class Server extends Thread {
        private Controller controller = new Controller();
        private int result = 100;
        public void run() {
            while (true) {
                try {
                    result = result / controller.getClient().getValue(); // 由于value是0,会导致算数异常,线程结束
                    Thread.sleep(100);
                } catch (InterruptedException e) {}
            }
        }
    }

    2. 攻击者可以创建循环对象链,然后序列化。会导致反序列化无法结束, 空耗系统资源。例如:

    Set root = new HashSet();Set s1 = root;Set s2 = new HashSet();for (int i = 0; i < 10; i++) {
      Set t1 = new HashSet();
      Set t2 = new HashSet();
      t1.add("foo"); //使t2不等于t1
      s1.add(t1);
      s1.add(t2);
      s2.add(t1);
      s2.add(t2);
      s1 = t1;
      s2 = t2; }
      
      class Controller {
        public void receiveState(ObjectInputStream ois) {
            FileOutputStream fos = new FileOutputStream(new File("xxx.ser"));
            fos.write(ois); //实际并不知道存的是什么,可能是恶意脚本。
            fos.close();
        }
    }

     参考

    JAVA 反序列化攻击 | IT瘾

    http://itindex.net/detail/54975-java-%E5%BA%8F%E5%88%97%E5%8C%96


    Java反序列化漏洞分析 - ssooking - 博客园

    http://www.cnblogs.com/ssooking/p/5875215.html


    Java序列化机制和原理 - redcreen - 博客园

    http://www.cnblogs.com/redcreen/archive/2011/02/15/1955307.html



  • 相关阅读:
    Oracle Words Spelling Error
    原创 分布式锁与应用场景
    原创 分布式事务简单实现思路
    原创 使用redis位图实现布隆过滤器
    原创 redis实现接口限流
    原创 jwt-security简单实现
    原创 抢购秒杀之redis高性能实现
    原创 springcloud feign优化配置
    原创 派单、抢单业务简单实现
    原创 微信公众号推送图片实现
  • 原文地址:https://www.cnblogs.com/liango/p/7142308.html
Copyright © 2020-2023  润新知