Session反序列化

session简单介绍

在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

当第一次访问网站时,Seesion_start()函数就会创建一个唯一的Session ID,并自动通过HTTP的响应头,将这个Session ID保存到客户端Cookie中。同时,也在服务器端创建一个以Session ID命名的文件,用于保存这个用户的会话信息。当同一个用户再次访问这个网站时,也会自动通过HTTP的请求头将Cookie中保存的Seesion ID再携带过来,这时Session_start()函数就不会再去分配一个新的Session ID,而是在服务器的硬盘中去寻找和这个Session ID同名的Session文件,将这之前为这个用户保存的会话信息读出,在当前脚本中应用,达到跟踪这个用户的目的。

session 的存储机制

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

默认路径

/var/lib/php/sess_PHPSESSID
 /var/lib/php/sessions/sess_PHPSESSID
 /tmp/sess_PHPSESSID
 /tmp/sessions/sess_PHPSESSID

session反序列化攻击

|

处理器对应的存储格式
php键名+竖线+经过serialize()函数反序列化处理的值
php_binary键名的长度对应的ASCLL字符+键名+经过seralize()函数反序列化处理的值
php_serialize(php>/5.5.4)经过serialize()函数反序列化处理的数组-
session.save_path=""//设置session的存储路径
session.save_handler=""//设置用户自定义存储函数,如果使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式)
session.auto_start boolen//指定会话模块是否在请求开始时启动一个会话默认为0不启动
session.serialize_handler string//定义用来序列化或者反序列化的处理器名称。默认使用php(引擎)

session_start:在php.ini中设置为1时,php内部调用会话管理器,访问用户session被序列化之后,存储到指定目录(默认为/tmp)。

Directive(指令)含义
session.save_handlersession保存形式。默认为files
session.save_pathsession保存路径。
session.serialize_handlersession序列化存储所用处理器。默认为php
session.upload_progress.cleanup一旦读取了所有POST数据,立即清除进度信息。默认开启
session.upload_progress.enabled将上传文件的进度信息存在session中。默认开启。

Directive(指令) 含义

session.save_handler	session保存形式。默认为files
session.save_path	session保存路径。
session.serialize_handler	session序列化存储所用处理器。默认为php。
session.upload_progress.cleanup	一旦读取了所有POST数据,立即清除进度信息。默认开启
session.upload_progress.enabled	将上传文件的进度信息存在session中。默认开启。

basic函数:

session_create_id:	创建新会话ID
session_destory:	销毁一个会话中的全部数据
session_id:			获取/设置当前会话ID
session_name:		获取/设置会话名称
session_start:		启动新会话或者重用现有会话
session_status:		返回当前会话状态
session_unset: 		释放所有的会话容量

其中session_start():
当会话自动开始或者通过 session_start() 手动开始的时候, PHP 内部会依据客户端传来的PHPSESSID来获取现有的对应的会话数据(即session文件), PHP 会自动反序列化session文件的内容,并将之填充到 $_SESSION 超级全局变量中。如果不存在对应的会话数据,则创建名为sess_PHPSES SID(客户端传来的)的文件。如果客户端未发送PHPSESSID,则创建一个由32个字母组成的PHPSESSID,并返回set-cookie。

PHP_binary处理器

<?php
error_reporting(0);
ini_set('session.serialize_handler','php_binary');
session_start();
$_SESSION['sessionsessionsessionsessionsession'] = $_GET['session'];
?>
在这里插入图片描述

上面提到的三种处理器,下面来分别看看效果。

PHP处理器

<?php
error_reporting(0);
ini_set('session.serialize_handler','php');
session_start();
$_SESSION['session'] = $_GET['session'];
?>
在这里插入图片描述

PHP_serialize处理器

<?php
error_reporting(0);
ini_set('session.serialize_handler','php_serialize');
session_start();
$_SESSION['session'] = $_GET['session'];
?>

在这里插入图片描述
漏洞成因:
当网站序列化并存储Session与反序列化并读取Session的方式(调用引擎不同)不同时就可能导致session反序列化漏洞的产生。

发表评论

您的电子邮箱地址不会被公开。