详解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中array_rand函数的使用方法

    详解PHP中array_rand函数的使用方法 介绍 array_rand是一个PHP函数,它从数组中随机选择一个或多个键,并返回键的索引或索引数组。 语法 mixed array_rand ( array $array [, int $num = 1 ] ) 参数 array:必需。要从中获取随机键的数组。 num:可选。规定返回多少个随机的键。默认是 1…

    PHP 2023年5月26日
    00
  • PHP中常用的转义函数

    接下来是关于PHP中常用的转义函数的完整攻略。 转义函数简介 转义函数是指用来处理字符串转义问题的函数,主要用于处理数据在数据库操作、文件操作以及网络传输等情况下出现的不可打印字符和特殊字符问题,以及防止 SQL 注入攻击等问题。 常用的转义函数包括: addslashes() 函数:将字符串中的特殊字符进行转义,如:单引号、双引号、反斜杠等。 htmlsp…

    PHP 2023年5月26日
    00
  • PHP执行批量mysql语句的解决方法

    下面提供一份详细的 “PHP执行批量mysql语句的解决方法” 攻略。 什么是批量处理 批量处理,即一次执行多条 SQL 语句,这种方式可以提高效率,减少数据库服务器的请求次数,避免数据库管理员因为恶意注入等原因造成的数据库崩溃。 如何执行批量处理 使用 PHP fopen 函数实现文件读取 PHP 的函数 fopen() 用于打开文件,可以打开不同模式的文…

    PHP 2023年5月23日
    00
  • .NET c# 单体模式(Singleton)

    下面我将详细讲解“.NET c# 单体模式(Singleton)”的完整攻略。 什么是单体模式? 单体模式,也被称为单例模式,是一种创建型设计模式。它在应用程序需要访问全局对象时使用。单体模式确保整个应用程序中只存在一个对象实例并提供全局访问点访问该实例。 单体模式的实现方式 在 .NET c# 中,单体模式的实现方式如下: public sealed cl…

    PHP 2023年5月27日
    00
  • PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)

    PhpStorm的使用教程(本地运行PHP+远程开发+快捷键) 什么是PhpStorm PhpStorm是一款强大的PHP IDE,它提供了丰富的编辑器功能、代码自动完成、错误检测和调试功能等,能够极大提高PHP开发的效率和质量。 安装PhpStorm 在官网下载最新的PhpStorm安装包,解压后运行安装程序,根据提示完成安装。 本地运行PHP 使用XAM…

    PHP 2023年5月24日
    00
  • Windows下配置Nginx+PHP基本操作(启动、重启和退出)

    下面是在Windows系统下配置Nginx和PHP的完整攻略,包括启动、重启和退出操作: 1. 安装Nginx和PHP 首先需要安装Nginx和PHP,可以从官网下载对应的安装包进行安装。具体安装过程不再赘述。 2. 配置Nginx 接下来需要进行Nginx的配置,首先需要打开Nginx的配置文件nginx.conf。在Windows系统下,配置文件默认位于…

    PHP 2023年5月24日
    00
  • 微信小程序实现人脸检测功能

    微信小程序实现人脸检测功能攻略 1. 概述 人脸检测是计算机视觉领域中的一个重要的应用场景,在微信小程序中实现人脸检测功能也可以给用户带来极佳的用户体验。本攻略将介绍如何通过微信小程序实现人脸检测功能。 2. 实现步骤 2.1 在微信公众平台中创建小程序账号 首先需要在微信公众平台中创建小程序账号,此过程比较简单,这里就不详细介绍了。 2.2 新建小程序项目…

    PHP 2023年5月23日
    00
  • PHP连接数据库实现页面增删改查效果

    一、准备工作 在使用PHP连接数据库实现页面增删改查之前,需要先进行一些准备工作,包括: 安装PHP环境 和 MySQL数据库 创建一个数据库并在其中创建一个表格 下载并安装一个编辑器,比如Visual Studio Code 二、连接数据库 在连接数据库之前,需要在PHP文件中定义一些连接数据库所需的变量: <?php $host = "l…

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