恢弘志士之气,不宜妄自菲薄。这篇文章主要讲述# 聊一聊悟空编辑器 #相关的知识,希望能为你提供帮助。
php反序列化
--韩子墨
为了有效的存储或传递数据,同时不丢失其类型和结构,经常需要序列化和反序列化的函数对数据进
行处理。
序列化:返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方。(对象变成字节流)
反序列化:对单一的已序列化的变量进行操作,将其转换回原来的值。(字节流变成对象)
这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
在PHP语言中常见的系列化和反系列化方式主要有:serialize,unserialize;json_encode,
json_decode。
序列化是什么样子的,常见的类型有什么?
例:O:11:"ctfShowUser":3:{s:5:"isVip";
b:1;
s:8:"username";
s:1:"a";
s:8:"password";
s:1:"a";
}
这里就是序列化,里面的O这是object 对象后面的11是这个对象的长度,3是指对象有3个字段,s则为字符串型的数据,5则表示后面字符串长度为5,b则是boolean(布尔)类型,1则是true,这里代表isVip的值为布尔类型的true,以此类推
常见的类型有:
a
array (数组类型)
b
boolean(布尔类型)
d
double (双精度)
i integer (整形)
o/C object (对象或者class)
r reference
N NULL (空或0或NULL)
s string(字符串型)
反序列化的样子
例:
object(ctfShowUser)#2 (3) { ["isVip"]=>
bool(true) ["username"]=>
string(1) "a" ["password"]=>
string(1) "a" }
表示对象或者类ctfShowUser 中有三个变量,isVip的变量值为bool类型的true,以此类推。
知道了序列化和反序列化后还应该知道魔法函数
在php的语法中,有一些系统自带的方法名,均以双下划线开头,它会在特定的情况下被调用。即所谓的魔法函数。
常见的魔法函数作用:
__construct() 对象初始化时会调用此方法(对于内核而言是指初始化完成后调用此方法).此方法用得比较多。
__destruct() 当对象销毁时会调用此方法.那么什么时候对象会销毁呢?一是用户主动销毁对象,二是当程序结束时由引擎自动销毁。
#主动销毁对象即unset($有对象的变量名)
__sleep() 当对象被序列化之前会调用此方法,sleep与serialize都是s开头所以可以这么记,当一个对象准备序列化的时候,那么对象要先睡着了才能序列化,所以调用sleep。
__wakeup() 当进行反序列化后,会调用此方法,可以这么记,字节流反序列化变回对象了,那么对象就该醒了。
__toString() 当对象或者类被当成字符串调用后会调用此方法,(醒醒该工作了,现在你是字符串了)。
例:一个魔术变量有问题的反序列化漏洞
此为payload生成脚本
Payload:
O:1:"a":1:{s:4:"test";
s:18:"<
?php phpinfo();
?>
";
}
测试:
【# 聊一聊悟空编辑器 #】
推荐阅读
- Python-Mail邮件发送
- 解密诡异并发问题的幕后黑手(可见性问题)
- Dokcer进阶-初识DockerFile
- 拉勾java高薪训练营
- 拉勾数据分析实战训练营
- 使用 du 检查 Linux 上已用的磁盘空间
- vim编辑器的常见使用
- 运维常问的面试题目
- Mac OS安装指南