php的session机制

PHP中的session中的内容并不是放在内存中的,而是以文件的方式来存储的,存储方式就是由配置项 session.save_handler 来进行确定的,默认是以文件的方式存储

存储的文件是以sess_[sessionid]来进行命名的

在php 5.5.4以前默认选择的是php,5.5.4之后就是php_serialize

选择器 存储格式 样例 $_SESSION [‘name’]=’ocean’
php_serialize 经过 serialize () 函数序列化数组 a:1:{s:4:“name”;s:5:“ocean”;}
php (默认) 键名 竖线 经过 serialize () 函数处理的值 name|s:5:“ocean”;
php_binary 键名的长度对应的 ascii 字符佳宁 serialize () 函数序列化的值 name s:6:“spoock”;

反序列化方式

有$_SESSION变量赋值

1
2
3
4
5
6
7
8
9
<?php
ini_set('session.serialize_handler','php');
//ini_set("session.serialize_handler","php_serialize");
//ini_set("session.serialize_handler","php_binary");
session_start();
$_SESSION['lemon'] = $_GET['a'];
echo "<pre>";
var_dump($_SESSION);
echo "</pre>";

比如这里我get进去一个值为shy,查看一下各个存储格式:

1
2
3
php : lemon|s:3:"shy";
php_serialize : a:1:{s:5:"lemon";s:3:"shy";}
php_binary : lemons:3:"shy";

因此在数组存储session方式,即php_serialize下,可以插入|造成反序列化

最后由下一次session_start触发

没有$_SESSION变量赋值

当在php.ini中设置session.upload_progress.enabled = On的时候,可以设置上传一个名字为恶意序列化字符串的文件同时写入一个与PHP_SESSION_UPLOAD_PROGRESS同名文件,这时序列化字符串文件名会以键的形式储存在session中等待下次触发

img