6

ThinkPHP 6 任意文件写入

 2 years ago
source link: https://zh1x1an.github.io/2020/01/15/ThinkPHP-6-%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E5%86%99%E5%85%A5/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

ThinkPHP 6 任意文件写入

创建时间:2020-01-15 17:31
字数:701 阅读:8 评论:0

在 ThinkPHP 6.0.0 以及 6.0.1 两个版本中,如果服务端在全局中间件定义文件中开启了 Session 初始化,并且攻击者可控任意一个 session 的值,就可利用写入 session 文件的功能做到写入任意文件 getshell 。

使用 composer 命令安装 ThinkPHP:

composer create-project topthink/think tp

在全局中间件定义文件 tp/app/middleware.php:10 行的位置,添加开启 Session 初始化的配置:

同时删除补丁中对于 $id 的过滤:

为了便于测试,我们在 tp/app/controller/Index.php/ 文件中,添加如下代码,模拟 session 值可控:

调整环境如上,发送如下请求包:

GET /tp/public/index.php/index/index/index?c=%3C?php%20phpinfo()%3B%2F%2F HTTP/1.1
Cookie: XDEBUG_SESSION=PHPSTORM; PHPSESSID=/../../../../123456789012345.php;
Host: 127.0.0.1:9090
Connection: close
User-Agent: Paw/3.1.10 (Macintosh; OS X/10.15.2) GCDHTTPRequest

如果 cms 使用了存在上述漏洞的 tp6 框架,并且在开发逻辑中存在可控的 session 值,才能做到如上效果,我们看一下发送的请求:

/tp/public/index.php/index/index/index?c=%3C?php%20phpinfo()%3B%2F%2F

上述请求的路由很清晰,访问 index 模块儿 、index 控制器、 index 方法,击中断点后,赋值 session :

当整个 HTTP 请求结束后,会进入 end 方法,其中会执行中间件的一些行为:

这里的 end 方法会进入中间件的 Session 初始化功能,也就是 SessionInit.php 。我们已经在前文中提前开启了该配置,所以可以跟进:

Session 初始化结束后,会保存相应的 session 文件,文件名来源于用户传入的 Cookie 中 PHPSESSID 的值,文件内容来源于 session 的值,但是会被序列化一次:

需要注意的是,我们传入的 PHPSESSID 值长度必须为 32 个字符,否则无法进入写 session 的逻辑:

成功写入 session 文件,为了防止由于序列化导致的字符错误,我们需要在 session 的值加入尾注释来避免字符错误(类似于 sql 注入中的尾注释)

最终写入的文件存储于 /Users/Sites/123456789012345.php ,也就是我的测试环境的 Web 根目录:

Windows 下任意文件删除

如果传入的 session 值为空,会进入一个删除文件的逻辑,文件路径也是可控的:

但是 linux 在用 is_file() file_exist() 这类函数处理带有 ../ 或 ./ 的文件路径时候,不会提前合并,所以不承认这是合法路径。

任意文件删除只在 windows 上生效。

由于 tp6 使用量较少,漏洞利用条件较繁琐,所以此漏洞较难利用。

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

https://www.anquanke.com/post/id/197261


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论

0


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK