Thinkphp6.0.0 任意文件操作


前言

新型肺炎弄得春节好糟糕啊,所有计划都泡汤了,只能来看看最近的漏洞了

环境搭建

受影响版本为tp6.0.0-tp6.0.1
composer create-project topthink/think=6.0.0 tp6
不过很奇怪,composer.json
"topthink/framework": "^6.0.0"
但是这里漏洞点已经被修复,所以修改为6.0.0重新update一下

漏洞位置

https://github.com/top-think/framework/commit/1bbe75019ce6c8e0101a6ef73706217e406439f2
1.png

看标题就可以知道是关于session的漏洞,但是由于thinkphp6,默认是没有开启session的,所以我们需要手动开启

1
2
3
4
5
6
7
8
9
10
11
12
// app/middleware.php
<?php
// 全局中间件定义文件
return [
// 全局请求缓存
// \think\middleware\CheckRequestCache::class,
// 多语言加载
// \think\middleware\LoadLangPack::class,
// Session初始化
// \think\middleware\SessionInit::class
\think\middleware\SessionInit::class
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// app/controller/Index.php
<?php
namespace app\controller;

use app\BaseController;

use think\facade\Session; //需要引入这个类才可以使用Session进行简单的操作

class Index extends BaseController
{
public function index()
{
Session::set('name','thinkphp');
..............

上述开启操作可在https://www.kancloud.cn/manual/thinkphp6_0/1037635 中进行详细的了解

我们通过浏览器进行访问,可以看到
2.png

漏洞分析

3.png

  • 以上栈调用时在session进入Store.php前的调用路径

  • Session这个类继承于Manager,驱动是在config中设置,默认是file驱动,在创建驱动后返回一个Store

    4.png

  • 进入Store进行类的初始化,调用getName函数,返回值PHPSESSION

    5.png

  • 再在59行重写进行setId,即我们只要保持PHPSESSION是32位的,id我们就可以自由控制

  • 最后一步步出来,返回响应后,进行结束index.php->$http->end($response);,这里会调用

    6.png

这里的中间件即Session,我们开始在配置中修改过的

7.png

  • Filename 即sess_+id
  • return (bool) file_put_contents($path, $content, LOCK_EX);写入,内容就是session的内容

现在我们自由修改ID,来进行尝试

9.png

8.png

如果想要写入shell,则需要可控的session项,比如你传入的username记录在session中,这个情况比较常见,我们修改一下Index.php

1
2
3
4
5
class Index extends BaseController
{
public function index()
{
Session::set('name',$_GET['username']);

最后成果
8.png

但是如果真的需要达到任意文件创建,在linux下不太可行,但是在windows下是可行的

  • 在windows在如果创建的文件目录,存在不存在的文件夹,但是路径中存在../跳过了这个文件夹,那么就不会报错

    11.png

    12.png

  • 但是上述方法在linux中是无效的

任意文件删除

13.png

但是存在一个问题,这个漏洞只是理论可行,这里的空,需要键值对全部消失才行,即清除session的时候,这个时候才能配合上面的文件操作进行任意文件删除,但是这里即便键值为null也不行
a:1:{s:4:"name";N;}会出现类似这样,所以可操作性较低

参考文章

https://paper.seebug.org/1114/