反序列化|序列化

!!!反序列化是比较重要的,可以多方面找资源学习。
序列化(串行化):是将变量转换为可保存或传输的字符串的过程(将程序对象(内存中的数据)转为方便存储的格式存储在文件(磁盘中),即内存->磁盘);
反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用;
这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
图一
对象->字符串 –序列化–serialize()
字符串->对象 –反序列化–unserialize()

PHP反序列化

图二
参考:
反序列化详解:
https://xz.aliyun.com/t/12507
https://www.php.cn/faq/454909.html
https://blog.csdn.net/m0_69637056/article/details/125692222
魔术方法详解:
https://www.cnblogs.com/20175211lyz/p/11403397.html
https://blog.csdn.net/qq_51295677/article/details/123394848
1、原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码
执行,SQL 注入,目录遍历等不可控后果。
2、如果代码中存在类(class):在反序列化的过程中可能会自动触发某些魔术方法。
PHP进行反序列化的两个函数:
serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象
反序列化漏洞触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:
serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象
触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:
__construct() //创建对象时触发
__destruct() //对象被销毁时以及调用serialize()触发
__wakeup() //调用unserialize()前,即反序列化前触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发

具体分析

php反序列化热身–无类–本地–简单了解原理:7:00
php反序列化ctf真题–无类–实例–加深了解原理:24:00
0、序列化的输出形式
图三
1、序列化后(无类)的输出结果:
图四
1.1、反序列化(无类)后的输出结果:
图五
2、===(强类型对比)是全等,两边类型和值都一样才行。==(弱类型对比)含有隐形转换,会将两边的值按一定规则转换后作比较。=是赋值。
3、ctf代码存在先后以及逻辑问题,一定要看清楚。
php反序列化–有类魔术方法触发–本地–重点学习:39:00
php反序列化网鼎杯真题–有类魔术方法触发–实例–重点学习:51:00
1、魔术方法就是代码在执行的时候,执行到某一函数就会被隐式调用的方法(与vue框架的钩子函数对比?)。
2、有类情况下的简单输出
图六
3、网鼎杯解题思路
图七
(1)、有new就有构造,然后代码结束依次销毁用析构函数。
(2)、这道题写一个类就是为了传参数,把参数序列化利于传输。
4、反序列化,你要自己懂得如何serialize() unserialize()相互转化,以及它们之间的相互转化的PHP代码如何去写。
5、序列化的值利于传输、反序列化的利于还原和编译?

总结

1、关于反序列化作用的小结:1:25:00
2、php反序列化,由于魔术方法的调用,可能会造成sql注入等的其他漏洞,这就是php反序列化漏洞。
图八

一些进阶小技巧:https://zhuanlan.zhihu.com/p/628402113
https://blog.csdn.net/m0_64815693/article/details/127982134