当前位置:网站首页>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反序列化结构知识点实例分析”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
边栏推荐
猜你喜欢

5V升压充电8.4V芯片

HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界

WeChat Mini Program 31 Subcontracting Mechanism

防火墙——SNAT和DNAT策略的原理及应用、防火墙规则的备份和还原

1. Promise usage in JS, 2. The concept and usage of closures, 3. The difference between the four methods and areas of object creation, 4. How to declare a class

iNFTnews | 福布斯的Web3探索

Second Best PyTorch Beginner Course; Thesis Writing Guide; Using µGo to Develop a Mini Compiler; Super Efficient Use of Transformer's Extension Library; Frontier Papers | ShowMeAI News Daily

24-hour London gold chart analysis

TCP协议详解

解释器模式
随机推荐
新库上线 | CnOpenData租赁和商务服务业工商注册企业基本信息数据
Bug fix: Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255]
"Introduction to nlp + actual combat: Chapter 7: Dataset loading in pytorch and the use of its own datasets"
【CVPR2022】A Unified Query-based Paradigm for Point Cloud Understanding
南华早报 | 助力亚洲最具公信力报章实现AD域自动化管理
小程序微信定位不准
5 V booster charge 8.4 V chip
Cobaltstrike and BurpSuite desktop shortcut configuration
银河麒麟V10 SP2 x86编译安装 PHP7.4
GBASE 8s PAM插入式身份验证模块
GBASE 8s 数据库的备份创建
数字孪生万物可视 | 联接现实世界与数字空间
Numpy array processing (2)
[Database] mysql date format conversion
一文理解分布式开发中的服务治理
网站ping端口的操作方法和命令介绍
applet preview pdf
GBASE 8s 数据库的恢复
【HDLBits 刷题】Verilog Language(4)Procedures 和 More Verilog Features 部分
普洛斯荣获两项“数据中心绿色等级评估”5A级认证