本文作者:shiyi(Timeline Sec团队成员)
本文共1082字,阅读大约需要3~4分钟
声明:请勿做非法用途,否则后果自负
0x01 简介
ThinkPHP框架是MVC结构的开源PHP框架,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。该漏洞源于ThinkPHP 6.0的某个逻辑漏洞,成功利用此漏洞的攻击者可以实现“任意”文件创建,在特殊场景下可能会导致GetShell。
0x02 漏洞概述
2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的SessionId导致的任意文件操作漏洞。该漏洞允许攻击者在目标环境启用session的条件下创建任意文件以及删除任意文件,在特定情况下还可以getshell。
0x03 影响版本
ThinkPHP 6.0.0-6.0.1
0x04 环境搭建
1、安装Composer
下载Composer-Setup.exe
代码语言:javascript复制https://getcomposer.org/download/
执行安装文件,选择php.exe位置,即可安装成功
composer拉取环境有时候可能会卡住,可以换国内镜像
代码语言:javascript复制composer config -g repo.packagist composer https://packagist.phpcomposer.com
2、安装thinkphp
代码语言:javascript复制composer create-project topthink/think tp6 (tp6自定义)
出现报错可参考:
代码语言:javascript复制http://www.jrnw.net/index.php/2019/05/30/thinkphp6框架源码的下载与安装详细教程/
3、版本选择
将 tp6/composer.json 文件的 "topthink/framework": "^6.0.0" 改成 6.0.0 版本,并执行更新命令
代码语言:javascript复制进入tp6目录
cd tp6
composer update
PS:
- 如果是linux 就再执行启动环境 :./think run --host=0.0.0.0 --port=8000
- 如果不能拉取到环境,公众号内回复“tp60环境”获取
0x05 漏洞利用
首先在得到可控session参数名,这是本地构造的,实战需要自己fuzz。
构造位置:tp60appcontrollerIndex.php
需要增加构造的内容:
代码语言:javascript复制use thinkfacadeSession;
Session::set('user',$_GET['username']);
代码语言:javascript复制
开启session且写入的session可控
/tp6/app/middleware.php 文件开启session
去掉注释session的//
构造请求:
username就是我们刚才构造的接受参数,然后将PHPSESSID的值修改为32位的保存路径
我们通过poc打了之后,就可以访问一下public下的文件
0x06 坑点
1、本地测试localhost失败
问题:
当我们用localhost去测试poc的时候,请求中自带cookie,即使修改也没用
解决:
通过IP去测试,127.0.0.1 或者内网IP
2、shell选择
问题:
在最新版的phpstudy测试菜刀马失败
解决:
冰蝎的shell可以用。
0x07 修复方式
官方给出方案
对session id 加一个过滤,使用ctype_alnum()
代码语言:javascript复制$this->id = is_string($id) && strlen($id) === 32 ctype_alnum($id) && ? $id : md5(microtime(true) . session_create_id());
参考链接:
https://woj.app/6032.html
https://forum.90sec.com/t/topic/706