ThinkPHP6.0任意文件创建Getshell

0x01简介

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。

ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,ThinkPHP框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。

该漏洞源于ThinkPHP 6.0的某个逻辑漏洞,成功利用此漏洞的攻击者可以实现“任意”文件创建,在特殊场景下可能会导致GetShell。

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

0x02漏洞概述

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

0x03影响范围

ThinkPHP6.0.0-6.0.1

0x04环境搭建

1.phpstudy中PHP设置成7.2版本,并把对应的文件夹放入环境变量path中

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

2.在Phpstudy服务器中打开php.ini文件,找到extension=php_openssl.dll前面的分号去掉,意思是打开ssl扩展,目的是为了能在cmd命令中能进行访问

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

3.安装composer.phar,找到下载内容的地方,去下载当前最新版本的composer.phar

下载地址https://getcomposer.org/download/

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

  1. 双击安装,不用勾选,选择下一步
image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

5.配置环境变量后自动选择了

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

然后一直下一步,安装完成

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

输入composer查看是否安装成功

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

6.安装tp6 php composer.phar create-project topthink/think tp 6.0.*

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

我这个时间Thinkphp的最新版是6.0.3,用上面的命令下载下来framework是6.0.3版本的,我们需要再执行一条命令,进入下载的目录tp6,使用cmd命令

composer require topthink/framework:6.0.0

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

  1. 浏览器访问一下
image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

0x05漏洞复现

首先在得到可控session参数名,这是本地构造的,实战需要自己fuzz。

构造位置:tp6\app\controller\index.php

构造的内容

use think\facade\Session;

Session::set('user',$_GET['username']);

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

开启session且写入的session可控,/tp6/app/middleware.php 文件开启session,去掉注释session的//

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

使用Burp抓取首页的包构造payload:username就是我们刚才构造的接受参数,然后将PHPSESSID的值修改为32位的保存路径

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

点击发送,在浏览器访问

image

<figcaption data-action="image_caption" class="opt" contenteditable="true" style="display: inline-block; position: relative; min-width: 20%; max-width: 686px; margin: 8px 0px 0px; padding: 0px 0px 5px 14px; border-bottom: 1px solid rgb(230, 230, 230); font-size: 12px; line-height: 20px; color: rgb(128, 128, 128); word-break: break-all; text-align: left;">点击此处添加图片说明文字</figcaption>

0x06修复方式

官方给出的修复方式

对session id 加一个过滤 使用 ctype_alnum()

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

免责申明
本项目仅进行信息搜集,漏洞探测工作,无漏洞利用、攻击性行为,发文初衷为仅为方便安全人员对授权项目完成测试工作和学习交流使用。 请使用者遵守当地相关法律,勿用于非授权测试,勿用于非授权测试,勿用于非授权测试(重要的事情说三遍),如作他用所承受的法律责任一概与东塔安全学院无关!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容