当前位置:网站首页>php反序列化结构知识点实例分析
php反序列化结构知识点实例分析
2022-07-29 21:22:00 【亿速云】
php反序列化结构知识点实例分析
本篇内容主要讲解“php反序列化结构知识点实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php反序列化结构知识点实例分析”吧!

简介
序列化的目的是方便数据的传输和存储,在PHP中,序列化和反序列化一般用做缓存,比如session缓存,cookie等。
反序列化中常见的魔术方法
__wakeup() //执行unserialize()时,先会调用这个函数
__sleep() //执行serialize()时,先会调用这个函数
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当尝试将对象调用为函数时触发
反序列化绕过小Trick
php7.1+反序列化对类属性不敏感
我们前面说了如果变量前是protected,序列化结果会在变量名前加上\x00*\x00
但在特定版本7.1以上则对于类属性不敏感,比如下面的例子即使没有\x00*\x00也依然会输出abc
<?phpclass test{ protected $a; public function __construct(){ $this->a = 'abc'; } public function __destruct(){ echo $this->a; }}unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');绕过_wakeup(CVE-2016-7124)
版本:
PHP5 < 5.6.25
PHP7 < 7.0.10
利用方式:序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
对于下面这样一个自定义类
<?phpclass test{ public $a; public function __construct(){ $this->a = 'abc'; } public function __wakeup(){ $this->a='666'; } public function __destruct(){ echo $this->a; }}如果执行unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');输出结果为666
而把对象属性个数的值增大执行unserialize('O:4:"test":2:{s:1:"a";s:3:"abc";}');输出结果为abc
绕过部分正则
preg_match('/^O:\d+/')匹配序列化字符串是否是对象字符串开头,这在曾经的CTF中也出过类似的考点
利用加号绕过(注意在url里传参时+要编码为%2B)
serialize(array(a ) ) ; / / a));//a));//a为要反序列化的对象(序列化结果开头是a,不影响作为数组元素的$a的析构)
<?phpclass test{ public $a; public function __construct(){ $this->a = 'abc'; } public function __destruct(){ echo $this->a.PHP_EOL; }}function match($data){ if (preg_match('/^O:\d+/',$data)){ die('you lose!'); }else{ return $data; }}$a = 'O:4:"test":1:{s:1:"a";s:3:"abc";}';// +号绕过$b = str_replace('O:4','O:+4', $a);unserialize(match($b));// serialize(array($a));unserialize('a:1:{i:0;O:4:"test":1:{s:1:"a";s:3:"abc";}}');利用引用
<?phpclass test{ public $a; public $b; public function __construct(){ $this->a = 'abc'; $this->b= &$this->a; } public function __destruct(){ if($this->a===$this->b){ echo 666; } }}$a = serialize(new test());上面这个例子将$b设置为$a的引用,可以使$a永远与$b相等
16进制绕过字符的过滤
O:4:“test”:2:{s:4:“%00*%00a”;s:3:“abc”;s:7:“%00test%00b”;s:3:“def”;}
可以写成
O:4:“test”:2:{S:4:“\00*\00\61”;s:3:“abc”;s:7:“%00test%00b”;s:3:“def”;}
表示字符类型的s大写时,会被当成16进制解析。
到此,相信大家对“php反序列化结构知识点实例分析”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
边栏推荐
猜你喜欢

【Verilog 设计】Verilog 实现偶数、奇数分频和任意小数分频

网络通信编程基础,BIO,NIO

普洛斯荣获两项“数据中心绿色等级评估”5A级认证

Cobaltstrike and BurpSuite desktop shortcut configuration

初识网络的简单概念

一文理解分布式开发中的服务治理

Qualcomm WLAN framework learning (31) -- Power save

336. Palindromic Pairs

Huawei Enjoy 50 Pro evaluation: HarmonyOS blessing is smoother and safer

Official announcement!Suzhou Wujiang Development Zone launches electronic labor contract platform
随机推荐
容器网络硬核技术内幕 (小结-中)
结合布林线理解现货白银走势图的方法
AI全流程开发难题破解之钥
The world is on fire, Google servers have crashed
Add a logo to the upper left corner of the picture, add time and address to the lower left corner, and wrap the line when the address reaches the specified length
mdnice-test
Cobaltstrike and BurpSuite desktop shortcut configuration
【AD】【持续更新ing】关于AD设计过程中一些小细节
初识网络的简单概念
南信大提出TIPCB,一个简单但有效的用于基于文本的人员搜索的基于部分的卷积baseline
什么是数据安全性?
给图片左上角加logo标识、左下角加时间和地址、地址到达指定长度换行
c#开发知识点总结
LeetCode--single linked list--146.LRU cache
applet preview pdf
阿里 P8 爆出的这份大厂面试指南,看完工资暴涨 30k!
对不起,你很难赚到中年人的钱
相亲信息
GBASE 8s 自动删除正在被使用的数据库
GBASE 8s 数据索引