已知python反序列化漏洞原因为__reduce__魔术方法,而Java并没有__reduce__魔术方法,那为何会反序列化漏洞呢?
Show me the code
Demo
1 | public class HelloUser implements Serializable{ |
1 | HelloUser user = new HelloUser(); |
数据结构
此时的object.obj 内容为
1 | AC ED 00 05 73 72 00 28 63 6F 6D 2E 6D 30 64 39 2E 73 65 63 2E 65 78 61 6D 70 6C 65 2E 73 65 72 | ....sr.(com.m0d9.sec.example.ser |
可以大概看到,仅保存了类名及属性,除了readObject方法,并没有其他发挥空间
readObject流程
Java反射机制、动态代理机制
反射机制和动态代理机制是Java反序列化的必备知识
参考【2】,bit4woo一系列的文章讲的很详细了
小结
java反序列化没有魔术方法,反序列化问题基本都出现在自定义的readObject上。
其实一般不太可能有readObject上有直接可以命令执行的问题,而是会存在调用一些比较特殊的方法,比如AnnotationInvocationHandler readObject在default反序列化之后,会对Map进行set操作,问题出现在set上,这个下节再讨论。