php反序列化-字符串逃逸(包教包会)

前言

第一次遇见php反序列化-字符串逃逸的CTF题型应该是在去年十月份的时候吧,那个时候心很浮躁静不下心,加之没有时间去好好的学习,其实有时候做不出来看别人写的wp看不懂时会很生气,一方面是因为这个笔者会这道题那么ta为什么不再写清楚一点,另一个方面是为什么自己那么菜,不理解为什么那样操作,所以我的每篇文章我都会尽我所能的把自己所学到的东西用最通俗易懂的方式表达出来。

一些微小而很重要的细节(理解字符串逃逸的重点)

简单的构造一个类并将其序列化

<?php

class cat {
   
    public $food;
    public function __construct() {
   
        $this->food = 'fish';
    }
}

$a = new cat();
echo serialize($a);

上面的代码的运行结果如下(含各个字符的含义)

O:3:"cat":1:{
   s:4:"food";s:4:"fish";}

//对序列化后的字符一个个的解释:
//`O:3:"cat"`: 这部分表示一个对象,`O` 是对象的标识符。`3` 表示类名的长度,`"cat"` 是类名。所以,这里指的是一个名为 "cat" 的类的实例。
//`:`: 分隔符,用于分隔不同的部分。
//`1`: 表示对象中有一个属性。这里的 `1` 表示 "cat" 对象有一个属性。
//`{`: 开始标记,表明接下来是对象属性的详细列表。
//`s:4:"food"`: 这部分表示一个字符串类型的属性。`s` 是字符串的标识符。`4` 表示字符串的长度,`"food"` 是属性名。所以这里表示有一个名为 "food" 的属性,其值将在后面定义。
//`;`: 分隔符,用于分隔属性名和属性值,或者分隔不同的属性。
//`s:4:"fish"`: 这部分同样表示一个字符串。`4` 表示字符串的长度,`"fish"` 是属性 "food" 的值。所以,这里的 "fish" 是 "cat" 对象中 "food" 属性的值。
//`}`: 结束标记,表示对象的属性列表结束。

PS:
1.这里需要认识到的是{ 是开始标志,}是结束标志(注意它们并未包含在双引号之中),并且是根据长度判断内容的,同时反序列化的过程也必须严格按照序列化规则才能成功实现反序列化,反序列化过程有一定的识别范围,在这个范围之外的字符都会被忽略,不会影响反序列化的正常进行,如果把";}添加到需要反序列化的字符串当中(除了结尾处),就能让反序列化提前闭合,";}之后的字符串的内容就被丢弃,不会进行反序列化。

2.一个属性的长度与该属性的内容长度不符时反序列化的过程会报错。

php反序列化-字符串逃逸原理
当开发者使用先将对象序列化,然后将对象中的字符进行过滤,最后再进行反序列化。这个时候就有可能会产生PHP反序列化字符逃逸的漏洞。
(分为字符串增加和字符串减少的两种情况)

注意前后逻辑,是先将对象序列化,再对序列化得到的字符串进行过滤
还是有点懵懂,光看这个关于字符串逃逸原理的描述,不急,下面笔者将展开说说
首先定义一个user类,含username、type(用户类型)两个属性:

class user{
   
public $username;
public $type;
public function __constru
  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值