首页 > 编程语言 >【PHP系列】PHP反序列化--字符逃逸

【PHP系列】PHP反序列化--字符逃逸

时间:2024-08-03 14:06:43浏览次数:11  
标签:字符 123 PHP -- ss 逃逸 序列化 id

概念
了解字符逃逸前需要的补充
知识点一
知识点二
字符逃逸—字符增加
字符逃逸—字符减少

概念

在学PHP字符串逃逸之前先了解一下原理是什么,字符串逃逸的原理其实就是让字符串变成可以执行的序列化代码。在序列化和反序列化这个中间过程中,序列化字符增加或减少后,再去反序列化可能会发生属性逃逸。

额,可能会有点不太理解,没关系,进一步解释

了解字符逃逸前需要的补充

一般我们进行反序列化时候常规方式是这样的

<?php
class test{
    public $aumg = '111';
    public $id = 'aaasystem();';

}
$a = serialize(new test());     
echo $a;    
var_dump(unserialize($a)); 
?>

先去实例化一下对象类,然后进行序列化/反序列化的操作,输出结果分别如下:

O:4:"test":2:{s:4:"aumg";s:3:"111";s:2:"id";s:12:"aaasystem();";}object(test)#1 (2) {
  ["aumg"]=>
  string(3) "111"
  ["id"]=>
  string(12) "aaasystem();"
}

那么正常的是这样进行一个操作,那么我们就不正常,我们就想让这个test() 类去反序列化的时候输出点其他的类属性,就比如我想要反序列化输出时加一个类属性,或者直接修改存在的类属性,那么需要怎么操作呢❓可以先想一想,再来继续往下看。

一般字符串逃逸会有一个类似于替换字符串的功能函数,例如php中的str_replace(),以下面的代码来展开讲解:

讲解逃逸前先来补充一下知识点:

知识点一

举例

<?php
class test{
    public $id = 'lslsls';
    public $ss = '123';
}
$a = serialize(new test()); 
$b = str_replace('ls','pwd',$a);
var_dump($b);
?>  

这里使用var_dump()方法来抑制报错,错误直接返回false,正确直接输出反序列

为了方便观察这里直接以最简单的方式进行演示,我预先在类中设定了一个共有属性$id 值为字符串ls,这段代码很容易理解,就不解释了,运行一下,输出结果为:

string(59) "O:4:"test":2:{s:2:"id";s:6:"pwdpwdpwd";s:2:"ss";s:3:"123";}"

输出了一个总共有59个字符拼接成的序列化字符串,并且发现类的$id属性的值已经被字符串pwd进行了替换,序列化出来的结果再去进行反序列化,能不能执行呢❓思考一下。

进行反序列化:

<?php
class test{
    public $id = 'lslsls';
    public $ss = '123';
}
$a = serialize(new test()); 
$b = str_replace('ls','pwd',$a);
$c = unserialize($b);
var_dump($c);
?>

肯定不能,输出结果为:

bool(false)

因为序列化之后的结构是这样的:

O:类名的长度:类名:类中属性个数:{第一个类属性的种类:类属值的字符长度:"类属性名称";第一个类属性值的种类:类属值的字符长度:"类属性值名称";}

为什么反序列化不出来对比一下哪里出错了❓

可以发现类属性的值与他对应的字符串长度不一致,本应为9,但是反序列化时候是6,所以输出的值为false

知识点二

还是以下面的代码举例:

<?php
class test{
    public $id = 'lslsls';
    public $ss = '123';
}
$a = serialize(new test()); 
var_dump($a);
?>

输出结果为:

string(56) "O:4:"test":2:{s:2:"id";s:6:"lslsls";s:2:"ss";s:3:"123";}"

这个一定可以反序列化,但是我们用这个序列化的结果再去构造一下:

O:4:"test":2:{s:2:"id";s:6:"lslsls";s:2:"ss";s:3:"123";}:s:4:"wang";s:1:"q";};

想一想这个反序列化后得到的结果会是什么❓

反序列化代码:

<?php
class test{
    public $id = 'lslsls';
    public $ss = '123';
}
$a = serialize(new test());
$b = 'O:4:"test":2:{s:2:"id";s:6:"lslsls";s:2:"ss";s:3:"123";}:s:4:"wang";s:1:"q";}';
$c = unserialize($b);
var_dump($c);

输出结果为:

object(test)#1 (2) {
  ["id"]=>
  string(6) "lslsls"
  ["ss"]=>
  string(3) "123"
}

可以看到,我们构造的:s:4:"wang";s:1:"q";}并没有被反序列化,这是为什么呢❓

这是因为在序列化之后的结果,也就是O:4:"test":2{s:2:"id";s:6:"lslsls";s:2:"ss";s:3:"456";}这一部分如果没有一点差错,结构完整,可以被反序列化的情况下;}就是反序列化的结束。
当然,这里并不是说只要是;} 就是反序列化的结束,可以举一个例子:

O:4:"test":2:{s:2:"id";s:4:"ls;}";s:2:"ss";s:3:"456";}

假如这个序列化的结果成立,那么这种说法(;}就是反序列化的结束) 就是错误的,为什么这样说,因为如果不能反序列化(输出结果如果为bool(false)),证明到了第一个$id类属性值这个地方的;}反序列化就已经不在进行了,因为序列化结构已经出错了,这里不懂的可以向上翻,上面介绍了这是为什么;那么如果不出错,则就是直接可以反序列化出来所有属性(包括类属性ss和提所对应的值123)

完整代码如下:

<?php
class test{
    public $id = 'ls;}';
    public $ss = '123';
}
serialize(new test());
$b = 'O:4:"test":2:{s:2:"id";s:4:"ls;}";s:2:"ss";s:3:"456";}';
$c = unserialize($b);
var_dump($c);

运行结果为:

object(test)#1 (2) {
  ["id"]=>
  string(4) "ls;}"
  ["ss"]=>
  string(3) "456"
}

这里就不再陈述为什么没有反序列化出来ss123的原因了,可以自己去动手试一下序列化类之后,在反序列化之前修改属性值是以原有的类中的属性值为结果还是反序列化之前修改后的类属性值为结果,这里判断;}是不是结束是以前面对应的长度决定的,这里也就是s:4:这个部分。

好啦,以上都是为了这个字符逃逸做铺垫,下面就开始正式讲解PHP反序列化之字符逃逸啦~

标签:字符,123,PHP,--,ss,逃逸,序列化,id
From: https://www.cnblogs.com/o-O-oO/p/18340365

相关文章

  • 携程租车宝滑块
    ​声明(lianxia15018601872)本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言(lianxia15018601872)接着练习滑块处理,点选和旋转滑块训练太费时间,最后......
  • 前程无忧阿里227滑块
    ​声明(lianxia15018601872)本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!  前言(lianxia15018601872)第一次打算先搞非淘流程,发现227是真的牛逼,你滑块......
  • 拼多多滑块逆向
    ​声明(lianxia15018601872)本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言(lianxia15018601872)挺有意思的拼多多滑块,搞了一会。说一下踩坑流程,和......
  • MySQL 入门知识详解
    MySQL入门知识详解在学习MySQL的过程中,初学者需要掌握一些基本概念、常用操作和设计原则。本文将详细讲解这些知识点,并通过具体示例帮助你更好地理解。1.基本概念数据库数据库是一个用来存储和组织化数据的容器。在MySQL中,一个数据库包含多个表。每个数据库通常代表......
  • 最火的十大 Edge插件:安装指南、功能介绍及使用技巧
    最火的十大MicrosoftEdge插件:安装指南、功能介绍及使用技巧随着网络浏览需求的不断增加,浏览器插件变得越来越重要。MicrosoftEdge通过其丰富的插件生态系统,满足用户的多样化需求。本文将介绍十款在中国用户中最受欢迎的Edge插件,包括如何安装、使用及其主要功能和作用。这些......
  • Jetson Orin Nano安装(烧录)Ubuntu22.04.4LTS
    1、准备材料JetsonOrinNano(8GB)外设(键盘、屏幕、鼠标、网线、电源适配器)主机(也可以是虚拟机,只要是ubuntu系统就可以)2、下载SDKmanger下载地址:JetPackSDK|NVIDIA开发者进入下载位置并解压:cdDownloads/sudodpkg-isdkmanager_2.1.0-11682_amd64.deb第一次解压......
  • 搞定Java ArrayList,就看这一篇!
    大家好,我是小欧!今天我们来聊聊Java中的ArrayList。作为一个Java新手,初次接触ArrayList可能会觉得有点懵,不过不用担心,这篇文章会带你从零开始一步步搞定ArrayList。我们会从基础概念开始,然后逐步深入,最后通过几个实际案例来巩固学习成果。ArrayList是什么?简单来说,ArrayLis......
  • 计算机网络--网络层串讲
    笔记整理自学习开源文档:小林coding为什么要做这个串讲?因为我在学习408网络层的时候,看完机构的视频课感觉没有很好地将知识串联起来,便找到《图解网络》作为补充,且小林的讲解是我认为开源中较为通俗易懂的,因此我在学习过程中将精华部分记录下来加上自己的理解并录制这个串讲......
  • springBoot中的观察者模式实现
    pringBoot中的观察者模式实现什么是观察者模式?假设你要打一局酣畅淋漓的游戏,那么你可能需要进行以下操作->1.解锁手机屏幕2.找到你要进行游戏的位置3.单机启动游戏现在我们将启动游戏设计为一个api接口控制器类->三个业务方法均为控制台打印日志访问接口-......
  • 【思科模拟器Packet Tracer的一些操作】你见过这样PacketTracer吗
    你见过这样PacketTracer吗?机柜抓包模拟城域网各位网工朋友应该都用过思科模拟器吧PacketTracer是思科系统开发的一款网络模拟器,用于模拟计算机网络中的设备和网络环境。它可以帮助网络工程师或学生在没有真实设备的情况下学习和实验各种网络配置和协议。Pac......