0%

ThinkPHP6.0 任意文件操作

文章首发于先知社区:https://xz.aliyun.com/t/7131

参考

https://woj.app/6032.html

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

官方补丁

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

image.png

从只检测长度为32到增加ctype_alnum

image.png

环境搭建

tp6启用.env,感觉跟laravel越来越靠近

根目录cp .example.env .env

启动session

修改app/middleware.php

把session初始化下面代码注释去掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
return [

*// 全局请求缓存*

* // \think\middleware\CheckRequestCache::class,*

* // 多语言加载*

* // \think\middleware\LoadLangPack::class,*

* // Session初始化*

* *\think\middleware\SessionInit::**class**

];

修改控制器

在app/controller/Index.php里增加

1
2
3
public function **test(){
session('demo'**, $_GET['c']);
}

测试

image.png

image.png

注意session长度,要为32

image.png

如果不是32,会重新设置session

分析

setId会有两次被调用,第一次是读session

第二次是在最后$http->end 执行到SessionInit->end() -> Session->save()

think\Session\Store->save()

image.png

跟进

image.png

拼接sess_

再拼接目录

image.png

得到文件名和目录,创建目录

继续跟进

writeFile

image.png

总结

第一次写分析漏洞,措辞和分析如果有误,欢迎指教