一、序列化和反序列化
1.什么是序列化和反序列化
序列化(Serialization):把对象转换为字符串进行存储的过程
反序列化(DeSerialization):把存储的字符串恢复为对象的过程
2.应用场景:
当对象需要被网络传输时
当对象状态需要被持久化时
3.序列化函数和反序列化函数:
①序列化:serialize()
O:1:"s":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
序列化时PHP 对不同类型的数据用不同的字母进行标示
a - array、b - boolean、d - double、i - integer、o - common object、r - reference、s - string、
C - custom object、O - class、N - null、R - pointer reference、U - unicode string
②反序列化:unserialize()
如果传递的字符串不可以序列化,则返回false.
如果对象没有预定义,反序列化得到的对象时_PHP_Incomplete_Class
反序列化与Maigc函数
_wakeup
_unserialize(7.4.0)
如果类中同时定义了_unserialize()和_wakeup()两个魔法函数,则只有_unseialize()方法会生效,_wakeup()方法会被忽略。
4.序列化和反序列化的作用
传输对象
用作缓存(cookie、session)
二、漏洞原理:
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题.如果一个PHP代码中使用了unserialize函数去调用某一个类,该类会自动执行一些自定义的魔法函数,如:_wakeup函数,如果该函数中执行的操作是我们可以注入数据的,那么很可能造成注入攻击。
一般的黑盒或者扫描很难发现反序列化漏洞,需要使用代码审计的方法,来发现。
PHP将所有以__(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以__为前缀。
1.什么是魔术方法?
系统在特定的时机自动调用的方法
2.常见的反序列化漏洞中出现的魔术方法及其触发条件:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串时使用
__sleep() 在对象在被序列化之前运行
__wakeup() 如果有,在反序列化之前调用
标签:__,php,函数,对象,PHP,wakeup,序列化 From: https://blog.csdn.net/2402_83134109/article/details/145047779