Thinkphp6 session写文件漏洞-漏洞文库小世界-安全文库-NGC660安全实验室

Thinkphp6 session写文件漏洞

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
1595829961079-c3df0c27-a66c-4db8-93b6-cd5b75fd24f2

composer require topthink/framework:6.0.0
1595830008876-5f197319-17c2-4701-beb6-127b554f6428

php版本设置为 7.3
1595829645116-b30f05a6-6654-46a0-93b7-449b8b177724

访问 http://10.211.55.29/tp6/public/index.php完成初步安装。
1595830137753-3f271bb8-cfbb-493c-b458-cfd35bc9939b

0x03漏洞复现

修改tp60/app/controller/Index.php 文件如下:
1595830294426-59daa9f1-7ac7-486e-b5be-6662a8619238

修改tp60/app/middleware.php文件开启session功能
1595830321277-683f5527-7789-497b-9993-1e2a24dcb098

Poc:
1595830561106-2a601ce8-25da-4c88-93ef-cab5c57934ff

访问tp6\runtime\session\sess_292568ad1ccdeaf2cd525ac23724.php
1595830539488-1b8dbedb-39b9-41b8-94eb-6c536f4d2358

0x04漏洞分析

首先寻找session点
tp6/vendor/topthink/framework/src/think/session/Store.php
121行
1595830779922-f02bb793-6e2d-42ca-8b18-98dba6b68c9a

sessionid的设置的时候 为进行效验,只要是32位的就可以
同一个文件看一下session保存方法
tp6/vendor/topthink/framework/src/think/session/Store.php 254行
1595830909250-f11006e7-e99e-4c67-8a11-f0131a03ba16

先获取session id 然后是 $this->handler->write($sessionId, $data);;
tp6/vendor/topthink/framework/src/think/middleware/SessionInit.php
这里获取到 PHPSESSID 的值 session id传入
1595831179437-e5edba95-ad86-4a3f-83a9-baca91f18bde

$request->cookie($cookieName);这个里面看一下

1595831220840-5b2cd01a-3124-469b-be2d-4137694690e0

发现是这个参数.

从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
1595831359876-6b9d7c5f-3100-4b3a-a83f-b4a4e1e92166

这里有文件名的处理
1595831445594-6bcbb9a7-61e7-4dc4-9d68-61cc3ce426a8

文件名只进行了路径拼接和加前缀
数据压缩没啥用 跟进 $this->writeFile($filename, $data);
1595831498436-b43b989b-2328-41f8-934e-c8b513b6eade

直接写入了。

请登录后发表评论

    请登录后查看回复内容