千家信息网

php反序列化之字符串逃逸实例分析

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要讲解了"php反序列化之字符串逃逸实例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"php反序列化之字符串逃逸实例分析"吧!php反序
千家信息网最后更新 2025年11月07日php反序列化之字符串逃逸实例分析

这篇文章主要讲解了"php反序列化之字符串逃逸实例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"php反序列化之字符串逃逸实例分析"吧!

php反序列化-字符串逃逸

PHP反序列化的字符串逃逸,一共分有两种情况,情况一:过滤后字符串变多,情况二:过滤后字符变少(本篇文章默认已有反序列化相关知识基础)

过滤后字符串变多

以ctfshow-web262为例讲解:

error_reporting(0);class message{    public $from;    public $msg;    public $to;    public $token='user';    public function __construct($f,$m,$t){        $this->from = $f;        $this->msg = $m;        $this->to = $t;    }}$f = $_GET['f'];$m = $_GET['m'];$t = $_GET['t'];if(isset($f) && isset($m) && isset($t)){    $msg = new message($f,$m,$t);    $umsg = str_replace('fuck', 'loveU', serialize($msg));    setcookie('msg',base64_encode($umsg));    echo 'Your message has been sent';}highlight_file(__FILE__);

这段代码,首先要get传入3个参数,然后序列化传入的包含有这三个参数的msg函数,之后将里面包含的fuck字符串替换成为loveU,重新赋值给umsg变量,并将该变量base64编码,设置为cookie

根据题中注释提示,得到message.php内容,为

highlight_file(__FILE__);include('flag.php');class message{    public $from;    public $msg;    public $to;    public $token='user';    public function __construct($f,$m,$t){        $this->from = $f;        $this->msg = $m;        $this->to = $t;    }}if(isset($_COOKIE['msg'])){    $msg = unserialize(base64_decode($_COOKIE['msg']));    if($msg->token=='admin'){        echo $flag;    }}

如果设置了cookie且msg中的token为admin,即可输出flag

由index.php内容可知,进行了一步replace,导致每输入一个fuck,就会多生成一位,故我们可以利用这个特点进行字符串逃逸,首先本地尝试一下

由题可知,我们需要修改原class类中的token值为admin,然后一起传入三个参数,f,m,t,我们可以利用其中一个参数,这里利用的参数是m,为了避免需要逃逸的字符串太多,我们可以先写f t参数,本地随便传入值,输出序列化结果

下图中";s:2:"to";s:1:"1";s:5:"token";s:5:"admin";}即为我们要逃逸的部分,一共44个字符,故我们需要m输入44个fuck来逃逸

逃逸成功,上下两个字符串均为正常的序列化字符串,复制payload前往执行

字符串变多原理详解

这道题就用到了php反序列化中字符串逃逸的知识

首先看本地实验的正常返回结果

当传入x时,定义的替换函数,将一个x替换为两个x后得到的 o l d 的 值 为 ' a : 2 : i : 0 ; s : 4 : " h a n x x " ; i : 1 ; s : 7 : " I a m 11 " ; ' , 长 度 不 匹 配 , 会 出 现 报 错 , 进 而 导 致 old的值为`a:2:{i:0;s:4:"hanxx";i:1;s:7:"I am 11";}`,长度不匹配,会出现报错,进而导致 old'a:2:i:0;s:4:"hanxx";i:1;s:7:"Iam11";'old的进一步反序列化失败

当然如果我们可以将hanx的字符串长度由4改为5时,虽然最开始输入了4个字符但正常执行,并且name由hanx变为了hanxx

PHP 在反序列化时,底层代码是以 ; 作为字段的分隔,以 } 作为结尾(字符串除外),并且是根据长度判断内容的 ,同时反序列化的过程中必须严格按照序列化规则才能成功实现反序列化 。

由上面的输出结果可以看到x被换成了xx,然而序列化的结果中数值仍然是原来的4,我们可以根据字符串在经过过滤函数后字符串变多的特点找到漏洞

漏洞原理:我们可以利用等长的可以用来闭合的字符串传入数据,假设我们需要传入age为woaini,故我们可以利用";i:1;s:6:"woaini";}这个字符串,该字符串一共20位,我们可以通过补充20个x来实现字符串逃逸,最终构造的payload如下:

name=maoxxxxxxxxxxxxxxxxxxxx";i:1;s:6:"woaini";}

因为题中已知会将一个x替换为两个x,故我们可以令x的数量与上面payload中";i:1;s:6:"woaini";}的数量相等,这样既满足了,序列化之前,name的长度为40(不算前面的mao),又满足了替换后x扩大一倍,导致引号闭合,那么长度仍为40位,但是我们通过字符串逃逸,传入了想要的age的值

由图可知,传入的age值成功溢出,字符串逃逸成功!

过滤后字符串变少

本地测试如上,初始时name和sign没有赋值,number为2020,存在字符串逃逸漏洞,假设我们通过构造反序列化字符串逃逸,使number值由2020变为2002为成功,则可以尝试构造序列化字符串

首先代码中通过get传入name和sign参数,之后进行反序列化,并将反序列化的结果进行字符串替换,输出替换后的结果,把反序列化的结果赋值给fake,分别输出经过改造后的name、sign、number值

正常输入得到正常输出:

当输入包含有lemon或者shy时,会替换为空,字符串变短导致代码中反序列化失败,输出错误:

在上面的反序列化字符串中,控制number值的字符串为";s:6:"number";s:4:"2020";}总长为27,所以我们需要在name变量中设置被过滤的字符进行置空,该置空部分的字符串,需要保证我们在第二个变量输入人为补充的序列化字符串时,位数正好,不报错

这里sign输入了YKing";s:4:"sign";s:4:"evan";s:6:"number";s:4:"2002";}其中,YKing用于凑字数,补充前面的name变量的长度,保证后续可以正常反序列化,然后输入了手工构造的sign变量,并赋值,值为多少无所谓,保证序列化正确即可,最后将我们想要的number值2002,补充到sign变量中,并通过}闭合,导致原题中的2020无法反序列化,进而实现number值的覆盖

name变量的长度,保证后续可以正常反序列化,然后输入了手工构造的sign变量,并赋值,值为多少无所谓,保证序列化正确即可,最后将我们想要的number值2002,补充到sign变量中,并通过}闭合,导致原题中的2020无法反序列化,进而实现number值的覆盖

感谢各位的阅读,以上就是"php反序列化之字符串逃逸实例分析"的内容了,经过本文的学习后,相信大家对php反序列化之字符串逃逸实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

字符 字符串 序列 变量 输入 长度 参数 结果 输出 成功 内容 保证 实例 实例分析 分析 代码 情况 闭合 两个 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 医疗应用软件开发论文 如何在数据库表里快速查找 网络安全之我见手抄报图片 蓝阔打印机服务器需要先联网吗 网络安全检查情况自查报告 商业中为什么强调网络安全 数据库五个安全 贵州数据网络技术服务资费 数据库三大范式名字 近些年发生的网络安全事件 湖北潮流软件开发价格服务标准 睿民互联网科技怎么样 江西gis bim软件开发 c 还原数据库中image 中国银行软件开发中心待遇 苹果怎么删除系统其他数据库 通州区品牌软件开发概况 网络技术服务部是做什么的 虹口区信息软件开发哪个好 全县网络安全和信息化会议 C 单选按钮连接数据库 强东网络技术有限公司 计算机里面的dns服务器是什么 酒店网络安全平台 用于软件开发的计算机语言 服务器时间怎么翻译 网络技术专业和软件技术 预装一台Linux的服务器 京东如何监控网络安全 互联网金融科技运营模式
0