网安学习第24天 PHP安全——PHP反序列化

news2026/5/25 17:34:28
一、序列化与反序列化1、序列化serialize()序列化是什么序列化就是把程序中的对象、数组、结构体等复杂数据转换成可以存储或传输的格式。简单说把“内存里的对象”变成“字符串/字节流”。例如 PHP 中有一个对象$user [ name admin, age 18 ];序列化后可能变成a:2:{s:4:name;s:5:admin;s:3:age;i:18;}其中各个字段代表的含义常见序列化格式包括JSON XML YAML PHP serialize Java Serializable Python pickle2、反序列化unserialize()序列化是什么反序列化就是把序列化后的字符串/字节流还原成程序中的对象或数据结构。简单说把“字符串/字节流”重新变回“内存里的对象”。例如$data a:2:{s:4:name;s:5:admin;s:3:age;i:18;}; $user unserialize($data);反序列化后$user又变成了数组[ name admin, age 18 ]所以序列化与反序列化 的操作可以直观地看作为3\3、为什么反序列化会有漏洞问题核心在于如果程序反序列化了用户可控的数据就可能被攻击者构造恶意对象。危险点不是“反序列化”本身而是反序列化的数据来自用户输入 程序中存在危险的魔术方法/特殊方法 这些方法里有文件操作、命令执行、SQL操作等危险逻辑就可能形成反序列化漏洞。4. PHP 反序列化漏洞例子例如 PHP 中有一个类?php class Test { public $cmd; function __destruct() { system($this-cmd); } } ?这里的__destruct()是魔术方法对象销毁时会自动执行。如果程序这样写$data $_GET[data]; unserialize($data);那么攻击者可以构造一个恶意序列化字符串O:4:Test:1:{s:3:cmd;s:2:id;}反序列化后程序会创建Test对象并且$cmd id。脚本结束时触发__destruct()于是执行system(id);这就可能造成RCE远程命令执行。二、常见的魔术方法__construct(): //当对象new的时候会自动调用__destruct()//当对象被销毁时会被自动调用__sleep(): //serialize()执行时被自动调用__wakeup(): //unserialize()时会被自动调用__invoke(): //当尝试以调用函数的方法调用一个对象时会被自动调用__toString(): //把类当作字符串使用时触发__call(): //调用某个方法,若方法存在,则调用;若不存在,则会去调用__call函数。__callStatic(): //在静态上下文中调用不可访问的方法时触发__get(): //读取对象属性时,若存在,则返回属性值;若不存在则会调用__get函数__set(): //设置对象的属性时,若属性存在,则赋值;若不存在,则调用__set函数。__isset(): //在不可访问的属性上调用isset()或empty()触发__unset(): //在不可访问的属性上使用unset()时触发__set_state()调用var_export()导出类时此静态方法会被调用__clone()当对象复制完成时调用__autoload()尝试加载未定义的类__debugInfo()打印所需调试信息三、反序列化漏洞利用1、POP链POP 链就是 PHP 反序列化漏洞里的“调用链”。全称Property-Oriented Programming Chain面向属性编程链。它的核心是攻击者通过控制反序列化对象的属性让程序自动触发魔术方法然后一步步调用已有代码最后到达危险函数。POP常用于上层语言构造特定调用链的方法序列化攻击都在PHP魔术方法中出现可利用的漏洞因自动调用触发漏洞但如关键代码没在魔术方法中而是在一个类的普通方法中。这时候就可以通过构造POP链寻找相同的函数名将类的属性和敏感函数的属性联系起来。2. POP 链的基本结构一条 POP 链一般有三部分入口点 Trigger ↓ 中间跳板 Gadget ↓ 危险终点 Sink入口点 Trigger一般是魔术方法例如__destruct() __wakeup() __toString()中间跳板 Gadget就是普通业务代码中的方法比如$this-obj-run(); $this-handler-save(); $this-logger-write();这些方法本来可能不是漏洞但可以被攻击者利用来继续调用下一个对象。危险终点 Sink最终危险操作例如system() eval() assert() include() require() file_put_contents() unlink()3. 一个简单例子看这三个类class A { public $b; public function __destruct() { $this-b-run(); } } class B { public $c; public function run() { $this-c-write(); } } class C { public $filename; public $content; public function write() { file_put_contents($this-filename, $this-content); } }单独看A::__destruct() B::run() C::write()都像正常代码。但是如果程序中有unserialize($_COOKIE[user]);攻击者就可能构造对象关系A 对象 └── b B 对象 └── c C 对象 ├── filename 可控文件名 └── content 可控内容执行流程变成unserialize() ↓ 恢复 A 对象 ↓ 脚本结束触发 A::__destruct() ↓ 调用 $this-b-run() ↓ 进入 B::run() ↓ 调用 $this-c-write() ↓ 进入 C::write() ↓ file_put_contents($filename, $content)这就是一条 POP 链。三、属性类型1、对象变量属性public(公共的):在本类内部、外部类、子类都可以访问protect(受保护的):只有本类或子类或父类中可以访问private(私人的):只有本类内部可以使用2、序列化数据显示public属性序列化的时候格式是正常成员名private属性序列化的时候格式是%00类名%00成员名protect属性序列化的时候格式是%00*%00成员名3、例?php header(Content-type: text/html; charsetutf-8); //public private protected说明 class test{ public $namexiaodi; private $age31; protected $sexman; } $anew test(); $aserialize($a); print_r($a); ?输出为O:4:test:3:{s:4:name;s:6:xiaodi;s:9: test age;s:2:31;s:6: * sex;s:3:man;}其中age —— test age sex —— * sex四、漏洞绕过1、__wakeup绕过为什么要绕过__wakeup()因为有些反序列化利用链中__wakeup()会破坏攻击者控制的属性。比如class Test { public $cmd; public function __wakeup() { $this-cmd echo safe; } public function __destruct() { system($this-cmd); } }攻击者本来想控制$cmd id;但是反序列化时会先触发__wakeup()把$cmd改成echo safe这样 POP 链就被破坏了。所以绕过__wakeup()的目的就是让对象恢复出来 但是不执行 __wakeup() 保留攻击者控制的属性 等到 __destruct() 或其他方法触发当属性数量不一致时会绕过__wakeup()正常序列化对象O:4:Test:1:{s:3:cmd;s:2:id;}这里属性数量是1。因为只有一个属性$cmd如果把属性数量故意改大O:4:Test:2:{s:3:cmd;s:2:id;}注意这里属性数量从 1 改成了 2。但实际后面只有一个属性。在部分老版本 PHP 中这种属性数量不一致会导致对象仍然可能被反序列化 但是 __wakeup() 不会被调用于是就达到了绕过效果。2、字符逃逸字符逃逸在 PHP 反序列化里核心意思是原本应该被当成“普通字符串内容”的字符因为长度变化或过滤处理逃出了字符串边界被unserialize()当成了新的序列化结构来解析。它经常出现在serialize() ↓ 字符串过滤 / 替换 ↓ unserialize()这个流程里。参考php反序列化-字符逃逸看这一篇就够了_php 反序列化-CSDN博客五、反序列化链项目1、-NotSoSecurehttps://github.com/NotSoSecure/SerializedPayloadGenerator为了利用反序列化漏洞需要设置不同的工具如 YSoSerial(Java)、YSoSerial.NET、PHPGGC 和它的先决条件。DeserializationHelper 是包含对 YSoSerial(Java)、YSoSerial.Net、PHPGGC 和其他工具的支持的Web界面。使用Web界面您可以为各种框架生成反序列化payload.Java – YSoSerial NET – YSoSerial.NET PHP – PHPGGC Python - 原生2、-PHPGGChttps://github.com/ambionics/phpggcPHPGGC是一个包含unserialize()有效载荷的库以及一个从命令行或以编程方式生成它们的工具。当在您没有代码的网站上遇到反序列化时或者只是在尝试构建漏洞时此工具允许您生成有效负载而无需执行查找小工具并将它们组合的繁琐步骤。 它可以看作是frohoff的ysoserial的等价物但是对于PHP。目前该工具支持的小工具链包括CodeIgniter4、Doctrine、Drupal7、Guzzle、Laravel、Magento、Monolog、Phalcon、Podio、ThinkPHP、Slim、SwiftMailer、Symfony、Wordpress、Yii和ZendFramework等。七、反序列化框架利用-ThinkPHPYiiLaravel通过上述工具构造payload实现反序列化

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…