反序列化漏洞是指在系统或应用程序接受序列化字符串进行解析时处理不当引发的安全漏洞。知名的有
反序列化和序列化是相对应的,序列化是将对象的状态信息转换为可以储存或传输的形式(字节序列)的过程,而反序列化是将序列化的字节序列还原成对象的过程。
Java语言中主要是:
XMLDecoder.readObject
Yaml.load
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject
PHP语言中主要是
serialize()
unserialize()
原理: 暴露或间接暴露反序列化 API ,导致用户可以操作传入数据,攻击者可以精心构造反序列化对象并执行恶意代码
两个或多个看似安全的模块在同一运行环境下,共同产生的安全问题 。
利用: 使用现有工具
原理: 当进行PHP反序列化操作时,如果传入了关于类的对象,会自动调用该类的一些方法,如:__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),__sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone(), and __autoload() 从而导致意外地执行了某些代码。
利用:
ac ed 00 05
,rO0AB
1099
端口Serializable
接口readObject()
方法是否重写,重写中是否有设计不合理,可以被利用之处这段PHP代码演示了一个对象的序列化过程,生成了包含不同数据类型的对象,并展示了其序列化后的字符串表示形式。
O:6:"ClassA":5:{
s:3:"int";i:1;
s:3:"str";s:5:"Hello";
s:4:"bool";b:0;
s:3:"obj";r:1;
s:2:"pr";R:3;
}
O: 表示类对象,后跟类名和属性数量。
s: 表示字符串,后跟字符串长度和内容。
i: 表示整数。
b: 表示布尔值。
r: 表示引用的序列化标识符。
R: 表示指针引用的序列化标识符