iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php反序列化之字符串逃逸详解
  • 962
分享到

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

2024-04-02 19:04:59 962人浏览 八月长安
摘要

目录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的进一步反序列化失败

在这里插入图片描述

当然如果我们可以将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,分别输出经过改造后的namesignnumber

正常输入得到正常输出:

在这里插入图片描述

当输入包含有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值的覆盖

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!     

--结束END--

本文标题: php反序列化之字符串逃逸详解

本文链接: https://www.lsjlt.com/news/142682.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php反序列化之字符串逃逸详解
    目录php反序列化–字符串逃逸过滤后字符串变多字符串变多原理详解过滤后字符串变少总结php反序列化–字符串逃逸 PHP反序列化的字符串逃逸,一共分有两种情况,...
    99+
    2024-04-02
  • 详解php反序列化之字符逃逸法
    目录1.先说关键字符变多例题1例题22.关键字符减少总结按我的理解,反序列化的过程就是碰到;}与最前面的{配对后,便停止反序列化。如下序列化: <php class Test ...
    99+
    2024-04-02
  • php反序列化之字符串逃逸实例分析
    这篇文章主要讲解了“php反序列化之字符串逃逸实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php反序列化之字符串逃逸实例分析”吧!php反序列化–字符串逃逸PHP反序列化的字符串逃...
    99+
    2023-06-30
  • PHP反序列化之字符逃逸怎么实现
    本文小编为大家详细介绍“PHP反序列化之字符逃逸怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP反序列化之字符逃逸怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。本质:闭合 分类:字符变多、字...
    99+
    2023-06-30
  • PHP反序列化字符串逃逸的示例分析
    这篇文章将为大家详细讲解有关PHP反序列化字符串逃逸的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。0CTF 2016piapiapia由于是代码审计,直接访问www.zip发现备份的源码,有一下...
    99+
    2023-06-06
  • 如何在PHP项目中实现一个反序列化字符串逃逸功能
    这篇文章给大家介绍如何在PHP项目中实现一个反序列化字符串逃逸功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。任何具有一定结构的数据,如果经过了某些处理而把结构体本身的结构给打乱了,则有可能会产生漏洞。0CTF 20...
    99+
    2023-06-06
  • JavaIO之序列化与反序列化详解
    目录1、什么是序列化与反序列化?2、为什么要做序列化?3、Java 怎么进行序列化?总结1、什么是序列化与反序列化? 序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存...
    99+
    2024-04-02
  • json字符串反序列化失败怎么解决
    json字符串反序列化失败通常是由于以下几个原因导致的: JSON字符串格式不正确:确保JSON字符串遵循JSON格式标准,包括...
    99+
    2024-03-01
    json
  • Json字符串的序列化与反序列化怎么实现
    今天小编给大家分享一下Json字符串的序列化与反序列化怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们...
    99+
    2024-04-02
  • Java基础之序列化与反序列化详解
    目录1、什么是序列化与反序列化?2、Java如何实现序列化和反序列化?3、如何自定义序列化和反序列化呢?4、writeObject和readObject方法5、serializabl...
    99+
    2024-04-02
  • 【反序列化漏洞-02】PHP反序列化漏洞实验详解
    为什么要序列化 百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis,与数组类似)。以后,可以通过从存储区中...
    99+
    2023-09-21
    序列化 反序列化 PHP反序列化漏洞 PHP魔术方法 网络安全 Powered by 金山文档
  • Java序列化和反序列化(详解)
    一、理解Java序列化和反序列化 Serialization(序列化):将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。 deserializa...
    99+
    2023-09-11
    java 开发语言
  • Python文件的应用之序列化与反序列化详解
    目录初识序列化与反序列化什么是序列化?可序列化的数据类型Python 中的jsondumps() 与 loads() 函数可序列化数据类型演示案例bool 、None 类型的序列化与...
    99+
    2024-04-02
  • php反序列化之魔术方法超详细讲解
    目录php魔术方法__construct()与__destruct()__call__get__set__isset__unset__sleep__wakeup__toString_...
    99+
    2022-11-13
    php反序列化魔术方法 php魔术方法
  • Python 对象序列化与反序列化之pickle json详细解析
    目录引言picklejson尾语引言 将对象的状态信息转换为可以存储或传输的形式的过程叫作序列化 类似地从序列化后的数据转换成相对应的对象叫作 反序列化 本文介绍 Python 将对...
    99+
    2024-04-02
  • json格式的字符串序列化和反序列化的高级用法是什么
    json格式的字符串序列化和反序列化的高级用法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(1) 仅仅将指定属性对应的值序列化成字符串:var ...
    99+
    2023-06-04
  • JavaScript 中URL 查询字符串(query string)的序列与反序列化的方法
    目录方法一:方法二:方法一: 在 JavaScript 中,可以使用 URLSearchParams 对象来处理 URL 中的查询字符串。 序列化(将 JavaS...
    99+
    2023-01-11
    js url查询字符串 js  序列与反序列化
  • 反序列化漏洞详解
    目录 一、什么是序列化和反序列化 二、什么是反序列化漏洞 三、序列化函数(serialize) 四、反序列化(unserialize) ​五、什么是PHP魔术方法 六、一些常见的魔术方法 七、魔术方法的利用  八、反序列化漏洞的利用 1._...
    99+
    2023-09-02
    web安全 安全 php
  • PHP反序列化入门手把手详解
    PHP反序列化入门手把手详解 前言:文章内容大致可分为原理详解-漏洞练习- 防御方法。文章内容偏向于刚接触PHP反序列化的师傅,是一篇对PHP反序列化入门的手把手教学文章。文章特色在于对PHP反序...
    99+
    2023-10-20
    php 安全 web安全
  • php反序列化漏洞之pop链
    目录 POP链简介 pop面向属性编程: pop chain pop链利用技巧 1、在pop链中出现的方法: 2、反序列化中为了避免信息丢失,可以使用大写S,支持字符串的编码 3、深浅copy 4、利用php伪协议 POP键构造复现: 例...
    99+
    2023-09-29
    安全 web安全
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作