WEB攻防-PHP反序列化-字符串逃逸

news2025/3/21 8:57:32

目录

前置知识

字符串逃逸-减少

字符串逃逸-增多


前置知识

1.PHP 在反序列化时,语法是; 作为字段的分隔,以 } 作为结尾,结束符}之后的任何内容不会影响反序列化的后的结果

class people{

    public $name='lili';

    public $age='20';


}

var_dump(unserialize('O:6:"people":2:{s:4:"name";s:4:"lil"";s:3:"age";s:2:"20";}123245dasdsf'));

2.根据长度判断内容

'O:6:"people":2:{s:4:"name";s:4:"lil"";s:3:"age";s:2:"20";}其中lil"是name的值

3.其中字符串必须以双引号包裹,不能不写或以单引号包裹; 

注意点,很容易以为序列化后的字符串是;},但对象序列化是直接}结尾

php反序列化字符逃逸,就是通过这个结尾符实现的当长度不对应的时候会出现报错无法完成反序列化

4.什么事字符串逃逸?

就是开发者使用先将对象序列化,然后将序列化后的敏感字符进行过滤或替换,最后再进行反序列化。这个时候就有可能会产生PHP反序列化字符逃逸的漏洞。分为两种情况:

1.字符串减少

O:4:"user":1:{s:8:"username";s:5:"admin";} -->O:4:"user":1:{s:8:"username";s:5:“hack";}

2.字符串增多

O:4:"user":1:{s:8:"username";s:5:"admin";}-->O:4:"user":1:{s:8:"username";s:5:“hacker";}

开发者可能通过这些方法来达到过滤非法字符的目的,但是却会造成其他的问题字符串逃逸

字符串逃逸-减少

<?php
class a{
    public $name = "abcp";
    public $number = "1234";
}

$data = serialize(new a());
echo '序列化:'.$data."\n";
$data = str_replace("p","",$data);//注意这个str_replace,它把p都替换为空
echo '序列化:'.$data."\n";
var_dump(unserialize($data));

也就是说它过滤了一个p之后,会吞噬一个字符,但是吞噬之后序列化字符串不符合序列化的语法规范,所以使其无法反序列化成功

这样某种程度起到了安全的作用 ,但是如果我们使其吞噬更多内容会不会达到结果合法的目的 

解释:原acbp中p被替换了,abc”成了一个整体,本质上就是把 ” 给吞噬掉了 ,所以有多少个p就好吞噬掉多少个字符

字符串逃逸就事利用吞噬更多的字符,使序列化的字符串与后面的引号形成闭合,从而构造恶意代码,那么吞噬多少算合适呢?一直吞噬到下一个可控点的值之前,使得下一个可控制点的第一个引号充当上一个值的结束引号,可以吞噬,也可以不吞,后面会说。如上面例子有两个变量,通过number值构造恶意代码,就需要吞噬到number的值前面,让该值的第一个引号充当name的结束引号。:

O:1:"a":2:{s:4:"name";s:4:"abc";s:6:"number";s:4:"1234";}

O:1:"a":2:{s:4:"name";s:4:"abc";s:6:"number";s:4:"1234";}

需要注意的是要构造的字符串通常长度是2位数的,所以应该多逃逸一个字符

O:1:"a":2:{s:4:"name";s:?:"abc";s:6:"number";s:xx:"要构造的字符串";}

 

所以要写19+1 个p来逃逸字符

属性之间用一个分号分隔,就可以构造逃逸出来的恶意代码了,如下:

O:1:"a":2:{s:4:"name";s:23:"abc";s:6:"number";s:19:";s:3:"age";i:25;}";}

构造了一个age属性,值为25

而上面提到可以把值前面的引号也吞噬掉,其实是一样的,吞噬掉了,我们在构造的是补回来就可以了 

O:1:"a":2:{s:4:"name";s:4:"abc";s:6:"number";s:4:"1234";}

如果它过滤的时候不止吞噬一个字符怎么办?那样就可能出现不会正好能吞噬到下一个可控变量引号之前的情况 ,如一次吞噬6个

class a{
    public $name = "abchacker";
    public $number = '123';
}

$data = serialize(new a());
echo '序列化:'.$data."\n";
$data = str_replace("hacker","",$data);
echo '序列化:'.$data."\n";
var_dump(unserialize($data));

这种情况需要把引号吞掉,因为需要在可控变量里补字符,那么通过上面吞一个的例子,我们知道需要吞21个字符,但是21/6也是除不尽的,这时候可以直接往多了吞就好,吞噬24个是可以被出尽的,也就是4个hacker,那么多出来的,在恶意代码中补上3个任意字符给他吞噬就可以了

字符串逃逸-增多

经过替换后,字符串增多,目标使isadmin=1

<?php
class a{
    public $name = "php123";
    public $number = '1234';
    public $isadmin = '0';
}

$data = serialize(new a());
echo '序列化:'.$data."\n";
$data = str_replace("php","hack",$data);
echo '序列化:'.$data."\n";
var_dump(unserialize($data));

字符串增多并需要其他的可控的,使吐出的字符结合到一起最终构造成合法的序列化字符串即可

O:1:"a":3:{s:4:"name";s:xx:"hackxxx";s:6:"number";s:4:"1234";s:7:“isadmin";s:1:"1";}

";s:6:"number";s:4:"1234";s:7:"isadmin";s:1:"0";}

xxx表示还不知需要多少个hack

";s:6:"number";s:4:"1234";s:7:“isadmin";s:1:"1";}如果我们使得这串字符被吐出来,那么这样就最终形成了一个合法的序列化字符串

O:1:"a":3:{s:4:"name";s:xx:"hackxxx ";s:6:"number";s:4:"1234";s:7:“isadmin";s:1:"1";}

因为}结束后,后面的";s:6:"number";s:4:"1234";s:7:"isadmin";s:1:"0";}会被丢弃

一个php会被替换成hack一个php吐出一个字符 “;s:6:”number“;s:4:”1234“;s:7:”isadmin“;s:1:”1“;}49个字符,所以需要输入49php 

假设一个php会被替换成hacker一个php吐出三个字符 “;s:6:”number“;s:4:”1234“;s:7:”isadmin“;s:1:”1“;}49个字符49除以3=161,所以需要输入16php同时将“;s:6:”number“;s:4:”1234“;s:7:”isadmin“;s:1:”1“;}改为“;s:6:”number“;s:4:”123“;s:7:”isadmin“;s:1:”1“;}这样就是48个字符,输入16php刚刚好

吐出的多了就在“;s:6:”number“;s:4:”1234“;s:7:”isadmin“;s:1:”1“;}红色部分增加字符即可,如17个php等于吐出51个字符,原49位多出2位,在number补2位即可

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

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

相关文章

英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析

【完整版】3月19日&#xff0c;黄仁勋Nvidia GTC 2025 主题演讲&#xff5c;英伟达 英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析 一、引言 1.1 分析内容 本研究主要采用了文献研究法、数据分析以及专家观点引用相结合的方法。在文献研究方面&#xff0c;广泛收集了…

基于java的ssm+JSP+MYSQL的九宫格日志网站(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能模块&#xff1a; 个人中心 用户管理 日记信息管理 美食信息管理 景点信息管理 新闻推荐管理 日志展示管理 论坛管理 我的收藏管理 管理员管理 留言板管理 系统管理 用户功能模块&#xff1a; 个人中心 日记信息管理 美食信息管理 景点信息…

【Java】Mybatis学习笔记

目录 一.搭建Mybatis 二.Mybatis核心配置文件解析 1.environment标签 2.typeAliases 3.mappers 三.Mybatis获取参数值 四.Mybatis查询功能 五.特殊的SQL执行 1.模糊查询 2.批量删除 3.动态设置表名 4.添加功能获取自增的主键 六.自定义映射ResultMap 1.配置文件处…

遗传算法+四模型+双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测

遗传算法四模型双向网络&#xff01;GA-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 遗传算法四模型双向网络&#xff01;GA-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于GA-CNN-BiLSTM-Attention、CNN-BiL…

中兴B860AV3.2-T/B860AV3.1-T2_S905L3-B_2+8G_安卓9.0_先线刷+后卡刷固件-完美修复反复重启瑕疵

中兴电信B860AV3.2-T&#xff0f;B860AV3.1-T2_晶晨S905L3-B芯片_28G_安卓9.0_先线刷后卡刷-刷机固件包&#xff0c;完美修复刷机后盒子反复重启的瑕疵。 这两款盒子是可以通刷的&#xff0c;最早这个固件之前论坛本人以及其他水友都有分享交流过不少的固件&#xff0c;大概都…

《Python实战进阶》No27: 日志管理:Logging 模块的最佳实践(下)

No27: 日志管理&#xff1a;Logging 模块的最佳实践&#xff08;下&#xff09; 实战案例 &#xff1a;复杂场景下的 Logging 配置与使用 本实战案例在 Python 3.11.5环境下运行通过 在本案例中&#xff0c;我们将通过一个复杂的日志配置示例&#xff0c;全面展示 logging 模…

Web 小项目: 网页版图书管理系统

目录 最终效果展示 代码 Gitee 地址 1. 引言 2. 留言板 [热身小练习] 2.1 准备工作 - 配置相关 2.2 创建留言表 2.3 创建 Java 类 2.4 定义 Mapper 接口 2.5 controller 2.6 service 3. 图书管理系统 3.1 准备工作 - 配置相关 3.2 创建数据库表 3.2.1 创建用户表…

【Dive Into Stable Diffusion v3.5】1:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练

目录 1 引言2 项目简介3 快速上手3.1 下载代码3.2 环境配置3.3 项目结构3.4 下载模型与数据集3.5 运行指令3.6 核心参数说明3.6.1 通用参数3.6.2 优化器/学习率3.6.3 数据相关 4 结语 1 引言 在人工智能和机器学习领域&#xff0c;生成模型的应用越来越广泛。Stable Diffusion…

《Waf 火绒终端防护绕过实战:系统程序副本+Certutil木马下载技术详解》

目录 绕过火绒终端安全软件的详细方法 方法一&#xff1a;利用系统程序副本绕过命令监控 方法二&#xff1a;结合certutil.exe副本下载并执行上线木马 注意事项 总结 实际案例解决方案 前提条件 详细操作步骤 1. 攻击主机&#xff08;VPS&#xff09;上的准备工作 2.…

上海高考解析几何

解析几何的核心思想。 1. 核心分析方法&#xff1a; 自由度引入 方程组中&#xff0c; n n n 个未知数需要 n n n 个等式来解出具体的值。 自由度 性质 一个未知数带来一个自由度&#xff0c;一个等式条件减少一个自由度&#xff08;减少自由度的方式为消元&#xff09;。…

【AVRCP】服务发现互操作性:CT 与 TG 的 SDP 协议契约解析

目录 一、服务发现的核心目标&#xff1a;能力画像对齐 二、控制器&#xff08;CT&#xff09;服务记录&#xff1a;控制能力的声明 2.1 必选字段&#xff1a;角色与协议的刚性契约 2.1.1 服务类标识&#xff08;Service Class ID List&#xff09; 2.1.2 协议描述列表&am…

MySQL:数据库基础

数据库基础 1.什么是数据库&#xff1f;2.为什么要学习数据库&#xff1f;3.主流的数据库&#xff08;了解&#xff09;4.服务器&#xff0c;数据库&#xff0c;表之间的关系5.数据的逻辑存储6.MYSQL架构7.存储引擎 1.什么是数据库&#xff1f; 数据库(Database,简称DB)&#x…

深入 Linux 声卡驱动开发:核心问题与实战解析

1. 字符设备驱动如何为声卡提供操作接口&#xff1f; 问题背景 在 Linux 系统中&#xff0c;声卡被抽象为字符设备。如何通过代码让应用程序能够访问声卡的录音和播放功能&#xff1f; 核心答案 1.1 字符设备驱动的核心结构 Linux 字符设备驱动通过 file_operations 结构体定…

OpenNJet动态API设置accessLog开关,颠覆传统运维工作模式

OpenNJet OpenNJet 应用引擎是高性能、轻量级的WEB应用与代理软件。作为云原生服务网格的数据平面&#xff0c;NJet具备动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。通过CoPliot副驾驶服务框架&#xff0c;在隔离控制面和数据面的情况下实现了高可扩…

案例5_4: 6位数码管轮播0-9【静态显示】

文章目录 文章介绍效果图提示代码&#xff08;不完整&#xff09; 文章介绍 5.1.2 数码管静态显示应用举例 要求&#xff1a; 1、仿真图同案例5_3 2、代码参考案例5_3和案例5_2 效果图 提示代码&#xff08;不完整&#xff09; #include<reg52.h> // 头文件#define uch…

navicat忘记已经连接过的数据库密码的操作步骤

第一步&#xff1a; 点击文件-》导出连接 第二步&#xff1a;选中具体的数据库&#xff0c;且勾选左下角的记住密码 第三步&#xff1a;打开刚刚导出的文件&#xff0c;找到对应加密后的密码 第四步&#xff1a;复制密码到工具点击查看密码 注&#xff1a;参考文章链接附…

Qt窗口坐标体系

坐标系&#xff1a;以左上角为原点&#xff08;0&#xff0c;0&#xff09;&#xff0c;X向右增加&#xff0c;Y向下增加 对于嵌套窗口&#xff0c;其坐标是相对于父窗口来说的 例如&#xff1a; 通过move方法实现

DeepSeek写打台球手机小游戏

DeepSeek写打台球手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端打台球小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 有白球和其他颜色的球&am…

VR大空间多人互动方案,VR大空间融合AI行为预测的动捕技术

在数字科技迅猛发展的今天&#xff0c;VR大空间技术正逐步成为各行业探索沉浸式体验的重要方向。从企业培训、线上展览到社交元宇宙&#xff0c;VR大空间的应用范围不断拓展。而在这个过程中&#xff0c;多人实时交互成为核心需求&#xff0c;它不仅关乎沉浸感的提升&#xff0…

十四、OSG学习笔记-事件响应

上一章节 十三、OSG学习笔记-osgDB文件读写-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146165712 本章节代码&#xff1a; OsgStudy/EventHandle CuiQingCheng/OsgStudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/osg-study/tree/master/Osg…