题目入口:http://web.jarvisoj.com:32784/
一进来就看到源码
简单分析之后知道考点是反序列化,注意到了关键字session_start(),这个函数是用于创建会话。但具体如何利用还是没有头绪。搜索了一下发现是考察关于session序列化选择器的漏洞。
具体原理可参考:https://www.cnblogs.com/sijidou/p/10455646.html
传入phpinfo参数查看phpinfo,找到了重要的参数
百度了一下该参数
也就是说,可以利用session.upload_progress.enabled构造相应表单来上传文件。因为session.upload_progress.enabled=on,所以我们就可以post一个和session.upload_progress.name同名的变量,来使得我们上传的文件名写入session。。
借鉴了其他大佬构造的表单,注意PHP_SESSION_UPLOAD_PROGRESS值不能为0。
随便上传个文件,bp抓包
修改filename,插入payload
payload:
为何payload是这样的呢?这就是第二个关键点
session.serialize_handler决定了php存储session时用的序列化规则格式,而index.php设置php的handler和默认的php_serialize不同,所以出现问题。php_serialize存储的字符可以引入 "|" ,但以php格式取出时"|"会被当成键值对的分隔符。"\"将双引号转移,物理路径在phpinfo可以找到
再次构造payload:|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:88:\"print_r(file_get_contents(\"/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php\"));\";}
返回flag。
虽然大致原理明白了,但还是有点懵。。。。。。。。。