网络编程
位置:首页>> 网络编程>> php编程>> PHP session反序列化漏洞超详细讲解

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

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

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

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

0
投稿

猜你喜欢

  • 呵呵,先说明一下下面的程序大部分收集自网络,因为本人在asp编程中经常使用到随机函数,所以收集了一些这类的函数,并做了些注释,方便使用。首发
  • 很有创意的鼠标指针风筝,看起来非常有意思。在网络上看到的,一下也想不起来是那里的了,所以特别说一下图片是来自网络的,版权归作者所有。
  • 1、信息表新建立一个字段,并用0、1的方法判断信息的状态。 2、新建一个页面,定时刷新,并查询表中是否有字段值为0的记录。 3、当管理员点击
  • 翻译说明:这是Solid State Group网站上的一篇很友好的文章,解决了我在设计中遇到的很多问题,故在此我翻译其文,并对原作者表示非
  • conn.execute、rs.open之间的差别,conn.execute、rs.open、command.execute方法用法大大不同
  • 第一步:创建转向控制页面创建网站默认的首页文件(通常为"index.asp"或"default.asp&quo
  • 可能不少学习javascript在使用call,apply,callee时会感到困惑,以下希望对于你有所帮助:1、它是函数的方法或属性;2、
  • 这是 COMSHARP CMS 团队翻译的2009年海外Web设计风潮的第二部分,着重讲解了反 Box 式布局,单页布局,多栏布局,巨型插图
  • 方法一:简单,得不到参数,只有一个虚拟路径 代码如下:GetUrl =request("url") 例如:http://
  • Microsoft SQL Server 7.0安全问题Microsoft Corporation【「Microsoft SQL Serve
  • 前言 一直用ASP+ACCESS来编写网页和公司的内部应用系统,内部应用系统也就是大家说的OA吧,这个我也不知道,公司又叫它ERP,反正不管
  • 页面访问慢是网站公认的死穴,如果页面都没法访问,往后再精彩的体验都等于零。这个问题如果专业点说,叫做“加载”呈现效率。那么具体了讲,除常规的
  • 1.新建四个层,放入相应图片,模特层的z-index值设为0。2.把第一个层移到模特身上,找出衣服刚好穿上时层的top和left值,记下来,
  • 前段时间在网上找了一个“完美的”JavaScript对象克隆的函数,感觉还不错,但随后便出现了一些问题,发现这个克隆并不好用,在使用发现了如
  • 以前在一个图书类网站看到这样一个功能:客户可以按条件搜索书目的信息,服务器会将符合条件的信息筛选出来保存为一个Excel文件供客户下载。今天
  • jquery基本入门 第一天:选择器相关 1.html()与.text() .html()取得第一个匹配元素的html内容。会带有标签,.t
  • 行业首页改版的缘故,为了让我们设计师可以更好的了解需求、了解我们的用户,和部门的用研童鞋一起讨论决定使用电话来进行用户访谈,以此来了解用户。
  • 以下为SQL SERVER7.0以上版本的字段类型说明。SQL SERVER6.5的字段类型说明请参考SQL SERVER提供的说明。bit
  • 今天我们继续向大家介绍一款翻页效果的制作。当鼠标移动到链接上时,翻页的链接区除了有悬停效果,还会放大。这样的效果具有很强烈的效果。大家适当美
  • SQL Server 阻止了对组件 'Ad Hoc Distributed&nbs
手机版 网络编程 asp之家 www.aspxhome.com