0

0

php反序列化实例详解之字符串逃逸

WBOY

WBOY

发布时间:2022-04-28 12:59:33

|

6076人浏览过

|

来源于CSDN

转载

本篇文章给大家带来了关于php的相关知识,其中主要介绍了关于反序列化的相关问题,php反序列化的字符串逃逸,一共分有两种情况,情况一:过滤后字符串变多,情况二:过滤后字符变少,下面一起看一下,希望对大家有帮助。

php反序列化实例详解之字符串逃逸

推荐学习:《PHP视频教程

php反序列化–字符串逃逸

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

过滤后字符串变多

以ctfshow-web262为例讲解:

立即学习PHP免费学习笔记(深入)”;

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";}`,长度不匹配,会出现报错,进而导致              olda:2:i:0;s:4:"hanxx";i:1;s:7:"Iam11";old的进一步反序列化失败
在这里插入图片描述

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

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

图酷AI
图酷AI

下载即用!可以免费使用的AI图像处理工具,致力于为用户提供最先进的AI图像处理技术,让图像编辑变得简单高效。

下载

由上面的输出结果可以看到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速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6498

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

368

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

443

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6559

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

840

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1089

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1872

2024.03.01

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号