反序列化漏洞
序列化基础知识
序列化:将一个对象转化成字节流 | 反序列化:将字串字符流还原成对象
php中用 serialize() 实现序列化 , 用unserialize()反序列化
例如序列: O:7:"Student":1:{s:4:"name";s:8:"deelmind";}
在属性各种类型的属性名被序列化的时候
protected属性被序列化的时候属性值会变成%00*%00属性名
private属性被序列化的时候属性值会变成%00类名%00属性名
- 变量类型:7位字符(类名长度):"类名名称":属性数量:

反序列化漏洞:利用系统在调用unserialize()的时候会触发魔法函数 ,而如果这些魔法函数中包含一些比较危险的函数,而这个危险函数里面参数是我们可控的,那我们就可以精心构造一个序列 ,让它反序列化(反序列化过程中对一些参数赋值),达到攻击效果。
__construct():当对象创建(new)时会自动调用。(构造函数)
__destruct():当对象被销毁时会自动调用。(析构函数)
__wakeup():unserialize() 时会自动调用。
__sleep():serialize()时会自动调用
__tosting(): 把类当作字符串使用时触发
__get(): 用于从不可访问的属性读取数据
invoke():当把一个类当作函数使用时自动调用
类型一:普通反序列化漏洞
反序列化漏洞题目:https://www.freebuf.com/column/151447.html
该类题型是结合 --伪协议php://input (post传参)来满足题目条件--存在include()文件包含,用php://filter 来读取服务器上的php文件--最后一个参数才涉及到反序列化漏洞
类型二:绕过wakeup()函数的反序列化漏洞

绕过_wakeup():将属性数量设置为比真实属性数量大,就不会执行_wakeup()函数
类型三:Session反序列化漏洞:
原理是利用php中存储session不是存储在内存中的,而是存储成文件的,而存储方式有下面三种。
对于session存储
的时候,会将其序列化,利用这个php存储session的特殊的序列化产生漏洞。
php中存储session方法
各种处理方式对应的session格式
"php":

"php_binary":

"php_serialize":


博客讲解 :https://blog.csdn.net/nzjdsds/article/details/82703639?utm_source=app
类型四:反序列化字符逃逸
类型题目:[安洵杯 2019]easy_serialize_php
原理:在一个序列x:x{xxxxx} 花括号的后面添加字符后不会改变本来反序列后的结果,因此可以精心构造序列化的属性,利用闭合关系改变本来题目的属性(或者说使后面的某些属性无效)
1.按正常需求填入参数 先弄出序列

2.从‘将被替换成空的变量’后面的引号开始往后一直数到下一个属性分号之前(主要数出来的数最好是被替换字符的整数倍,如flag的四倍24等)
3.根据上面将变量修改后 先序列化出来看看 
- 在后面增加属性值(确保和原本题目序列化后数量一样


浙公网安备 33010602011771号