Session的配置选项和存储方式
在php.ini中存在四项配置项:
session.save_path="" --设置session的存储路径
session.save_handler="" --设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式)
session.auto_start boolen --指定会话模块是否在请求开始时启动一个会话,默认为0不启动
session.serialize_handler string --定义用来序列化/反序列化的处理器名字。默认使用php
在kali里面php的默认配置
session.save_path="/var/lib/php/sessions" 表明所有的session文件都是存储 在/var/lib/php/sessions下
session.save_handler=files 表明session是以文件的方式来进行存储的
session.auto_start=0 表明默认不启动session
session.serialize_handler=php 表明session的默认序列化引擎使用的是php序列话引擎
session序列化引擎的储存方式
php_binary: 存储方式是,键名的长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值
php: 存储方式是,键名+竖线+经过serialize()函数序列处理的值
php_serialize(php>5.5.4): 存储方式是,经过serialize()函数序列化处理的值
漏洞成因
session在序列化存储的时候有多种不同的方式,因此要是php在反序列化我们存储的session数据和读取session时所使用的session.serialize_handler(引擎)不同,那么就有可能引发安全问题。
例如在php.ini的配置文件中默认的引擎是php_serialize
<?php
session_start();
$_SESSION['username'] = '|O:3:"qaq":0:{}';
那么在session储存文件里面的就是
a:1:{s:8:"username";s:15:"|O:3:"qaq":0:{}";}
此时因为程序员的失误,将读取session的引擎设置为php
<?php
ini_set('session.serialize_handler', 'php');
session_start();
var_dump($_SESSION);

然后会在session_start()返回session会话里面存储数据时,php引擎的反序列化作用下得到了qaq类。这是因为当使用php引擎的时候,php引擎会以|作为作为key和value的分隔符,那么就会将a:1:{s:8:"username";s:15:"作为SESSION的key,将o:3:"qaq":0:{}作为value,进行反序列化,最后就会得到qaq这个类。这也就导致了反序列化漏洞。
可以看一下session_staer()的处理方式和session的工作原理

本文详细解析了PHP中session.upload_progress引发的反序列化漏洞,涉及配置、存储方式、漏洞成因及利用条件,包括不同引擎的序列化处理和环境搭建案例。
最低0.47元/天 解锁文章
596

被折叠的 条评论
为什么被折叠?



