最近有点忙,有空学习一下 感觉似懂非懂,今晚来刷个题,验证一下我的一些想法
入口:http://web.jarvisoj.com:32784/index.php?
是一个反序列化的题,源码中
只是判断是否set了phpinfo 如果有就输出phpinfo,所以说这是关于session的题
session反序列化漏洞的原理网上有,总结一下就是两次处理会话的session引擎不同,一个是php 一个是php serialize,而session_start()函数的定义如下:
就是如果存在现有会话,就重用,而重用的方式是从默认的session存储文件里将数据反序列化得出,如果存储使用php serialize 而反序列化取回数据用的是php 那这就导致了问题
接着题目讲,题目中没有给出写入session 的方法,这就很尴尬了。。看了前辈的wp ,原来有个叫session 上传进度的东西
当PHP检测到同名post请求 就会再$_SESSION中添加一条数据 看来就是用这个来写session的
那就搞一个文件上传的同时再post一个请求:
将filename 改成 poc
poc 得到
,得到当前目录信息
这里为什么改filename的值,不改其他的值,开始我也不太懂 后来查了PHP手册,
例子中上传的是两个文件,如果一个文件的化,就能看出了,filename的键值对被写进入了 所以这里修改的是filename的值
再说下这个poc ,查看phpinfo得知
前面是local 后面是master
一开始上传session那个地方是使用php_serialize的,后来执行php的脚本,就变成了php的引擎 ,再重用上传的会话,用php引擎反序列化后,就会导致了问题 ,这是我的理解
讲下poc ,就是php_serialize引擎在处理session时会识别 | 这个字符,但是php引擎则会把 |
当成键值对的分隔符,所以用phpserialize处理过的session来给php反序列,就会得到问题,具体在这里体现就是实例化了一个类,完了又自动调用__destruct,,具体原理可以百度,很多前辈都写了
|O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";} (为了防止"被转义 加了)
这个 | 后面,用php引擎解释实际上就是
new OowoO()
,print_r(scandir(dirname(__FILE__)))就是mdzz 玛德智障吗 哈哈 为什么不用system ,因为disable了
后面还有,没截到
查到了当前目录的flag文件,接下来就是换命令了,当前目录在哪
当前目录
整个流程补完
在如何写入session 和调用session 那地方感觉还是一知半解,总结就是抠脚