PHP反序列化字符串逃逸

article/2025/4/8 15:05:29

例题可看:https://www.cnblogs.com/v2ish1yan/articles/16118319.html

今天才学的,做个记录。

字符串逃逸分为两种,减少和增多。

主要是通过一个preg_replace()函数来进行字符串的减少和增多。

首先要知道逃逸的原理,就是反序列化时,是以}来进行结尾的,同时在字符串内,是以关键字后面的数字来规定所读取的内容的长度。

1.字符串增多

demo:

<?php
class A{public $a='q';public $b='21';}
$a=new A;
var_dump($a);

得到结果为:

string(45) "O:1:"A":2:{s:1:"a";s:1:"q";s:1:"b";s:2:"21";}"

要将反序列后$b的值变为我们想要的值。

我们还要有一个关键的函数。

function filter($a){$filter='/q/i';return preg_replace($filter,'ww',$a);
}

这个就是将序列化后的值,将所有的'q'变为'ww'。

例子:

<?php
class A{public $a='qqqqqqq';public $b='21';}function filter($a){$filter='/q/i';return preg_replace($filter,'ww',$a);
}
$a=new A;
var_dump(serialize($a));
echo'<pre>';
$r=filter(serialize($a));
var_dump($r);

得到:

假设我们想要$b=104,构造的$b的值的序列化后为:

";s:1:"b";s:3:"104";}
这里的";是用来闭合前面的,往下看就知道了

如何进行逃逸

我们先看看把上面的字符串加到$a后是什么样的。

 然后仔细看,如果我们把s:28后面的内容以字符串按要求填满了28个,那么s:1:"b";s:3:"104";}就会被包含在序列化字符串内。而}”后面的内容,即;s:1:"b";s:2:"21";}"就不会被认为是序列化字符串的内容,从而执行了我们构造的";s:1:"b";s:3:"104";},即让一个成员b的值为104。

然后进行构造:

在上面,只要让'w'字符的数量按要求达到s:后面所要求的的数量(28)即可。

但是我们要根据实际情况来选择构造多少个w。

因为在filter函数中,一个q被换成了两个w,所以让q的数量等于";s:1:"b";s:3:"104";}的字符串长度就行了。因为";s:1:"b";s:3:"104";} 的字符串长度为21,让q的数量为21,反序列化后a的值的长度为就是q的数量加上";s:1:"b";s:3:"104";}  的长度(42),在filter()之后,w的数量就是刚好42,而我们添加上去的字符串就会被逃逸出来,会在反序列化的时候成功执行。【文笔不好】

<?php
class A{public $a='qqqqqqqqqqqqqqqqqqqqq";s:1:"b";s:3:"104";}';public $b='21';}function filter($a){$filter='/q/i';return preg_replace($filter,'ww',$a);
}
$a=new A;
var_dump(serialize($a));
echo'<pre>';
$r=filter(serialize($a));
var_dump($r);

得到

string(87) "O:1:"A":2:{s:1:"a";s:42:"qqqqqqqqqqqqqqqqqqqqq";s:1:"b";s:3:"104";}";s:1:"b";s:2:"21";}"string(108) "O:1:"A":2:{s:1:"a";s:42:"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";s:1:"b";s:3:"104";}";s:1:"b";s:2:"21";}"

然后再进行反序列化就可以发现,$b的值变成了104。

接上面代码:

print_r(unserialize($r));

 总的就是说,让字符'w'占用了原本属于";s:1:"b";s:3:"104"}的位置,从而让";s:1:"b";s:3:"104"}逃逸出去而成功执行。

2.字符串减少

demo:

<?php
class A{public $a='qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq';public $b='20';}
function filter($a){$filter='/qq/i';return preg_replace($filter,'w',$a);
}
$a=new A;
var_dump(serialize($a));
echo '<pre>';
$r=filter(serialize($a));
var_dump($r);

 由名字可知,这个就是让字符串变少。

那么要如何让字符串逃逸呢?

同上面字符串增加:如果要让$b=104,那么他的序列化后就是:";s:1:"b";s:3:"104";}

但是前面要加个东西,如:A";s:1:"b";s:3:"104";},那个A是用来闭合的。

我们先把$b=A";s:1:"b";s:3:"104";}

得到:

 这里可以看到,在序列化字符串里,有两个 s:1:"b",第一个是序列化得到的,第二个是我们自己构造的。

那么要如果让我们构造的104生效呢?

就要让s:1:"a":s:32:"读取到s:22:"A",这样s:22:"A就会变成$a的值了,后面的内容就可以执行,所以这个时候就要想如何使这些字符串在一个合理的数量了。

有filter可以知道,两个q会变成一个w,所以只要让w的个数等于黄色字符串的长度

"O:1:"A":2:{s:1:"a";s:44:"wwwwwwwwwwwwwwwwwwwwww";s:1:"b";s:22:"A";s:1:"b";s:3:"104";}";}"

这个黄色字符串长度为17,所以qq的数量就为17,就有34个q。

所以这样:

<?php
class A{public $a='qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq';public $b='A";s:1:"b";s:3:"104";}';}
function filter($a){$filter='/qq/i';return preg_replace($filter,'w',$a);
}
$a=new A;
var_dump(serialize($a));
echo '<pre>';
$r=filter(serialize($a));
var_dump($r);
print_r(unserialize($r));

就可以得到

 看$b变成了104。

与字符串增加的区别:

1.字符串增加:构造的序列化加在qqqq(就是值有很多qqqq的)那个变量里。字符串减少:构造的序列化加在另一个变量里。

2.字符串增加:字符串'qqqqxxx'的数量依照构造的那个序列化字符串的长度。字符串减少:字符串'qqqqxxx'的数量依照"O:1:"A":2:{s:1:"a";s:44:"wwwwwwwwwwwwwwwwwwwwww";s:1:"b";s:22:"A";s:1:"b";s:3:"104";}";}"中黄色字符串的长度。(只能意会)(doge)


http://chatgpt.dhexx.cn/article/3q8ChsPS.shtml

相关文章

浅析php反序列化原生类的利用

浅析php反序列化原生类的利用 如果在代码审计或者ctf中&#xff0c;有反序列化的功能点&#xff0c;但是却不能构造出完整的pop链&#xff0c;那这时我们应该如何破局呢&#xff1f;我们可以尝试一下从php原生类下手&#xff0c;php有些原生类中内置一些魔术方法&#xff0c;如…

CTF php反序列化总结

前言&#xff1a;本⼈⽔平不⾼&#xff0c;只能做⼀些类似收集总结这样的⼯作&#xff0c;本篇文章是我自己在学php反序列化写的一篇姿势收集与总结&#xff0c;有不对的地方欢迎师傅们批评指正~ php反序列化 定义&#xff1a;序列化就是将对象转换成字符串。反序列化相反&am…

PHP反序列化命令执行及防范

PHP反序列化命令执行 1、 序列化与反序列化原理 序列化&#xff08;serialization&#xff09;在计算机科学的数据处理中&#xff0c;是指将数据结构或对象状态转换成可取用格式&#xff08;例如存成文件&#xff0c;存于缓冲&#xff0c;或经由网络中发送&#xff09;&#…

PHP反序列化魔术方法

目录 __construct __destruct __call __get __set __isset __unset __sleep __wakeup __toString __invoke PHP讲以双下划线__保留为魔术方法&#xff0c;所有的魔术方法 必须 声明为 public。 __construct()&#xff0c;类的构造函数 __destruct()&#xff0c;类的析…

PHP反序列化详解(一)——反序列化基础

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是PHP反序列化详解&#xff08;一&#xff09;——反序列化基础。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#x…

php反序列化姿势学习

php反序列化姿势学习 1.__wakeup()函数绕过2./[oc]:\d:/i研究php反序列化逃逸1.替换后字符串增加2.替换后字符串减少 1.__wakeup()函数绕过 wakeup函数作为php反序列化中的一个函数&#xff0c;也经常被拿来当做考点&#xff0c;比如这样 function __wakeup() { if ($this->…

【web漏洞】PHP反序列化

目录 知识点反序列化常用方法&#xff1a;序列化的&#xff08;构造payload&#xff09;运行顺序反序列化的&#xff08;实现payload&#xff09;运行顺序绕过__wakeup()__tostring() 知识点 序列化&#xff08;serialize&#xff09;&#xff1a; 对象的状态信息转换为可以存…

PHP反序列化CTF例题

渗透学习 不安全的反序列化之PHP反序列化 文章目录 渗透学习前言*本文只做学习用途&#xff0c;严禁利用本文提到的技术进行非法攻击&#xff0c;否则后果自负&#xff0c;本人不承担任何责任。* 一、CTF例题二、PHP反序列化漏洞和XSS跨站脚本总结 前言 本系列用于记录本人渗…

php反序列化漏洞

php反序列化漏洞 关于php面向对象编程&#xff1a; 对象&#xff1a;可以对其做事情的一些东西。一个对象有状态、行为和标识三种属性。 类&#xff1a;一个共享相同结构和行为的对象的集合。 每个类的定义都以关键字class开头&#xff0c;后面跟着类的名字。一个类可以包含有…

PHP反序列化漏洞总结

文章目录 一、 基础知识1、什么是反序列化漏洞:序列化与反序列化&#xff1a;1、序列化&#xff1a;2、反序列化&#xff1a; 二、PHP魔法函数1、常见方法:2、安全问题&#xff1a; 三、CTF中的反序列化例题一&#xff1a;例题二&#xff1a; 四、靶场练习1、反序列化触发XSS&a…

通过简单案例接触PHP反序列化

渗透学习 不安全的反序列化之反序列化基础 文章目录 渗透学习前言*本文只做学习用途&#xff0c;严禁利用本文提到的技术进行非法攻击&#xff0c;否则后果自负&#xff0c;本人不承担任何责任。* 一、序列化和反序列化二、PHP反序列化漏洞1.serialize()2.unserialize()3.反序…

php反序列化--字符串逃逸

php反序列化–字符串逃逸 PHP反序列化的字符串逃逸&#xff0c;一共分有两种情况&#xff0c;情况一&#xff1a;过滤后字符串变多&#xff0c;情况二&#xff1a;过滤后字符变少(本篇文章默认已有反序列化相关知识基础) 过滤后字符串变多 以ctfshow-web262为例讲解&#xf…

php反序列化漏洞(一)

PHP反序列化漏洞就是PHP对象注入 序列化&#xff1a;serialize 反序列化&#xff1a;unserialize 序列化其实就是将数据转换成可逆的数据结构&#xff0c;这种数据结构可认为是字符串。可逆的过程则为反序列化。 那么序列化有什么作用&#xff1f; 方便储存和传输。在PHP中…

php反序列化字符逃逸

前言 在了解php反序列化漏洞后&#xff0c;我又进一步学习了字符逃逸的相关内容。这一部分相对来说是比较难理解的。我也是在网上看了很多篇文章&#xff0c;再次自己总结一下究竟什么是字符逃逸&#xff0c;也方便日后复习。 字符逃逸的原理 什么是字符逃逸&#xff0c;从字…

php反序列化[基础]

基础 概述 序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组&#xff0c;字符串&#xff0c;对象等 函数 : serialize() 反序列化:恢复原先被序列化的变量 函数: unserialize() serialize()函数用于序列化对象或数组&#xff0c;并返回一个字符串 据访问修饰…

PHP中序列化与反序列化

PHP序列化&#xff1a;serialize 序列化是将变量或对象转换成字符串的过程。 举例&#xff1a; <?php class man{public $name;public $age;public $height;function __construct($name,$age,$height){ //_construct&#xff1a;创建对象时初始化$this->name …

(37)【PHP反序列化】PHP反序列化原理、函数、利用过程

目录 一、简介&#xff1a; 二、原理&#xff1a; 2.1、函数&#xff1a; 2.1.1、serialize()序列化 2.1.2、unserialize()反序列化 三、常见的序列化格式&#xff1a; 四、产生的原因&#xff1a; 4.1、无类&#xff1a; 4.2、有类&#xff1a; 五、魔术方法&#x…

php反序列化总结

php反序列化总结 基础知识 序列化 序列化就是将 对象object、字符串string、数组array、变量 转换成具有一定格式的字符串&#xff0c;方便保持稳定的格式在文件中传输&#xff0c;以便还原为原来的内容。 serialize ( mixed $value ) : stringserialize() 返回字符串&…

PHP反序列化入门手把手详解

PHP反序列化入门手把手详解 前言:文章内容大致可分为原理详解-漏洞练习- 防御方法。文章内容偏向于刚接触PHP反序列化的师傅,是一篇对PHP反序列化入门的手把手教学文章。文章特色在于对PHP反序列化原理的详细分析以及一系列由简入深的PHP反序列化习题练习和分析讲解。文章写作初…

[CTF]PHP反序列化总结

文章目录 PHP反序列化这一篇就够了简介常见的序列化格式案例引入反序列化中常见的魔术方法反序列化绕过小Trickphp7.1反序列化对类属性不敏感绕过__wakeup(CVE-2016-7124)绕过部分正则利用引用16进制绕过字符的过滤PHP反序列化字符逃逸情况1&#xff1a;过滤后字符变多情况2&am…