0x00 前言
2020年1月13号thinkphp团队在V6.0.2版本更新中提到修复了可能的session安全隐患,该漏洞允许攻击者在目标环境启用session的条件下创建任意文件,特定情况下还能getshell。 > 0x01 影响范围
Thinkphp 6.0.0
Thinkphp 6.0.1 > 0x02环境搭建
Thinkphp6.0.0 (composer无法下载thinkphp V6.0.0和V6.0.1。都会被强制改为6.0.3,只有修改版本位6.0.0即可) php 7.3
Windows Server 2008 IP:10.211.55.29
下载thinkphp V6.0.0 到www目录
composer create-project topthink/think tp6
composer require topthink/framework:6.0.0
php版本设置为 7.3
访问 http://10.211.55.29/tp6/public/index.php完成初步安装。
0x03漏洞复现
修改tp60/app/controller/Index.php 文件如下:
修改tp60/app/middleware.php文件开启session功能
Poc:
访问tp6\runtime\session\sess_292568ad1ccdeaf2cd525ac23724.php
0x04漏洞分析
首先寻找session点
tp6/vendor/topthink/framework/src/think/session/Store.php
121行
sessionid的设置的时候 为进行效验,只要是32位的就可以
同一个文件看一下session保存方法
tp6/vendor/topthink/framework/src/think/session/Store.php 254行
先获取session id 然后是 $this->handler->write($sessionId, $data);;
tp6/vendor/topthink/framework/src/think/middleware/SessionInit.php
这里获取到 PHPSESSID 的值 session id传入
$request->cookie($cookieName);这个里面看一下
发现是这个参数.
从PHPSESSID传值就可以被接收。
然后传入Store 中 setId()函数判断,值检查了32位 就是第一个说的地方
最后保存session数据 在代码tp6/vendor/topthink/framework/src/think/session/Store.php
跟进这个write方法
$this->handler->write($sessionId, $data);
这里的 handler 是 继承的think\session\driver\file.php
跟进这个write方法
tp6/vendor/topthink/framework/src/think/session/driver/File.php
这里有文件名的处理
文件名只进行了路径拼接和加前缀
数据压缩没啥用 跟进 $this->writeFile($filename, $data);
直接写入了。
请登录后查看回复内容