CTF中的session文件包含

486 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

session文件包含

www.freebuf.com/vuls/202819…

PHP中的session.upload_progress功能作为跳板,从而进行文件包含

在php.ini有以下几个默认选项

enabled=on表示upload_progress功能开始,也意味着当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中 ;

cleanup=on表示当文件上传结束后,php将会立即清空对应session文件中的内容,这个选项非常重要;

name当它出现在表单中,php将会报告上传进度,最大的好处是,它的值可控2;

prefix+name将表示为session中的键名

 <?php
$b=$_GET['file'];
include "$b";
?>

可以发现,存在一个文件包含漏洞,但是找不到一个可以包含的恶意文件。其实,我们可以利用session.upload_progress将恶意语句写入session文件,从而包含session文件。前提需要知道session文件的存放位置。

问题一

代码里没有session_start(),如何创建session文件呢

session.use_strict_mode默认为0,用户可以自己定义session id

比如,我们在Cookie里设置PHPSESSID=TGAO,PHP将会在服务器上创建一个文件:/tmp/sess_TGAO”。即使此时用户没有初始化Session,PHP也会自动初始化Session。 并产生一个键值,这个键值有ini.get("session.upload_progress.prefix")+由我们构造的session.upload_progress.name值组成,最后被写入sess_文件里。    

问题二

但是问题来了,默认配置session.upload_progress.cleanup = on导致文件上传后,session文件内容立即清空,

如何进行rce呢?

解答二

此时我们可以利用竞争,在session文件内容清空前进行包含利用。

利用条件

  1. 存在文件包含漏洞
  1. 知道session文件存放路径,可以尝试默认路径
  1. 具有读取和写入session文件的权限

过程

以POST的形式发包,传的文件随意

<!DOCTYPE html>
<html>
<body>
<form action="http://e113b1bc-28b8-4f08-9e60-b74fe3a96ef3.chall.ctf.show/" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
    <input type="file" name="file" />
    <input type="submit" value="submit" />
</form>
</body>
</html>

抓包,这里我们添加一个 Cookie :PHPSESSID=flag ,PHP将会在服务器上创建一个文件:/tmp/sess_flag” (这里我们猜测session文件默认存储位置为/tmp),并在PHP_SESSION_UPLOAD_PROGRESS下添加一句话木马,修改如下

因为我们在上面这个页面添加的ID值是flag,所以传参?file=/tmp/sess_flag

修改如下:这个a是随便加的,主要是为了方便爆破