news 2026/5/9 1:35:29

[UUCTF 2022 新生赛]ezpop

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[UUCTF 2022 新生赛]ezpop

1.打开先看代码

<?php //flag in flag.php error_reporting(0); class UUCTF{ public $name; public $key; public $basedata; public $ob; function __construct($str){ $this->name=$str; } function __wakeup(){ if($this->key==="UUCTF"){ $this->ob=unserialize(base64_decode($this->basedata)); } else{ die("oh!you should learn PHP unserialize String escape!"); } } } class output{ public $a; function __toString(){ $this->a->rce(); } } class nothing{ public $a; public $b; public $t; function __wakeup(){ $this->a=""; } function __destruct(){ $this->b=$this->t; die($this->a); } } class youwant{ public $cmd; function rce(){ eval($this->cmd); } } $pdata=$_POST["data"]; if(isset($pdata)) { $data=serialize(new UUCTF($pdata)); $data_replace=str_replace("hacker","loveuu!",$data); unserialize($data_replace); }else{ highlight_file(__FILE__); } ?>

首先提示了flag在flag.php中

一个四个类、UUCTF、output、nothing、youwant

UUCTF类:

里面定义了四个公共属性,name、key、basedata、ob

construct方法,里面接收一个参数$str,触发了会让$str赋值给本类的name属性

wakeup方法,触发了会有一个if语句,判断本类的key属性的值是否强等于UUCTF,如果等于就将本类的basedata属性进行一个base64解码,然后再进行反序列化,最后赋值给本类的ob属性,如果key不为UUCTF就die退出

output类:

一个公共属性a

toString方法,触发了会让$this->a对象调用它的rce方法

nothing类:

三个公共属性,a、b、t

wakeup方法,触发了会让本类的a属性赋值一个空

destruct方法,触发了会让本类的t属性赋值给本类的b属性,然后die退出并输出本类的a属性的值

youwant类:

一个公共属性cmd

rce方法,触发了会eval执行本类的cmd属性的内容

然后下面POST传参一个data,然后赋值给$pdata

if检查有没有$pdata,有的话,先让它当成实例UUCTF类的参数,再进行反序列化,随后赋值给$data,随后进行一个检查,检查$data中是否有hacker,如果有的话就给替换成loveuu!,随后将值赋值给$data_replace,最后将$data_replace进行一个反序列化的操作

2.思路构造

首先看到str_replace替换,就想到字符串逃逸,然后他的替换由6位变成了7位,那么就是字符串逃逸增多,先看一下题目再想着逃逸的点在哪里

这题的链子很容易,就是

nothing :: destruct ---> output :: toString ---> youwant :: rce

但是我们看最后的执行参数,是要再经过UUCTF类实例化一遍完并且再经过一遍序列化的

这时候看UUCTF类,它最先触发的是wakeup方法,首先要满足他的if语句,让key为UUCTF,那么指定是这里逃逸无疑了,整段代码只有这一个需要满足的,接下来看里面的语句,首先是将本类的basedata属性进行一个base64解码,然后再进行反序列化的操作,既然这里的参数是basedata属性,那么链子的值是赋值给basedata的,然后这里name属性在key属性的前面,那么就是通过name的值,来逃逸key的UUCTF和我们的序列化的值了

那么接下来链子就变成了

UUCTF :: wakeup ---> nothing :: wakeup (因为反序列化会让他先触发,他是捣乱的,使用引用的方式绕过) nothing :: destruct ---> output :: toString ---> youwant :: rce

上面这是要正常的链子,然后接下来将base64编码后的序列化后的链子值带入到UUCTF中,为了满足参数

然后先正常序列化一下UUCTF类的属性看看是怎么情况

O:5:"UUCTF":4:{s:4:"name";s:1:"1";s:3:"key";s:5:"UUCTF";s:8:"basedata";N;s:2:"ob";N;}
其中紫色的字段是传参上去代码实例化UUCTF并序列化后自带的,红色部分是要逃逸的字段,来满足key为UUCTF,黄色的字段,是为了满足后面红色要逃逸字段的替换字符hacker(这里的name赋值为1是为了方便观看要逃逸的字段)

接下来将刚才序列化的链子传递上去,看看要逃逸的字符长度

O:5:"UUCTF":4:{s:4:"name";s:1:"1";s:3:"key";s:5:"UUCTF";s:8:"basedata";s:168:"Tzo3OiJub3RoaW5nIjozOntzOjE6ImEiO047czoxOiJiIjtSOjI7czoxOiJ0IjtPOjY6Im91dHB1dCI6MTp7czoxOiJhIjtPOjc6InlvdXdhbnQiOjE6e3M6MzoiY21kIjtzOjE3OiJzeXN0ZW0oJ3dob2FtaScpOyI7fX19";s:2:"ob";N;}

红色字体为要逃逸的部分,计算一下长度为228位,那么伪造228个hacker在前面

传参上去看看情况,成功执行whoami,接下来打开题目看一下

3.开始构造

然后将base64编码后的序列化的值,带入到UUCTF类中

要逃逸的长度位224,然后再生成224个hacker

然后带入到题目中

最后查看一下就行了

cat flag.php命令的长度是236位,需要伪造236个hacker,cat查看的flag是在源代码中

4.知识点

这题考验的是一个反序列化字符逃逸的增多

这题其实挺绕人的,一开始没关注那个wakeup以为绕过去了,结果还是栽在wakeup上了,看到了使用引用进行一个绕过

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 1:35:17

盛水最多的容器(滑动窗口 双指针)

这道题当然可以暴力求解&#xff0c;O(N^2),但是有时候并不会通过&#xff0c;因此要想一个时间复杂度为O&#xff08;N&#xff09;的方法。如果说用滑动窗口肯定会有人会有疑问&#xff0c;这怎么用&#xff1f;下面直接说解法&#xff1a;首先left与right分别指向数组的两边…

作者头像 李华
网站建设 2026/5/7 20:26:16

深度探究Span:.NET内存布局与零拷贝原理及实践

深度探究Span&#xff1a;.NET内存布局与零拷贝原理及实践 在.NET开发中&#xff0c;高效的内存管理至关重要&#xff0c;尤其在处理高性能、低延迟的应用场景时。Span<T> 类型应运而生&#xff0c;它为开发者提供了一种灵活且高效的内存操作方式&#xff0c;能够显著提升…

作者头像 李华
网站建设 2026/5/2 14:30:16

helm 部署 elasticsearch 栈

说明:本文使用的 chart 仓库名字为 elastic/cloud-on-k8s 地址为 elastic/cloud-on-k8s。 1、添加 repo 源 helm repo add elastic https://helm.elastic.co helm repo update2、安装 eck-operator ⚠️说明:ECK Operator(Elastic Cloud on Kubernetes)本身安装的东西其…

作者头像 李华
网站建设 2026/5/4 19:35:54

Qt定时器线程使用全解析

1.Qt定时器线程使用全解析在Qt框架中&#xff0c;定时器&#xff08;如QTimer&#xff09;的“使用线程”特指其所属线程&#xff08;即创建该定时器的线程&#xff09;必须是由QThread启动并管理、且运行了事件循环&#xff08;exec()&#xff09;的线程。这一规则涉及线程的创…

作者头像 李华
网站建设 2026/4/30 23:35:07

低代码开发的“真香”定律:从排斥到离不开

在数字化工具迭代的历史中&#xff0c;几乎所有颠覆性技术都曾经历过“从排斥到追捧”的转折——智能手机初现时&#xff0c;有人质疑“不如功能机耐用”&#xff1b;云计算普及前&#xff0c;企业担忧“数据放在云端不安全”&#xff1b;低代码开发如今的处境&#xff0c;亦复…

作者头像 李华
网站建设 2026/4/30 23:35:36

32、Django Web应用开发实战指南

Django Web应用开发实战指南 1. 网络应用概述 网络的规模极其庞大,上面充斥着人们日常依赖的各种应用程序。网络应用如此之多,主要有以下几个原因: - 普遍可访问性 :网络应用部署后,任何有权限访问的人只需在浏览器中输入URL即可使用。用户通常只需安装浏览器(他们可…

作者头像 李华