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

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

在介绍php反序列化中的字符逃逸法之前,需要先了解序列化和反序列化的基本概念。所谓序列化是将一个对象转换成一个字符串,反序列化是将一个字符串转换成一个对象。当两个系统需要交换数据时,就需要序列化和反序列化。php的序列化函数是serialize(),反序列化函数是unserialize()。

在php中,当序列化一个类时,会将对象中的所有属性和方法都序列化,并在序列字符串前加上类的名称和一些其他信息。反序列化时,会将序列化字符串转换成一个对象,并通过类的__wakeup()方法将对象属性还原为原始状态。

php反序列化漏洞的成因

php反序列化漏洞是指攻击者可以构造一些恶意的序列化字符串,将其提交到服务端,服务端在反序列化过程中执行了攻击者预设好的恶意代码。造成反序列化漏洞的成因主要有两点:
1. 反序列化时不做严格的数据检验导致漏洞;
2. 攻击者通过构造恶意的输入,使得反序列化的结果不可预期,进而实现代码执行。

接下来,我们将深入探讨如何利用php的反序列化漏洞之字符逃逸法。

php反序列化字符逃逸法的原理

php反序列化字符逃逸法本质上是通过在序列化时使用一些特殊的字符,从而欺骗反序列化函数认为反序列化过程已经结束,达到Bypass的效果。

具体来讲,就是在序列化时使用双引号包围的字符串中嵌套反斜杠,这样在反序列化时,反序列化函数会认为字符串已经结束,并将反斜杠后的内容看做代码执行。

php反序列化字符逃逸法的攻击步骤

接下来,我们将介绍php反序列化字符逃逸法的具体攻击步骤,以攻击CMS Made Simple 2.2.8版本为例:

  1. 根据漏洞信息,我们可以确定漏洞存在于/classes/SmartyCustom.php文件的getSmarty()函数中。在函数中,我们发现unserialize()函数被调用,容易推断出序列化字符串来自cookie中的‘__cms’参数。
        private function getSmarty($template_dir, $compile_dir, $cache_dir, $config_dir)
        {
            if ($this->smty==null) {
                $smarty = new \Smarty;
                $smarty->setTemplateDir($template_dir);
                $smarty->setCompileDir($compile_dir);
                $smarty->setCacheDir($cache_dir);
                $smarty->setConfigDir($config_dir);
                if (isset($_COOKIE['__cms'])) {
                    $smarty->assign(unserialize($_COOKIE['__cms']));
                }
                $this->smty = $smarty;
            }
            return $this->smty;
        }
  1. 我们在cookie中添加‘__cms’参数,并在其中写入构造好的序列化字符串。值得注意的是,在序列化中,我们添加了双引号包围的字符串,并将其中的反斜杠进行了嵌套。
O:4:"Pwn3d":1:{s:7:"message";s:55:"Hello from '\\"\}\}\]\');";}`}
  1. 页面重新加载时,unserialize()函数将读取cookie中的‘__cms’参数,并将其解析成对象。在解析字符串时,unserialize()函数将双引号包围的字符串视为一个完整的参数,而忽略其中的反斜杠。
"O:4:\"Pwn3d\":1:{s:7:\"message\";s:55:\"Hello from '\"}}]');\";}"
  1. 最终,由于字符串被视为完整字符串,而反斜杠被忽略,导致执行了恶意代码,在页面中弹出‘Hello from '"+}}]');”的弹窗。

示例1:php反序列化字符逃逸法的适用场景

攻击者之所以会利用php反序列化字符逃逸法,一方面是因为其实现简单,另一方面是其比较适用于一些开发框架或应用中自动进行序列化和反序列化的场景。下面我们来看一个具体的例子。

在php中,我们经常使用ORM(Object-Relational Mapping)框架来进行数据库操作。ORM框架会将对象转换成对应的数据库表结构,并在查询时将查询结果转换成对应的对象,这就涉及到了序列化和反序列化。

例如,我们使用了yii2框架,并且我们的模型中存在安全漏洞,攻击者可以提交特殊的数据使得框架进行反序列化,并执行恶意代码。这时,攻击者就可以利用字符逃逸法来构造序列化字符串,从而通过美妙的序列化达到攻击的目的。

示例2:php反序列化字符逃逸法的实战演练

接下来,我们将通过一个实例演练如何使用php反序列化字符逃逸法进行攻击。本次演练的目标是官方提供的PHP Object Injection漏洞演示网站。这个漏洞网站中,存在一个图书管理系统,并且用户可以通过该系统将自己的图书添加进去。

可以通过添加具有恶意的序列化数据的POST请求来进行攻击。攻击流程步骤为:

  1. 使用Burp Suite进行数据包拦截,并且修改管理员的cookies(PHPSESSID)。进入CMS的主界面。点击Library Manager,进入图书管理页面。

  2. 添加图书,利用cookie进行基于序列化的注入。

  3. 注入代码,我们将代码注入到图书名称中。在名称中写入如下序列化字符串:

O:8:"BookClub":1:{s:4:"name";s:54:"a";s:4:"desc";s:0:"";s:8:"position";i:0;O:8:"bookClu……»…}";}

其中,符号……»…被使用作为一个反斜杠。

  1. 重新加载界面时,服务器将读取cookies中的用户信息,并通过反序列化构造一个图书对象。由于字符串被视为完整字符串,而反斜杠被忽略,导致执行了恶意代码,使得攻击者可以获取到管理员的cookies,从而劫持管理员的会话。

综上所述,php反序列化字符逃逸法是一种危害巨大的攻击手段,对于那些利用反序列化实现自动化序列化和反序列化的使用场景尤为危险。因此,作为开发者应该时刻意识到php反序列化漏洞的可能性,加强对用户储存数据的严格校验及过滤,同时需要谨慎选择使用反序列化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解php反序列化之字符逃逸法 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • PHP树的深度编历生成迷宫及A*自动寻路算法实例分析

    要详细讲解“PHP树的深度编历生成迷宫及A*自动寻路算法实例分析”的攻略,可以从以下几个方面展开讲解: 算法说明 首先需要介绍一下算法的原理,可以结合代码实现进行分析。这个算法主要分为两部分,第一部分是生成迷宫,第二部分是利用A算法进行自动寻路。生成迷宫是通过树的深度优先遍历实现的,其中可以对不合法的路径进行剪枝,最后得到一个随机生成的迷宫。在进行寻路时,使…

    PHP 2023年5月27日
    00
  • php从右向左/从左向右截取字符串的实现方法

    要实现从右向左或从左向右截取字符串,可以使用PHP中的substr函数。该函数有三个参数:字符串、开始位置和长度。开始位置从0开始计数。 从左向右截取字符串的示例: $str = "Hello World"; $sub_str = substr($str, 0, 5); // 获取从开始位置到第5个字符的子串 echo $sub_str;…

    PHP 2023年5月26日
    00
  • php调用自己java程序的方法详解

    针对“php调用自己java程序的方法详解”,我们可以从以下三个方面进行讲解: Java程序的封装和构建 PHP调用Java程序的方法 示例说明 1. Java程序的封装和构建 首先,我们需要将Java程序封装成jar包,这可以通过Eclipse等Java开发工具实现: 进入Eclipse,打开Java工程。 右键点击该工程,选择Export,找到Java中…

    PHP 2023年5月26日
    00
  • 支付宝小程序蚂蚁应用内测截图曝光

    支付宝小程序蚂蚁应用内测截图曝光 最近有消息称,支付宝小程序蚂蚁应用即将上线内测。下面我们就来讲解一下蚂蚁应用内测的完整攻略。 步骤一:下载蚂蚁开发者工具并注册开发者账号 首先,需要先下载蚂蚁开发者工具并注册开发者账号。蚂蚁开发者工具下载地址为:https://opendocs.alipay.com/mini/ide/download。 注册开发者账号的流程…

    PHP 2023年5月23日
    00
  • PHP实现的数组和XML文件相互转换功能示例

    下面我将为您详细讲解如何使用PHP实现数组和XML文件的相互转换。 一、数组转XML文件 示例代码 <?php //定义一个数组,包含多个键值对 $data = array( array("title" => "Jogging and Running", "description" =&…

    PHP 2023年5月26日
    00
  • 浅谈PHP正则表达式中修饰符/i, /is, /s, /isU

    正则表达式(regular expression)是一种强大的文本匹配工具,很多编程语言都支持正则表达式,其中就包括PHP。在使用PHP正则表达式的时候,我们不仅需要指定要匹配的文本,还需要指定一些修饰符,以控制正则表达式的匹配方式。本篇文章将详细讲解PHP正则表达式中常用的修饰符/i、/is、/s和/isU,以及它们的用法和特点。 修饰符/i 修饰符/i(…

    PHP 2023年5月26日
    00
  • 在PHP中实现Javascript的escape()函数代码

    首先,我们需要了解JavaScript中escape()函数的作用,它可以将字符串转义为可传输字符序列,这在客户端和服务器端交互中很有用。为了在PHP中实现这个功能,我们可以使用php内置函数urlencode()和rawurlencode()。 urlencode()函数将字符串中的非字母数字字符转换为 “%” 后面跟两个表示该字符ASCII值的十六进制数…

    PHP 2023年5月27日
    00
  • 详解php内存管理机制与垃圾回收机制

    详解PHP内存管理机制与垃圾回收机制 前言 PHP是一种高级编程语言,其自动内存管理和垃圾回收机制可以帮助开发者避免手动内存管理的麻烦,但也需要开发者了解其内存管理机制和垃圾回收机制,才能更好地编写高效的代码。 PHP内存管理机制 PHP内存管理机制是通过Zend Memory Manager实现的,其主要分配和管理以下几种类型的内存: Per-Reques…

    PHP 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部