详解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_slice函数用法实例详解

    PHP中array_slice函数用法实例详解 概述 array_slice() 是 PHP 中处理数组的一个内置函数,用于获取数组的一个子集。 语法 array_slice(array $array, int $offset [, int $length = NULL [, bool $preserve_keys = FALSE ]]) : array 参…

    PHP 2023年5月26日
    00
  • 理清PHP在Linxu下执行时的文件权限方法

    理清 PHP 在 Linux 下执行文件权限的方法是非常重要的,因为它关系到在 Linux 上部署 PHP 应用程序时的安全性和稳定性。本文将介绍如何正确设置 PHP 文件的权限。 一、文件权限概述 Linux 系统中的文件和目录每个都有一个所有者,一个组,同时还有三个权限:读、写、执行。这些权限分别对应如下操作: 读权限(r):能够查看文件或目录中的内容。…

    PHP 2023年5月26日
    00
  • php实现网页常见文件上传功能

    PHP实现网页文件上传功能的完整攻略如下: 1. HTML表单 文件上传功能需要通过一个HTML表单向服务器传递数据。 <form enctype="multipart/form-data" action="upload.php" method="POST"> <input typ…

    PHP 2023年5月26日
    00
  • 微信小程序JSON配置文件详细讲解作用

    下面就为大家讲解一下微信小程序JSON配置文件的详细讲解。 什么是微信小程序JSON配置文件 小程序开发者可以通过 JSON 文件提供小程序的一些基本信息,如:名称、版本号、界面样式等等。JSON 文件是一种轻量级的数据交换格式,非常适合在客户端与服务器之间传输数据。 在微信小程序开发中,JSON 文件也被用作对小程序的配置进行管理。 JSON 配置文件的作…

    PHP 2023年5月30日
    00
  • php中rename函数用法分析

    PHP中rename()函数用法分析 简介 PHP中的rename()函数是用于重新命名或移动文件的,也可以用于重命名目录。其语法如下: rename ( string $oldname , string $newname , resource $context = ? ) : bool 参数说明: oldname:需重命名的文件/目录名,旧文件名。 new…

    PHP 2023年5月24日
    00
  • 50个优秀经典PHP算法大集合 附源码

    50个经典PHP算法大集合攻略 这50个经典PHP算法大集合非常实用,适用于PHP初学者与开发者。 下载源码 首先,你需要下载这50个优秀经典PHP算法大集合的源代码。在该网站的下载页面上,你可以找到每个算法的源代码和说明文档。 查看文档 阅读每个算法的说明文档,了解其作用、参数、返回值等信息。 测试算法 示例 1:求一个数组的平均值 例如,我们来测试一下a…

    PHP 2023年5月23日
    00
  • php中关于hook钩子函数底层理解

    下面是“PHP中关于hook钩子函数底层理解”的完整使用攻略,包括问题原因、解决方法和两个示例说明。 问题原因 在PHP中,hook钩子函数是一种常见的编程技术,可以在程序执行过程中插入自定义代码,以实现特定的功能。但是,对于一些初学者来说,可能不太理解hook钩子函数的底层原理,无法正确地使用它。 解决方法 以下是关于PHP中hook钩子函数的底层原理: …

    PHP 2023年5月12日
    00
  • PHP的curl函数的用法总结

    当使用PHP编写Web应用程序时,我们通常需要与其他服务器进行HTTP请求,常见的方式是使用curl库来发送HTTP请求。本文将详细介绍PHP的curl函数的用法,帮助你更好的使用curl来发送HTTP请求。 curl函数基础 PHP中使用curl发送HTTP请求需要用到curl扩展,如果你的PHP环境没有安装curl扩展,你需要先安装该扩展。 curl函数…

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