反序列化提升刷题

例题:

<?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就好了。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AcWing 843. n-皇后问题

#include <iostream> #include <cstring> #include <algorithm>using namespace std; const int N 10; int n; int col[N], dg[N N], rdg[N N]; // 列占用// 正对角线占用// 副对角线占用 char table[N][N]; // 棋盘void dfs(int index) {if(i…

大型语言模型综述/总结 LLM A Survey of Large Language Models

A Survey of Large Language Model AbstractINTRODUCTIONOVERVIEW背景LLM的新兴能力LLM的关键技术GPT 系列模型的技术演进 大语言模型资源公开可用的模型检查点或 API常用语料库代码库资源 预训练数据收集架构 论文标题&#xff1a;A Survey of Large Language Model 论文地址&…

ssm基于java的智能训练管理平台论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#x…

Required request parameter ‘ids‘ for method parameter type List is not present]

在写delete方法的时候&#xff0c;出现了bug 于是将RequestParam换成PathVariable 两者有何区别&#xff1f; pathVariable和RequestParam的区别 在Spring MVC框架中&#xff0c;PathVariable 和 RequestParam 是两种用于从HTTP请求中获取参数的注解&#xff0c;它们的区别…

【前后端的那些事】开源!快速上手富文本+富文本图片上传

文章目录 fullText富文本1. 后端接口1.1 定义常量1.2 定义返回实体类1.3 上传图片接口1.4 下载图片接口 2. 前端代码编写2.1 安装2.2 快速使用 3. 配置富文本图片上传地址3.1 配置图片上传配置 4. 全部代码展示 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能…

基于卡尔曼滤波的视频跟踪,基于卡尔曼滤波的运动小球跟踪

目录 完整代码和数据下载链接&#xff1a;基于卡尔曼滤波的视频跟踪&#xff0c;基于卡尔曼滤波的运动小球跟踪&#xff08;代码完整&#xff0c;数据齐全&#xff09;资源-CSDN文库 https://download.csdn.net/download/abc991835105/88738577 卡尔曼滤波原理 RBF的定义 RBF理…

rime中州韵小狼毫 敏感词脱敏滤镜

快速录入&#xff0c;是任何一个输入法&#xff0c;以及输入人员&#xff08;无论是否专业&#xff09;的追求目标之一。现实中&#xff0c;由于各种输入法在录入文本时&#xff0c;都无法完全避免重码的问题&#xff0c;所以在输入过程中都或多或少的需要进行选字/选词操作。这…

camtasia studio2024免费版如何下载?怎么录屏?

camtasia studio怎么录屏&#xff1f;Camtasia Studio是一款专门录制屏幕动作的工具&#xff0c;它能在任何颜色模式下轻松地记录屏幕动作&#xff0c;包括影像、音效、鼠标移动轨迹、解说声音等等。一般情况下&#xff0c;用户使用camtasia studio进行录屏时&#xff0c;需要注…

计算机网络夯实之路-HTTP详解

了解 Web 及网络基础 根据 Web浏览器地址栏中指定的 URL&#xff0c;Web浏览器从Web服务器端获取文件资源&#xff08;resource&#xff09;等信息&#xff0c;从而显示出 Web 页面。 通过发送请求获取服务器资源的 Web 浏览器等&#xff0c;都可称为客户端&#xff08;clien…

RibbonGroup 添加QRadioButton

RibbonGroup添加QRadioButton&#xff1a; QRadioButton * pRadio new QRadioButton(tr("Radio")); pRadio->setToolTip(tr("Radio")); groupClipboard->addWidget(pRadio); connect(pRadio, SIGNAL(clicked(…

如何使用C++编程使得在Windows和Linux输入密码的时候保密 linux:tcgetattr tcsetattr

在C编程中&#xff0c;在执行一些操作的时候&#xff0c;终端需要接收用户名和密码&#xff0c;那么在终端输入密码的时候&#xff0c;如何不让别人看见自己的密码&#xff0c;是一个较为关注的问题&#xff1b; 1、问题分析 定义一个登录函数Login //用户登录主循环bool Lo…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存&#xff08;C&#xff09;&#xff09; Baumer工业相机Baumer工业相机的图像高速保存的技术背景Baumer工业相机通过NEOAPI SDK函数图像高速保存在NEOAPI SDK里实现线程高速图像保存&#xff1a;工业相机高…

(分享) 音乐软件Spotify-声破天8.9.4

​【应用名称】&#xff1a;Spotify-声破天 ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#Spotify ​【应用版本】&#xff1a;8.8.96 → 8.9.4 ​【应用大小】&#xff1a;67MB ​【软件说明】&#xff1a;软件升级更新。iOS可配合qx小火箭类的工具对…

SpringMVC RESTful

文章目录 1、RESTful简介a>资源b>资源的表述c>状态转移 2、RESTful的实现3、HiddenHttpMethodFilter 1、RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 a>资源 资源是一种看待服务器的方式&#xff0c;即&…

一、Mindspore 公开课 - Transformer

课程链接&#xff1a;Mindspore 技术公开课 Transformer 论文地址&#xff0c;建议看完课程以后简单看看论文 前言 Transformer是一种神经网络结构&#xff0c;由Vaswani等人在2017年的论文“Attention Is All You Need” 中提出&#xff0c;用于处理机器翻译、语言建模和文…

行为型设计模式——命令模式

命令模式 日常生活中&#xff0c;我们出去吃饭都会遇到下面的场景。 定义&#xff1a; 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储、传递、调用、增加与管理。命…

【Golang开源项目】Golang高性能内存缓存库BigCache设计与分析

项目地址 BigCache 是一个快速&#xff0c;支持并发访问&#xff0c;自淘汰的内存型缓存&#xff0c;可以在存储大量元素时依然保持高性能。BigCache将元素保存在堆上却避免了GC的开销。 背景介绍 BigCache的作者在项目里遇到了如下的需求&#xff1a; 支持http协议支持 10…

四、Qt 的第一个demo

在上一篇章节里《三、Qt Creator 使用》&#xff0c;我们介绍了如何使用Qt Creator创建一个简单的带窗体的demo&#xff0c;在这一章节里&#xff0c;我们详细讲解一下这个demo的文件组成&#xff0c;及主函数&#xff0c;并在UI上加一些控件&#xff0c;实现一些简单的功能。 …

C# Winform翻牌子记忆小游戏

效果 源码 新建一个winform项目命名为Matching Game&#xff0c;选用.net core 6框架 并把Form1.cs代码修改为 using Timer System.Windows.Forms.Timer;namespace Matching_Game {public partial class Form1 : Form{private const int row 4;private const int col 4;p…