ThinkPHP6.0 任意文件操作
参考 https://woj.app/6032.html https://paper.seebug.org/1114/ 官方补丁 https://github.com/top-think/framework/commit/1bbe75019ce6c8e0101a6ef73706217e406439f2 从只检测长度为32到增加ctype_alnum 环境搭建 tp6启用.env,感觉跟lara
参考
https://paper.seebug.org/1114/
官方补丁
https://github.com/top-think/framework/commit/1bbe75019ce6c8e0101a6ef73706217e406439f2

从只检测长度为32到增加ctype_alnum

环境搭建
tp6启用.env,感觉跟laravel越来越靠近
根目录cp .example.env .env
启动session
修改app/middleware.php
把session初始化下面代码注释去掉
return [
*// 全局请求缓存*
* // \think\middleware\CheckRequestCache::class,*
* // 多语言加载*
* // \think\middleware\LoadLangPack::class,*
* // Session初始化*
* *\think\middleware\SessionInit::**class**
];
修改控制器
在app/controller/Index.php里增加
public function **test(){
session('demo'**, $_GET['c']);
}
测试


注意session长度,要为32

如果不是32,会重新设置session
分析
setId会有两次被调用,第一次是读session
第二次是在最后$http->end 执行到SessionInit->end() -> Session->save()
think\Session\Store->save()

跟进

拼接sess_
再拼接目录

得到文件名和目录,创建目录
继续跟进
writeFile

总结
第一次写分析漏洞,措辞和分析如果有误,欢迎指教