标签:cti hash pos search end 属性 xxx res 执行
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标签:cti hash pos search end 属性 xxx res 执行
原文地址:http://www.cnblogs.com/liango/p/7142308.html