关键点: 控制数据类型,就能控制程序流程
序列化是一种结构化数据,而Java的类也是一种结构化数据,类的设计因为加入很多限定有public、private之分,Java的反射又打破了这种限定,使得本来根植于代码或编译程序中的边界逻辑得以打破,让程序执行方向、流程得以改变。例如: ysoserial中的URLDNS,通过 Reflections.setFieldValue(u, "hashCode", -1); 将私有的hashCode设置为-1,从而在反序列化过程中改变数据流程导致远程代码执行,正常流程中在类的设计中是不能执行到该步骤的。
0x01 Java反序列化梳理
https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet
序号 | 类型 | 格式 | 说明 |
01 | Java Native Serialization | Binary | 通用利用,原生,ysoserial为工具 |
02 | XMLEncoder | XML | |
03 | XStream | XML/JSON/various | |
04 | Kryo | Binary | |
05 | Hessian/Burlap | Binary/XML | |
06 | Castor | XML | |
07 | json-io | JSON | |
08 | Jackson | JSON | |
09 | Fastjson | JSON | |
10 | Genson | JSON | |
11 | Flexjson | JSON | |
12 | Jodd | JSON | |
13 | Red5 IO AMF | AMF | |
14 | Apache Flex BlazeDS | AMF | |
15 | Flamingo AMF | AMF | |
16 | GraniteDS | AMF | |
17 | WebORB for Java | AMF | |
18 | SnakeYAML | YAML | |
19 | jYAML | YAML | |
20 | YamlBeans | YAML | |
21 | "Safe" deserialization | JAXB XmlBeans Jibx Protobuf GSON GWT-RPC |
0x02 CVEs总结
https://github.com/PalindromeLabs/Java-Deserialization-CVEs
0xA0 参考
Java-Deserialization-Cheat-Sheet
https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet
Java-Deserialization-CVEs