• PHP session反序列化学习


    PHP session

    php session 反序列化漏洞存在的原因:当序列化session和读取反序列化字符时采用的序列化选择器不一样时,处理的方法不一样。

    php 三种序列化处理器

    序列化处理器
    php    		(php默认中使用的序列化)   存储格式为:键名 + 竖线 + 经过serialize()函数反序列化处理的值
    
    php_binary   存储格式:键名的长度对应的ASCII字符 + 键名 + 经过serialize()函数反序列化处理的值
    
    php_serialize 在php版本>5.5.4中可以选择使用   存储格式:经过serialize()函数反序列处理的数组
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通过php.ini 可以设置保存路径配置 php session 参数是 session.save_path=“保存路径”
    php 中配置session序列化处理器通过ini_set()方法进行选择 :ini_set(‘session.serialize_handler’, ‘处理器’);

    生成session php_serialize序列化处理器

    demo2.php
    <?php
    ini_set('session.serialize_handler', 'php_serialize');
    session_start();//创建一个session 会话(当客户端第一次访问时会生成一个随机的session文件在指定保存目录中)
    $_SESSION['session'] = $_GET['k'];
    var_dump($_SESSION);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    访问该页面
    在这里插入图片描述
    查看session 文件保存路径,生成了一个sess_一串随机字符的文件,打开文件查看,从get提交的值以序列化的格式存储到该文件。

    在这里插入图片描述

    在读取session时使用不一样的序列化处理器,使用php_serialize 序列化处理会把 符号 “|“作为一个正常的字符处理。而php序列化处理器会把”|” 当成分割符处理。

    ctf.php
    <?php
    ini_set('session.serialize_handler', 'php');
    session_start();
    class test{
        public $name;
        function __wakeup(){
            eval($this->name);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    构造反序列化payload为:k=|O:4:“test”:1:{s:4:“name”;s:17:“system(‘dir’);”;}
    访问demo2.php
    在这里插入图片描述

    查看sess文件内容:| 分割符被传递了进去

    在这里插入图片描述
    再访问ctf.php,触发了__wakeup函数从而执行了eval代码执行命令,由于使用不同的序列化处理器来处理session文件,序列化对特殊符号的处理方法不一样,从而导致产生了漏洞
    在这里插入图片描述

  • 相关阅读:
    深度学习-全卷积神经网络(FCN)
    信号包络及其提取方法(Matlab)
    16 【跨域】
    k8s教程(09)-容器获取pod信息(Downward API)
    PCL 投影点云
    7、迁移学习
    2023_Spark_实验六:Scala面向对象部分演示(二)(IDEA开发)
    sketch有哪些好用的技巧,很少人知道
    模糊查询如何按匹配度排序?
    洛谷 P5357 【模板】AC 自动机(二次加强版)(AC自动机,fail树)
  • 原文地址:https://blog.csdn.net/qq_42077227/article/details/127567246