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

yizhihongxing

详解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日

相关文章

  • .NET Core 实现微信小程序支付功能(统一下单)

    .NET Core 实现微信小程序支付功能(统一下单)攻略 微信小程序支付功能是一种常见的电商需求,本攻略将介绍如何使用.NET Core实现微信小程序支付功能的统一下单流程。 基本流程 微信小程序支付主要包含以下基本流程: 用户在小程序中选择商品并发起支付请求; 小程序调用开发者服务器,向后端发送订单信息; 开发者服务器向微信支付服务器发起统一下单请求; …

    PHP 2023年5月30日
    00
  • PHP生成二维码与识别二维码的方法详解【附源码下载】

    PHP生成二维码与识别二维码的方法详解【附源码下载】 二维码是现代社会中非常重要的一种信息传输和识别方式。在编写网络应用程序时,可能需要在网站上嵌入二维码,或者解析用户提供的二维码数据。本文将介绍使用PHP生成和解析二维码的方法,并提供相应的源码供读者下载。 生成二维码的方法 生成二维码需要用到PHP Library,我们这里使用PHP QR Code Li…

    PHP 2023年5月26日
    00
  • 简单谈谈PHP vs Node.js

    简单谈谈PHP vs Node.js 前言 本文旨在探讨PHP和Node.js这两种Web开发语言的异同,并提供一些使用示例供读者参考。本文并非对PHP和Node.js的全面对比,仅供参考。 PHP和Node.js的异同 PHP和Node.js都是用于Web开发的语言,但它们的设计理念和实现方式却有很大的差异。下面我们将从几个方面来简单谈谈它们的异同。 编程…

    PHP 2023年5月26日
    00
  • 微信小程序 form组件详解

    微信小程序 form组件详解 简介 form组件是微信小程序中的一个表单组件,主要用于提交表单数据。在开发微信小程序中,使用form组件可以大大简化表单的开发过程,减少代码量。 使用方法 form组件的基本使用方法如下: <form bindsubmit="submitForm"> <input type="t…

    PHP 2023年5月23日
    00
  • php实现zip压缩文件解压缩代码分享(简单易懂)

    本文将介绍如何使用PHP实现ZIP压缩文件和解压缩文件,下面是完整攻略。 准备工作 在进行ZIP压缩和解压缩之前,需要进行以下准备工作: 1.安装ZIP扩展库:PHP默认不支持ZIP扩展,在使用ZIP相关的函数时需要先安装此扩展库。 2.准备要压缩或解压缩的文件或目录。 ZIP压缩文件 下面是一个简单的PHP函数,用于将文件或目录压缩为ZIP文件: func…

    PHP 2023年5月26日
    00
  • php 接口与前端数据交互实现示例代码

    下面我将为大家讲解“PHP 接口与前端数据交互实现示例代码”的完整攻略。 什么是 PHP 接口? PHP 接口,也叫 PHP 接口类,是一种特殊的类,它只有接口方法的声明,没有具体的实现。PHP 接口主要用于定义一组公共的方法,用于规范类的使用或类之间的通信。 如何实现 PHP 接口与前端数据交互? PHP 接口可以通过 HTTP 协议与前端进行数据交互,实…

    PHP 2023年5月27日
    00
  • PHP编程实现脚本异步执行的方法

    实现PHP脚本异步执行有多种方法,下面将介绍其中两种主要方法: 使用pcntl_fork()函数进行异步执行 该方法需要使用到pcntl扩展。它允许我们创建一个子进程,并在子进程中执行需要异步处理的任务。示例代码如下: <?php // 父进程代码 $pid = pcntl_fork(); if ($pid == -1) { // 创建子进程失败 ex…

    PHP 2023年5月23日
    00
  • 机械师F117-V值得买吗 机械师F117-V游戏本全面评测

    机械师F117-V值得买吗?——游戏本全面评测 前言 机械师F117-V是一款高性能游戏本,其配置和设计均表现出了极高的竞争力。但是用户在购买前还是需要了解该设备是否值得购买,本文将对机械师F117-V进行全面评测,帮助用户做出明智的购买决策。 设计 机械师F117-V采用了全黑色金属外壳,给人以非常沉稳豪华的感觉。同时机身重量为2.2kg,也非常适合携带。…

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