漏洞学习篇之反序列化

1序列化与反序列化答疑

什么是序列化

Serialization 序列化是将 对象 的 状态信息 转换为可以 存储 或者 传输 的 过程。在序列化期间,对象将其当前的状态写入到临时或者持久性存储区。 以后,可以通过 从存储区中读取 反序列化对象的状态,重新创建该对象

简单的讲:将PHP中的 对象、类、 数组、变量、匿名函数等,转化为字符串,方便保存到数据库或者文件中

什么是反序列化

序列化是将对象的状态信息转化为字符串存储起来。那反序列化就是将这个状态信息拿出来使用(重新再转化为对象或者其他的)

2举个小栗子

Serialize()和unserialize()函数

这两个是序列化中常用函数。

下面看一个小栗子。

<?php
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); 
//序列化数组
$s = serialize($a);
echo $s;
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}
echo '<br /><br />';
 //反序列化
$o = unserialize($s);
print_r($o);
//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut ) 
?>

序列化与反序列化在PHP实现上是没有漏洞的,漏洞主要是产生在 应用程序在处理对象,魔术方法相关问题的时候出现的

当传给 unserialize()的参数可控时,此时 攻击者 提交构造的 payload 。当进行反序化的时候 就有可能触发 对象中的一些 魔术方法,造成危害。

例如 在上面的小栗子中,当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。

3常见的魔术方法

__construct()//创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
__sleep()  //serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
_toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值