Thinkphp6.0 任意文件写入漏洞

寒假天天在家干活的我,好多天没学习了,趁着有空水一篇看起来不是很复杂的洞。

漏洞介绍

2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的 SessionId 导致的任意文件操作漏洞。该漏洞允许攻击者在目标环境启用 session 的条件下创建任意文件以及删除任意文件。
具体受影响版本为 ThinkPHP6.0.0-6.0.1 。

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

漏洞分析

回溯写入 Session 时的 $filename 
vendor/topthink/framework/src/think/session/driver/File.php 
image.png
$sessID 对应文件名拼接变量 $name ,看一下 $sessID 参数怎么来的
image.png

vendor/topthink/framework/src/think/session/Store.php  
image.png
因此可以知道 $name 为 $this->id 值,与 setID($id=null) 对应,而当 $id 参数的长度等于32位时,直接返回 $id ,不进行md5操作。
image.png
根据源码可知 $id 从cookie中的 PHPSESSID 变量中获取。
vendor/topthink/framework/src/think/middleware/SessionInit.php 
image.png
因此我们构造 PHPSESSID=aaaaaaaaaaaaaaaaaaaaaaaaaaab.php 即可成功写入文件,不过想要控制文件内容的话还需要控制储存的 session 变量键名或者键值,在实际情况下应该是比较容易的。
image.png
而原文中提到的可以删除任意文件,首先需要 $this->data 为空,也就是session设置的变量键值等于空,或者其他为空的操作,貌似在实际场景中并不常见
image.png
另外文件名并不完全可控,有一个 sess_ 前缀,只有在windows下才可以用一个不存在的目录绕过限制删除任意文件。
image.png

Referer

ThinkPHP6 任意文件操作漏洞分析