Insomni’hack teaser 2018-VulnShop-writeup
session文件
题目
|
|
Solution
源码主要部分如下:
第一部分的php代码,对于接收进来的参数,都会进行strip_tags,将其中的html、php标签去除,同时开始了一个session_start
。
第二部分中有几个功能:
- 当
page=contactus
时,会随机产生一个变量$_SESSION['challenge']
。 - 当
page=captcha
时,若之前已经访问过contactus,也即对应的变量$_SESSION['challenge']
存在,则echo出来,并且创建一个以变量$_SESSION['challenge']
值为名字的文件,后面我简称用户的challenge文件。 - 当
page=captcha-verify
时,通过传入对应的参数,会执行如下代码:1$_REQUEST['method']("./".$_SESSION['challenge'], $_REQUEST['answer'])
同时在这个case中,还定义了两个函数,其中verifyFromMath()中出现了熟悉的eval。
通过基本的尝试,可以发现:
- 由于strip_tags的存在,无法直接传入包含
<?php
等的php代码 - tmp目录不可读,通过touch生成的文件也无法访问。
- 网站根目录(即tmp目录的上一级目录)不可写
考虑题目还给了phpinfo,经过查看,我们可以发现session文件的保存位置。
我们知道在php中,通过查看cookie可以知道对应的PHPSESSID,比如PHPSESSID=123456
,则在对应的session文件名即为sess_123465
。以下是我本地测试用例:
所以考虑一个场景:
- 我们生成两个用户,也即两个session,对应着两个PHPSESSID。
- 利用用户1和captcha-verify功能,将php语句写入到用户2的session文件中,要注意格式,修改用户2对应的
$_SESSION['challenge']
- 利用用户2和verifyFromMath,执行
eval("return ".$_SESSION['challenge']." ;")
,从而执行我们的php代码。
第一步,两个用户。因此我们要分两次的分别访问contactus和captcha,记录下他们对应的PHPSESSID。
第二步中,先来看看session文件的格式。由于我们要写入的是php语句,因此格式如下:
其中s
表示字符串,后面的数字7为长度,引号中的内容是对应的php语句,其余的部分不变,上述示例对应的$_SESSION['challenge']
即为chybeta
接着考虑如何把这串内容写入到用户2的session文件中。源码中有这段代码:
因此我们先往用户1的challenge文件中写入对应php语句,即:
这样在tmp目录下就生成了用户1对应的challenge文件,其内容为伪造的用户2的session文件内容。
接着覆盖:
pathto_user2_session是指用户2的session文件的路径,从phpinfo,我们知道session路径为`/var/lib/php/sessions/sess[对应的PHPSESSID]`
注意在整个第二步的操作过程中,我们没有关注用户1的session,它生成的challenge文件仅作为一个中转站。
第三步,执行php代码,注意这个时候用户2的session文件内容已经被改变了。这个时候需要进入verifyFromMath功能:
利用exp:
php code:
php code:
flag: