php浅析反序列化结构

php浅析反序列化结构

目录

简介

反序列化中常见的魔术方法

反序列化绕过小Trick

绕过_wakeup(CVE-2016-7124)

绕过部分正则

利用引用

16进制绕过字符的过滤

简介

序列化的目的是方便数据的传输和存储,在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

<?php class 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的执行

对于下面这样一个自定义类

<?php class 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的析构)

<?php class 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";}}'); 利用引用 <?php class 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浅析反序列化结构的文章就介绍到这了,更多相关php反序列化内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    php脚本电脑关机|电脑关机的脚本

    php脚本电脑关机|电脑关机的脚本,,1. 电脑关机的脚本推荐 AutoIt 自动化脚本 其他 按键精灵、……、AutoHotKey、vbs …… 2. 电脑关机

    PHP什么意思

    PHP什么意思,语言,是一种,PHP什么意思PHP,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写。PHP 是一种 HTM

    创业做网站选择用node好还是php

    创业做网站选择用node好还是php,语言,页面,如果你所开发的是一个PHP网站的前端页面或模板,PHP和Python语言都相对比较简单,所以虽然PHP语

    如何进行phpmyadmin配置 phpmyadmin快速配置方法【详细介绍】

    如何进行phpmyadmin配置 phpmyadmin快速配置方法【详细介绍】,配置,文件,密码,快速,安装配置,方法,    phpmyadmin 配置怎么配置?今天提一下

    php是什么文件格式 php文件打开方法

    php是什么文件格式 php文件打开方法,文件,语言,点击,打开方式,选择,执行,  php文件是一种不能轻易打开的文件,许多人都遇到过点击了php文件后

    PHP文件怎么打开

    PHP文件怎么打开,文件,下载,脚本,怎么打开,语言,选择,PHP文件怎么打开PHP文件一般用Notepad Plus软件打开。PHP文件怎么打开?其实大家并非是需

    php是什么意思

    php是什么意思,执行,语法,语言,特性,文档,脚本语言,php是什么意思很多行外人看到php这三个英文会毫无头绪,完全不知道php是什么意思,本文为大家详

    php 删除数组重复的值

    php 删除数组重复的值,数组,函数,本文目录php 删除数组重复的值如何正确实现PHP删除数组重复元素PHP二维数组如何实现去除重复项php数组怎

    php是前台还是后端语言

    php是前台还是后端语言,语言,支持,语法,性能,版本,提升,php是后端语言,后端是管理、运营、数据挖掘等非面向访问者的东西;php就是在服务器端执行

    PHP中的Yii框架指南

    PHP中的Yii框架指南,框架,安装,配置,应用程序,支持,验证,PHP语言是一门广泛应用的开源脚本语言,它凭借其灵活、高效、安全和易用的特性,成为了网

    聊聊php滑动验证码的实现原理

    聊聊php滑动验证码的实现原理,验证码,滑块,验证,实现原理,图形,拖动,随着互联网的迅速发展,验证码成为了互联网安全保障的重要手段。其中,滑动验

    php的注释有几种

    php的注释有几种,注释,单行注释,作用,多行注释,执行,这是,php的注释有三种,分别是:1、单行注释【//】;2、单行注释【#】;3、多行注释【/** */】。ph

    bcadd php是函数还是扩展

    bcadd php是函数还是扩展,函数,精度,数字,设置,字符串,操作数,bcadd是php中的一个函数,作用是计算两个任意精度数字的加法,该函数的使用语法如“b

    php如何把一个数组倒序输出

    php如何把一个数组倒序输出,输出,数组,倒序,方法,循环,函数,PHP是一种流行的服务器端脚本语言,常用于Web开发。在PHP中,数组是一种非常常见的数据