序列化与反序列化

序列化 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值