PHP session的反序列化你了解吗

session反序列化的漏洞是由三种不同的反序列化引擎所产生的的漏洞

其中

session.serialize_handler string--定义用来序列化/反序列化的处理器名字。默认使用php

若使用如下设置:

<?php
//ini_set('session.serialize_handler', 'php');
//ini_set("session.serialize_handler", "php_serialize");
ini_set("session.serialize_handler", "php_binary");
phpinfo();

则改变了序列化的引擎

save_path则是session的存放路径 我们可以通过改变ini_Set来查看不同引擎下的序列化的类型

三种引擎的存储格式:

php : a|s:3:"wzk";
php_serialize : a:1:{s:1:"a";s:3:"wzk";}
php_binary : as:3:"wzk";

漏洞产生在于

php引擎的存储格式是键名 |serialized_string,而php_serialize引擎的存储格式是serialized_string。如果程序使用两个引擎来分别处理的话就会出现问题。
session_start() 会创建新会话或者重用现有会话。 如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。

所以如果存在两种不同的引擎,就可以利用session_start()的自动反序列化,把我们想要传输的数据传输到服务器中:

eg:

<?php
ini_set("session.serialize_handler", "php_serialize");
session_start();
$_SESSION['swaggyp'] = $_GET['a'];
echo var_dump($_SESSION);

代码1:用来保存在本地一个session

代码2:

<?php
ini_set('session.serialize_handler', 'php');
session_start();
echo var_dump($_SESSION);
class student{
    var $name;
    var $age;
    function __wakeup()
    {
        // TODO: Implement __wakeup() method.
        echo "wzk".$this->name;
    }
}

用于读取session然后进行反序列化 若wakeup方法被调用则说明反序列化成功

<?php
class student{
    var $name;
    var $age;
}
$a = new student();
$a->nage =  "swaggyp";
$a->age = "1111";
echo serialize($a);
//O:7:"student":3:{s:4:"name";N;s:3:"age";s:4:"1111";s:4:"nage";s:7:"swaggyp";}

该代码用于生成一个一个序列

参考于:

生成后,在1中传入这段序列化的值并在开头加入 | 则在第二个文件被解析的时候,就会把|后的内容直接当成一个类去解析 实现我们的目的

成功了

php 这个session.serialize_handler 将 | 后的字符串反序列化,导致产生恶意对象。

upload过程中会产生session,存在一个键值对的值为filename(可控),如果filename被我们修改为|+序列化对象字符串(特殊字符记得转义),filename |后的内容就会被认为是序列化的内容,进而反序列化产生恶意对象(实际上PHP中session是写到文件中的,我们暂且忽略这一中间步骤对此处并无影响),在对象自毁时去执行__destruct()内的语句

<form action =“ upload.php” method =“ POST” enctype =“ multipart / form-data”>
    <input type =“ hidden” name =“ PHP_SESSION_UPLOAD_PROGRESS” value =“ ryat” />
    <input type =“ file” name =“ file” />
    <input type =“ submit” />
</ form>

S E S S I O N 中 的 键 值 就 会 为 _SESSION中的键值就会为 S​ESSION中的键值就会为_SESSION[“upload_progress_ryat”],在会话上传过程中,将对会话数据进行序列化/反序列化,序列化格式由php.ini中的session.serialize_handler选项设置。 这意味着,如果在脚本中设置了不同的serialize_handler,那么可以导致注入任意session数据

题目:

<?php
//A webshell is wait for you
ini_set('session.serialize_handler', 'php');
session_start();
class OowoO
{
    public $mdzz;
    function __construct()
    {
        $this->mdzz = 'phpinfo();';
    }
    function __destruct()
    {
        eval($this->mdzz);
    }
}
if(isset($_GET['phpinfo']))
{
    $m = new OowoO();
}
else
{
    highlight_string(file_get_contents('index.php'));
}
?>

构造登录框和payload

总结

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

(0)

相关推荐

  • php中cookie与session的区别点总结

    本教程操作环境:windows7系统.PHP7.1版.DELL G3电脑 无论是在系统运维还是 PHP 开发人员的面试中,经常会被问到 Session 和 Cookie 在 PHP 中的区别?下面我们就来总结一下: Cookie 仅由客户端生成.管理并使用,PHP 只是发出指令要求客户端如何生成 Cookie.何时过期等,但是客户端不一定会按照 PHP 的指令办事. Cookie 不是很安全,不法分子可以通过分析本地的 Cookie 进行 Cookie 欺骗.考虑到安全问题,建议将用户的重要信息

  • java设计模式七大原则之开闭原则示例详解

    目录 1.什么是开闭原则? 2.违反Ocp代码案例 3.遵守Ocp代码案例 1.什么是开闭原则? 开闭原则(Open Closed Principle)是编程中最基础.最重要的设计原则.一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方).用抽象构建框架,用实现扩展细节.当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化.编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则. 2.违反Ocp代码案例 package com.

  • 深入解析PHP中SESSION反序列化机制

    简介 在php.ini中存在三项配置项: session.save_path=""   --设置session的存储路径 session.save_handler="" --设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式) session.auto_start   boolen --指定会话模块是否在请求开始时启动一个会话,默认为0不启动 session.serialize_handler   string --定义用来序

  • 深入浅析PHP的session反序列化漏洞问题

    在php.ini中存在三项配置项: session.save_path="" --设置session的存储路径 session.save_handler="" --设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式) session.auto_start boolen --指定会话模块是否在请求开始时启动一个会话,默认为0不启动 session.serialize_handler string --定义用来序列化/反序列化的处

  • PHP session的反序列化你了解吗

    session反序列化的漏洞是由三种不同的反序列化引擎所产生的的漏洞 其中 session.serialize_handler string--定义用来序列化/反序列化的处理器名字.默认使用php 若使用如下设置: <?php //ini_set('session.serialize_handler', 'php'); //ini_set("session.serialize_handler", "php_serialize"); ini_set("

  • 解析php中session的实现原理以及大网站应用应注意的问题

    PHP SESSION原理我们知道,session是在服务器端保持用户会话数据的一种方法,对应的cookie是 在客户端保持用户数据.HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系,最早,Netscape将cookie引入浏览器,使得 数据可以客户端跨页面交换,那么服务器是如何记住众多用户的会话数据呢? 首先要将客户端和服务器端建立一一联系,每个客户 端都得有一个唯一标识,这样服务器才能识别出来.建议唯一标识的方法有两种:cookie或者通过GET方式指定.默认配置的PHP

  • session 加入mysql库的方法

    我们知道,session是一种会话技术,用来实现跨脚本共享数据或者检测跟踪用户状态. session的工作原理 (1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中. (2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量. (3)当执行PHP脚本时,通过使用session_register()函数注册session变量. (4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下

  • ThinkPHP关于session的操作方法汇总

    本文详细讲述了ThinkPHP关于session的各种操作方法,详情如下: ThinkPHP操作session官方的说明文档如下: start 启动session pause 暂停session clear 清除session destroy 销毁session get 获取session值 getLocal 获取私有session值 set 设置session值 setLocal 设置私有session值 name 获取或者设置session_name is_set 是否设置session值

  • php网络安全session利用的小思路

    目录 前言 session文件包含 php.ini [WMCTF 2020]Make PHP Great Again session维持 方法一 | 借助Burp Suite 方法二 | python脚本 方法三(非预期) | 伪协议配合多级符号链接的办法进行绕过. session反序列化 Jarvis OJ WEB PHPINFO 小结 前言 做题的时候经常考到session利用,常见的基本就两种,session文件包含和session反序列化,之前没有详细总结过,就写写吧. session文

  • ThinkPHP惯例配置文件详解

    ThinkPHP的系统内置有一个惯例配置文件(位于系统目录下面的Conf\convention.php),按照大多数的使用对常用参数进行了默认配置.本文对惯例配置文件作出注释详解如下,供大家参考: <?php /** +------------------------------------------------------------------------------ * ThinkPHP惯例配置文件 * 该文件请不要修改,如果要覆盖惯例配置的值,可在项目配置文件中设定和惯例不符的配置项

  • 解析thinkphp基本配置 convention.php

    复制代码 代码如下: return  array( /* 项目设定 */    'APP_DEBUG'                => false,    // 是否开启调试模式    'APP_DOMAIN_DEPLOY'     => false,   // 是否使用独立域名部署项目    'APP_SUB_DOMAIN_DEPLOY' => false,   // 是否开启子域名    'APP_PLUGIN_ON'         => false,   // 是否开启

  • session的存储方式和配置方法介绍

    1.Session的存储方式. session其实分为客户端Session和服务器端Session. 当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识.SessionID是一个由24个字符组成的随机字符串.用户每次提交页面,浏览器都会把这个SessionID包含在 HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端.这个SessionID就是保存在客户端的,属于客户端Session. 其实客户端Session默认是以co

随机推荐