序列化与反序列化
序列化 serialize() 把复杂的数据类型转化为字符串,方便存储和传输。数据类型可以是字符串,数组,对 象等
反序列化 unserialize() 将字符串转化为原始数据类型
- 漏洞成因:
将传来的序列化数据直接unserilize,造成魔幻函数执行
PHP Session序列化及反序列化处理器设置不当
序列化字符串格式
序列化对于不同类型得到的字符串格式为:
String : s:size:value;
Integer : i:value;
Boolean : b:value;(保存1或0)
Null : N;
a:<n>:{<key 1><value 1><key 2><value 2>...<key n><value n>}
其中 <n>
表示数组元素的个数,<key 1>、<key 2>……<key n>
表示数组下标,<value 1>、<value 2>……<value n>
表示与下标相对应的数组元素的值。
对象(object)通常被序列化为:
O:<length>:"<class name>":<n>:{<field name 1><field value 1><field name 2><field value 2>...<field name n><field value n>}
其中 <length>
表示对象的类名 <class name>
的字符串长度。<n>
表示对象中的字段个数。这些字段包括在对象所在类及其祖先类中用 var、public、protected 和 private 声明的字段,但是不包括 static 和 const 声明的静态字段。也就是说只有实例(instance)字段。<filed name 1>、<filed name 2>……<filed name n>
表示每个字段的字段名,而 <filed value 1>、<filed value 2>……<filed value n>
则表示与字段名所对应的字段值。
O:3:“foo”:2:{s:4:“file”;s:9:“shell.php”;s:4:“data”;s:5:“aaaaa”;}
O:3 参数类型为对象(object),
“foo”:2 参数名为foo,有两个值
s:4:“file”;s:9:“shell.php”; 参数类型为字符串,长度为4,参数值为shell.php
object foo,属性file:shell.php,属性data:aaaaa
魔术函数
__construct() – 当一个对象被创建时调用
__destruct() – 当一个对象被销毁时调用
__sleep() – serialize()函数会调用该方法,用于清理对象,并返回一个 包含对象种所有应被序列化的变量名称的数组
__wakeup() – unserialize()函数会调用该方法,预先准备对象需要的资 源
_toString() – 用于一个类被当成字符串时应怎样回应
__invoke() – 当尝试以调用函数的方式调用一个对象时会调用该方法
CVE-2016-7124
当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过 __wakeup的执行。
SugarCRM v6.5.23 PHP反序列化对象注入漏洞分析 http://paper.seebug.org/39/
由HITCON 2016一道web聊一聊php反序列化漏洞 http://www.freebuf.com/vuls/116705.html
上一篇: js拷贝指定内容到剪切板