在PHP.ini中存在三项配置项:
以上的选项就是与PHP中的Session存储和序列话存储有关的选项。
在使用xampp组件安装中,上述的配置项的设置如下:
在上述的配置中,session.serialize_handler是用来设置session的序列话引擎的,除了默认的PHP引擎之外,还存在其他引擎,不同的引擎所对应的session的存储方式不相同。
PHP_binary:存储方式是,键名的长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值
PHP:存储方式是,键名+竖线+经过serialize()函数序列处理的值
PHP_serialize(PHP>5.5.4):存储方式是,经过serialize()函数序列化处理的值
在PHP中默认使用的是PHP引擎,如果要修改为其他的引擎,只需要添加代码ini_set('session.serialize_handler','需要设置的引擎');。示例代码如下:
session 的目录在 /var/lib/PHP/sessions 中
在 PHP_serialize 引擎下,session文件中存储的数据为:
由于name的长度是4,4在ASCII表中对应的就是EOT。根据PHP_binary的存储规则,最后就是names:6:"spoock";。(突然发现ASCII的值为4的字符无法在网页上面显示,这个大家自行去查ASCII表吧)
PHP Session中的序列化危害
PHP中的Session的实现是没有的问题,危害主要是由于程序员的Session使用不当而引起的。
如果在PHP在反序列化存储的$_SESSION数据时使用的引擎和序列化使用的引擎不一样,会导致数据无法正确第反序列化。通过精心构造的数据包,就可以绕过程序的验证或者是执行一些系统的方法。例如:
但此时模拟在其他页面使用不同的PHP引擎来读取时的内容如下:(默认使用PHP引擎读取session文件)
这是因为当使用PHP引擎的时候,PHP引擎会以|作为作为key和value的分隔符,那么就会将 a:1:{s:4:"ryat";s:30:" 作为SESSION的key,将 O:1:"A":1:{s:1:"a";s:2:"xx";} 作为value,然后进行反序列化,最后就会得到A这个类。
这种由于序列话化和反序列化所使用的不一样的引擎就是造成PHP Session序列话漏洞的原因。漏洞在加载使用PHP引擎的页面时session去读session中的内容并反序列化导致漏洞触发,不需要任何输出
GCTF上的一道session反序列化漏洞分析:
在PHP中,经常会使用序列化操作来存取数据,但是在序列化的过程中如果处理不当会带来一些安全隐患。