因为我使用的是phpstudy搭建的环境所以路径比较奇怪
常见的存储位置 /var/lib/php5/sess_PHPSESSID /var/lib/php7/sess_PHPSESSID /var/lib/php/sess_PHPSESSID /tmp/sess_PHPSESSID /tmp/sessions/sess_PHPSESSED session反序列化原理
session的存储机制
测试代码: <?php //ini_set('session.serialize_handler', 'php'); //ini_set("session.serialize_handler", "php_serialize"); ini_set("session.serialize_handler", "php_binary"); session_start(); $_SESSION['Lmg'] = $_GET['a']; echo "<pre>"; var_dump($_SESSION); echo "</pre>"; ?>
分别注释查看不同机制的保存方式,我们分别?a=123查看
Lmg|s:3:"123"; ----------------ini_set('session.serialize_handler', 'php'); php机制
a:1:{s:3:"Lmg";s:3:"123";} ----------------ini_set("session.serialize_handler", "php_serialize"); php_serialize机制
Lmgs:3:"123";
-----------------ini_set("session.serialize_handler", "php_binary");
php_binary机制
产生session反序列的原因就在程序员在读取或者存储中使用了不同的机制,我们以php_serialize格式来存储,用php机制来读取
测试代码:
存储session代码:
读取session代码:
<?php ini_set("session.serialize_handler", "php"); session_start(); class student { var $name; var $age; function __wakeup(){ echo $this->name; } } ?>我们先构造一个student的类来生成我们想要的目的
<?php class student { var $name; var $age; } $Lmg = new student(); $Lmg->name = "hack"; $Lmg->age = "19"; echo serialize($Lmg); ?>生成的序列化字符串
O:7:"student":2:{s:4:"name";s:4:"hack";s:3:"age";s:2:"19";}
我们构造在储存页面构造payload,只需要在上面的字符串前加|就可,为什么呢???
如果我们传入的数值中有|那么在读取时就认为后面是我们要反序列化的字符串,从而达到目的
将构造的字符串传入存储php中计:?a=|O:7:"student":2:{s:4:"name";s:4:"hack";s:3:"age";s:2:"19";}
查看储存的字符串:a:1:{s:3:"Lmg";s:60:"|O:7:"student":2:{s:4:"name";s:4:"hack";s:3:"age";s:2:"19";}
所以达到了目的
查看一下读取的php,成功打印了hack
没有$_SESSION赋值的session反序列化
在php中存在一个upload_process机制,可以自动创建$_SESSION一个键值对,而且其中的值用户可以控制,文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态
什么意思呢????意思上传文件,同时post一个于session.upload_process.name同名的变量。后端就会自动将post的这个同名变量作为键,进行序列化然后存储到session文件中,下次请求就会反序列化session文件 一个ctf题来实践了解一下