2020年1月13号thinkphp团队在V6.0.2版本更新中提到修复了可能的session安全隐患,该漏洞允许攻击者在目标环境启用session的条件下创建任意文件以及删除任意文件,特定情况下还能getshell。

ThinkPHP6.0.0-6.0.1
Thinkphp6.0下载地址:
https://codeload.github.com/top-think/framework/zip/v6.0.0

根据官方提示,复现环境使用php 7.3.4:

注:将composer换成国内镜像,不然创建新项目会卡住,执行:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
在tp6源码根目录下创建新项目tp6:
composer create-project topthink/think tp6

进入tp6目录,把6.0.2替换成6.0.0的版本,执行:
composer require topthink/framework:6.0.0

在项目根目录下,执行
php think run:

访问 localshost:8000 ,确认环境搭建成功:

修改/app/controller/Index.php文件,新增:
session(‘demo’,$_GET[‘a’]);

修改 /app/middleware.php 文件如下,删除SessionInit的注释:

访问tp6项目,使用burpsuit抓包拦截,修改请求包:

注:PHPSESSID的值一定满足32位(包括.php),接着再通过变量a传递任意代码;
Send,返回200,即执行成功:

可以看到文件在runtime\session下生成,php脚本也成功写入:

php脚本内容如下:

访问:
localhost:8000/runtime/session/sess_1234567890123456789012345678.php

看到phpinfo的内容,则证明代码执行成功!!!!可上传一句话木马等进行getshell提权等操作。


将thinphp版本更新到官网最新版,即thinkphp6.0.2
或者:
对session id 加一个过滤 使用 ctype_alnum():
$this->id = is_string($id) && strlen($id) === 32ctype_alnum($id) && ? $id :md5(microtime(true) . session_create_id());
安全是一门朴素的学问,分享即进步!


文章转载自Littlebin404安全日常,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




