php反序列化字符逃逸
php反序列化和序列化
-
PHP序列化:serialize()
序列化是将变量或对象转换成字符串的过程,用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。“序列化”是一种把对象的状态转化成字节流的机制
类似于这样的结构:
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
对象类型:名称长度:对象名称:对象个数:{属性类型:属性长度:属性名称;内容类型:内容长度:内容;}
;是用来分隔属性的
- PHP反序列化:unserialize()
反序列化是将字符串转换成变量或对象的过程,“反序列”是把序列化成的字节流用来在内存中重新创建一个实际的对象。这个机制被用来“持久化”对象
- 二者关系
(这里参考大佬的文章在这里说明一下,引用的文章在末尾会提到)
对象被转换成“字节流”后可以存入文件,内存,或者是数据库内进行持久化保存。然后通过“反序列化”可以把“字节流”转换成实际的对象
反序列化字符逃逸
(这里在网上看到了很多大佬的文章,其实讲的我都有点看不太懂,最后在准备放弃的时候,看到了路另外一个大佬写的文章,这里给大家分享一下,接下来我的实践部分也是基于大佬的文章,大佬文章献上:PHP反序列化字符逃逸详解_php filter字符串溢出-CSDN博客 )
其实php反序列化本质就是改变序列化字符串的长度,导致反序列化漏洞
该漏洞利用的是:反序列化的过程是有一定识别范围的,在这个范围之外的字符(如花括号外的字符串)都会被忽略,不影响反序列化的正常进行
就例如,
$str=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
$str=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";} abcd
两个的执行结果是一样的
反序列化字符逃逸类型的题有哪些共同点:
- php序列化后的字符串经过了替换或者修改,导致字符串长度发生变化。(如filter函数)
- 总是先进行序列化,再进行替换修改操作。
一般有两种情况,第一种:替换修改后导致序列化字符串变长
第二种:替换修改后导致序列化字符串变短
替换修改后导致序列化字符串变长:
代码如下
这段代码的意思是,将$str参数里面的bb替换成ccc,然后将name赋值为aaaa,pass赋值为123456,两个设置为公有属性,然后进行反序列化,输出pass变量
我们想要的是如何在不直接修改pass的值的条件下,间接修改输出的pass的值
代码如下
我们可以看到,反序列化字符串都是以一";}
结束的,所以如果我们把";}
带入需要反序列化的字符串中(除了结尾处),就能让反序列化提前闭合结束,后面的内容就会被丢弃(利用的就是php反序列化识别有限的条件)
在上面的例子中,123456就是被丢弃的值
在反序列化的时候php会根据s所指定的字符长度去读取后边的字符。如果指定的长度s错误则反序列化就会失败
这里用大佬的图
此时的name所读取的数据为aaaa"
而正常的语法是需要用";
去闭合当前的变量,而因为长度错误所以此时php把闭合的双引号当做了字符串,所以下一个字符就成了分号,没能闭合导致抛出了错误
如果我们将name变量中添加bb则程序就会报错,因为bb将被filter函数替换成ccc,ccc的长度比bb多1,这样前面的s所代表的长度为6但是内容却变长了,成了ccc。
可见在序列化后的字符串在经过filter函数过滤前,s为6,内容为aaaabb;经过filter过滤后,s仍然为6,但内容变为了aaaaccc,长度变成了7,根据反序列化读取变量的原则来讲,此时的name能读取到的只是aaaacc,末尾处的那个c是读取不到的,这就形成了一个字符串的逃逸。当我们添加多个bb,每添加一个bb我们就能逃逸一个字符,那我们将逃逸的字符串的长度填充成我们要反序列化的代码长度的话那就可以控制反序列化的结果以及类里面的变量值了。
假如我们要在name处改为上一个";s:4:"pass";s:6:"hacker";}
来间接修改pass的值,如果我们只是单纯的把它加进去的话,就像下面这样:
class A{
public $name='";s:4:"pass";s:6:"hacker";}';
public $pass='123456';
}
由于$name
被序列化后的长度是固定的,在反序列化后$name
仍然为";s:4:"pass";s:6:"hacker";}(长度为27)
,$pass
仍然为123456
:
这里的关键点在于filter函数,这个函数检测并替换了非法字符串,看似增加了代码的安全系数,实则让整段代码更加危险。filter函数中检测序列化后的字符串,如果检测到了非法字符'bb',就把它替换为'ccc'。
此时我们发现";s:4:"pass";s:6:"hacker";}的长度为27,如果我们再加上54个bb,那最终的长度将增加27(也就是81个c),不就能逃逸后面的";s:4:"pass";s:6:"hacker";}了吗,这样真实的pass为123456就被丢弃了,识别的以为pass是hacker。
可见,成功逃逸,成功修改了pass的值。
具体分析如下:
逃逸或者说被 “顶” 出来的payload就会被当做当前类的属性被继续执行。
这里插入一点我自己的理解
(这里我在大佬源代码的基础上又改了一点,改成1个b换成两个c(感觉好像能看出点什么规律)
- 1个b换成两个c
这里需要注意的是,我们需要挤出去的payload为";s:4:"pass";s:6:"hacker";}(27长度)
- 那我们再试试改成1个b可以换4个c
这里我是列方程式做出来的
我们不妨列方程式(?代表输入b的倍数)
?b+27=4?b,解得b=9,所以我们这里输9个b就能溢出
- 这里我又做了变形,把bb能换成ccccc
照样是列方程组,2b=5c,那方程组就是
27+?b=5/2?b,解得?b=18,b输入18就得到了
(这里仅因为这几道题得到的结论,如果有不对的地方欢迎各位大佬来指正,纯利用数学关系的思维)
附上代码:
<?php
function filter($str){return str_replace('bb', 'ccccc', $str);
}
class A{public $name='bbbbbbbbbbbbbbbbbb";s:4:"pass";s:6:"hacker";}';public $pass='123456';
}
$AA=new A();
//echo serialize($AA)."\n";
$res=filter(serialize($AA));
echo $res."\n";
$c=unserialize($res);
print_r($c)."\n";
echo $c->pass;
替换之后导致序列化字符串变短
(这里依旧是借用大佬的代码)
注:
我这里本来用idea去实操,还是换成了cmd比较方便,cmd中使用php命令的教程如下
win命令行执行php_windows使用php8.2得在终端输入命令后才能使用-CSDN博客
参考文章:
Java基础——对象的序列化(通俗易懂,排版优美)_通过序列化机制来创建对象什么意思是-CSDN博客
php反序列化小记(1) | Prove yourself
相关文章:

php反序列化字符逃逸
php反序列化和序列化 PHP序列化:serialize() 序列化是将变量或对象转换成字符串的过程,用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。“序列化”是一种把对象的状态转化成字节流的机制 类似于这样的结构: O:4:&quo…...
延迟加载(Lazy Initialization)的单例模式
延迟加载(Lazy Initialization)的单例模式是一种在对象第一次被请求时才创建单例实例的设计模式。这种方法可以减少程序启动时的负载和启动时间,特别是当单例对象的创建开销较大或者在启动时不一定需要该对象时。 下面是实现延迟加载单例模式…...
C++三级专项 流感传染
时间限制:1000 内存限制:65536 有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每…...

如何用Elementor创建WordPress会员网站
在下面的文章中,我们将向您展示如何使用Elementor和MemberPress在WordPress中轻松构建会员网站。这篇文章将涵盖WordPress会员网站设置过程、会员资格和受保护内容创建、重要页面和登录表单设计、电子邮件通知管理、报告等。 目录 什么是WordPress会员网站&#x…...

【脑切片图像分割】MATLAB 图像处理 源码
1. 简单图像处理 加载图像 Brain.jpg,使用直方图和颜色分割成区域这些区域有不同的颜色。 这是一个更高级的问题,有多个解决它的方法。 例如,您可以计算具有特定数字的图像的直方图(例如 16 - 32),找到直方…...

深度学习系列61:在CPU上运行大模型
1. 快速版 1.1 llamafile https://github.com/Mozilla-Ocho/llamafile 直接下载就可以用,链接为:https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4.llamafile?downloadtrue 启动:./llava-v1.5-7b-q4.lla…...

IO接口 2月5日学习笔记
1.fgetc 用于从文件中读取一个字符,fgetc 函数每次调用将会返回当前文件指针所指向的字符,并将文件指针指向下一个字符。 int fgetc(FILE *stream); 功能: 从流中读取下一个字符 参数: stream:文件流指针 返回值: …...

Android Studio开发(一) 构建项目
1、项目创建测试 1.1 前言 Android Studio 是由 Google 推出的官方集成开发环境(IDE),专门用于开发 Android 应用程序。 基于 IntelliJ IDEA: Android Studio 是基于 JetBrains 的 IntelliJ IDEA 开发的,提供了丰富的功能和插件…...

stm32flash模拟eeprom
stm32f103CB的flash是128k(起始地址是 0x08000000 到 0x0801FFFF) falsh的末地址是0x801FFFF,即倒数一页是0x801FBFF(1页按照1kB1024B来算) stm32f103参考手册stm32f103cb.pdf stm32的FLASH分为主存储块和信息块&…...
多模态MLLM都是怎么实现的(2)-DDPM
上一篇的链接:多模态MLLM都是怎么实现的(2) (qq.com) 上上篇的链接:多模态MLLM都是怎么实现的(1) (qq.com) 在第一篇我们简单介绍了一下多模态训练的原理,包括clip,第二篇正好Sora横空出世,也让我就Dit做了一下抛砖引玉,顺便讲了VAE和ViT的部分,上节课我说过, DiT…...

QT----写完的程序打包为APK在自己的手机上运行
目录 1、qt安装android组件2、打开qt配置Android 环境3、手机打开开发者模式,打开usb调试,连接电脑4、运行代码 1、qt安装android组件 qtcreater–工具-QTMaintenaceTool-startMaintenaceTool—登陆—添加或修改组件—找到android,安装 若是…...
Windows C++ SecurityImpersonation级别:线程临时采用另一个用户(客户端)的身份进行操作的能力
SecurityImpersonation 是 Windows 操作系统中安全模型的一个级别,用于描述一个线程临时采用另一个用户(客户端)的身份进行操作的能力。这是Windows安全性的一个核心概念,允许服务或进程在执行特定任务时拥有与请求该服务的用户相…...

重学SpringBoot3-yaml文件配置
重学SpringBoot3-yaml文件配置 引言YAML 基本语法YAML 数据类型YAML 对象YAML 数组复合结构标量引用 YAML 文件结构Spring Boot 中的 YAML 配置注意事项总结参考 引言 YAML(YAML Ain’t Markup Language)是一种常用于配置文件的数据序列化格式ÿ…...

【管理咨询宝藏资料33】某头部咨询公司组织效能提升模型方案
本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料33】某头部咨询公司组织效能提升模型方案 【关键词】战略规划、组织效能、管理咨询 【文件核心观点】 - 通过长期行业积累和市场洞察&#…...

特征值和特征向量及其在机器学习中的应用
特征值和特征向量是线性代数中的概念,用于分析和理解线性变换,特别是由方阵表示的线性变换。它们被用于许多不同的数学领域,包括机器学习和人工智能。 在机器学习中,特征值和特征向量用于表示数据、对数据执行操作以及训练机器学…...
【Vue3】Ref 和 ShallowRef 的区别
这里写自定义目录标题 什么是 Ref什么是 ShallowRef区别对比示例代码 什么是 Ref Ref 是 Vue 3 中的一个新的基本响应式数据类型,它允许我们包装任意的 JavaScript 值,并且在数据变化时发出通知。Ref 提供了一个 .value 属性来访问其内部的值࿰…...

Linux - 进程概念
1、冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系; 截至目前,我们所认识的计算机,都是有一个个的硬件组件组成: 输入单元:…...

H5小游戏,象棋
H5小游戏源码、JS开发网页小游戏开源源码大合集。无需运行环境,解压后浏览器直接打开。有需要的,私信本人,发演示地址,可以后再订阅,发源码,含60+小游戏源码。如五子棋、象棋、植物大战僵尸、开心消消乐、扑鱼达人、飞机大战等等 <!DOCTYPE html PUBLIC "-//W3C/…...

LLM春招准备(1)
llm排序 GPT4V GPT-4V可以很好地理解直接绘制在图像上的视觉指示。它可以直接识别叠加在图像上的不同类型的视觉标记作为指针,例如圆形、方框和手绘(见下图)。虽然GPT-4V能够直接理解坐标,但相比于仅文本坐标,GPT-4V在…...
网络安全知识点总结
1、常见的网络攻击有哪些? 答:(1)口令攻击:也就是窃取用户的账户和密码,普通用户习惯于设置简单的密码,且多个系统用同一套密码,黑客可以使用字典攻击(常用密码库&#…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...