获取中...

-

Just a minute...

前置知识

首先我们要了解session是什么

session又被称为会话控制 和cookie类似 用于保持会话的
但是cookie一般是存储再客户端的 session一般是存储在服务端的

在PHP中 有一个php_session变量 用于存储session值
当PHP开始工作的时候 PHP会尝试从请求中查找一个session 并且保存在$_session变量之中

当PHP结束的时候 它会自动读取 $_SESSION 中的内容,并将其进行序列化 然后发送给会话保存管理器来进行保存

大致的工作流程可以参考这张图片![[Pasted image 20260309204919.png]]

漏洞发生点

就像我们在阅读同一句话的时候有不同的断句

比如下面这一段话
人多病少财富
可以表示出两种截然不同的意思

  • 人多,病少,财富
  • 人多病,少财富

在PHP中也是一样 对于数据读入和读出session 序列化内容和反序列化内容在使用不同的处理器的时候会存在不同的差异

这个处理器的设置在PHP中是通过session.serialize_handler实现的
一般存在三个处理器

php

存储格式:键名 + 竖线 + 经过serialize()函数序列化处理的值

php_serialize

存储格式:经过序列化函数serialize处理之后的数组内容

php_binary

键名长度对应的ASCII字符+键名+经过serialize()函数反序列化处理的值

漏洞演示

一般而言 session反序列化比较常见的情况是php和php_serialize两个处理器的矛盾

演示思路

  1. 通过使用php_serialize的页面上传能够创建某个对象的恶意代码
  2. 通过使用php处理器的页面反序列化上一步中被污染的session文件 实现对象的创建
    我们构造三个页面来完成这个漏洞的演示
    我们使用小皮面板进行本地测试
    首先打开小皮的www目录在其中创建文件夹session_test

我们需要一个文件 这个文件定义了一个类 并且通过__destruct魔术方法 使得当我们成功通过后续的payload创建对象的时候有这么一个类能够让我们创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

if (isset($_GET['source'])) {

    highlight_file(__FILE__);

    exit;

}
class TestClass {

    public function __wakeup() {

        echo "【TestClass】被反序列化了!<br>";

    }

    public function __destruct() {

        echo "【TestClass】对象被销毁了。<br>";

    }

}

接下来我们需要两个页面
一个页面负责接收我们的payload 模拟的是CTF中存在注入点的页面 我们可以通过这个页面上传我们的恶意代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php


highlight_file(__FILE__);

echo "<hr>";

//定义编码格式 防止中文乱码

header('Content-Type: text/html; charset=utf-8');

require 'class.php';



// 设置处理器为 php_serialize

ini_set('session.serialize_handler', 'php_serialize');

session_start();

//输出保存路径方便我们查看

echo "Session 保存路径:" . session_save_path() . "<br>";

echo "Session ID:" . session_id() . "<br>";



$_SESSION['data'] = isset($_GET['payload']) ? $_GET['payload'] : 'default';

echo "写入完成。使用的处理器:php_serialize<br>";

echo "写入的值:" . htmlspecialchars($_SESSION['data']);

另一个页面负责反序列化我们的session内容 注意 这里要使用和前一个页面不同的session反序列化处理器 模拟这个漏洞的产生情况(处理器差异导致的注入攻击)

![[屏幕截图 2026-03-10 001213.png]]

为了方便起见 我们直接在本地的VS上面输出一下TestClass序列化之后的内容 复制序列化之后的内容 并在前面加上php处理器的标志符号 |

构建payload如下
payload=|O:9:"TestClass":0:{}
![[屏幕截图 2026-03-10 001702.png]]

此时我们去到保存路径处查看一下我们的上传内容![[屏幕截图 2026-03-10 001812.png]]

可以看到 我们上传了这么一个内容 在php_serialize处理器下 这是合法的 但是在php处理器下 由于会将竖线符号前后内容分别视作键名和键值 同时由于键名是可以任意的 真正反序列化的内容实际上是
O:9:"TestClass":0:{}";}
我们看到 这个反序列化内容实际上是由两部分组成

  1. `O:9:”TestClass”:0:{}”
  2. ;} 反序列化器从 O:9:”TestClass”:0:{} 开始解析,成功读取一个完整的 TestClass 对象(因为对象序列化以 } 结束),然后指针停留在 }` 之后。

剩余字符 ";} 不会被包含在对象反序列化过程中,因此对象被成功创建
我们查看一下另一个页面![[屏幕截图 2026-03-10 003550.png]]

没毛了
这只是简单的创建对象的操作 在实际应用中 我们可以插入RCE内容 进而实现攻击 类似操作类比之前反序列化中的内容即可
至此 漏洞演示完毕

相关文章
评论
分享
  • 社会工程学——cupp获取windows密码

    这其实本质是一个社会工程学问题至于为什么 在文章的最后想必大家也能理解假设现在有一个人短时间离开电脑之后并未锁屏 那么旁人就可以通过U盘拷贝重要密码文件的方式获取他的密码 密码文件获取windows并不会直接存储你的明文密码 它存的是...

    社会工程学——cupp获取windows密码
  • URLDNS链入门

    在一些测试环境之中 目标是否发生反序列化是无回显的 是否有一种办法能够测试目标是否能够发生反序列化呢?有的兄弟有的如果我们能让目标服务器通过反序列化发起一次DNS解析请求 那么在接收到请求的时候不就知道了吗那么这就是我们需要学习的UR...

    URLDNS链入门
  • 无痛入门java反序列化

    在学习URLDNS链以及之后的cc链之前 我们得先掌握java反序列化的基础知识 序列化和反序列化序列化把一个java对象转换成字节序列以便存储或者通过网络传输反序列化把字节序列还原成java对象 12序列化:对象->字符串反...

    无痛入门java反序列化
  • 用租房视角学习动态代理

    关于这一部分的知识点 我们先从静态代理说起 静态代理什么是代理? 代理就是:不操作目标对象而是通过一个中间人(代理)来间接操作最常见的现实例子就是租房问题:你要租房子 不需要直接找到房东 而是通过租房中介 中介帮你去和房东沟通 那么...

    用租房视角学习动态代理
  • 动态加载字节码

    动态加载字节码是一种让JVM可以接收由程序在运行时动态产生的字节数组并将其装在的能力 本义是让程序变得更加灵活 但是也产生了一定的安全问题 核心方法在java.lang.ClassLoader类中有一个方法 1protected fi...

    动态加载字节码
  • 类加载机制漫谈

    解释java字节码为什么需要编译成class文件我们首先要理解JVMjava是是一种混合型语言有编译的步骤也有解释步骤我们编写的java文件需要被编译成class文件之后才能被JVM运行 什么是class文件传统编译型语言(C C++...

    类加载机制漫谈
  • 反射随笔

    反射概念在java之中 万物都是对象 包括“类本身也是一个对象”(属于java.lang.Class类的对象) 反射的本质就是在程序运行期间 通过操控这个Class对象 反向解析和操控它所代表的哪个类里面的内容(构造器,属性,方法) ...

    反射随笔
  • LangChain反序列化

    最近在打SCTF的时候遇到一个LangChain反序列化的题目 比较新颖 于是想着学习一下 LangChain介绍LangChain是一个用于构建大语言模型应用的开源框架 通过这个可以把常用的组件抽象成可串联的链(Chain)举个例...

    LangChain反序列化
  • filter-chain漏洞演示

    这个漏洞链被称为CNEXT 由安全员Charles Fol披露 核心思想是利用系统内置的看似无害的模块(流过滤器)的巧妙组合 在受限的web环境之中执行命令 原理讲解filter协议对于filter伪协议 我们肯定都不陌生这个伪协议允...

    filter-chain漏洞演示
  • 死亡绕过

    前言以及环境介绍本文是对p神文章谈一谈php://filter的妙用 | 离别歌知识点的学习 本文主要介绍使用filter伪协议进行死亡绕过的三种方式 测试环境:小皮面板测试代码:exit.php 12345<...

    死亡绕过
Please check the parameter of comment in config.yml of hexo-theme-Annie!