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,即执行成功:
可以看到文件在runtimesession下生成,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());
扫码关注
内网攻防、脚本工具开发等安全领域,致力于分享精品原
创文章、漏洞复现、工具靶场、CTF等技术干货。
原文始发于微信公众号(SK安全实验室):【漏洞复现】thinkphp6.0之文件上传getshell
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论