ThinkPHP6任意⽂件操作漏洞分析
漏洞介绍
2020年1⽉10⽇,ThinkPHP团队发布⼀个补丁更新,修复了⼀处由不安全的SessionId导致的任意⽂件操作漏洞。该漏洞允许攻击者在⽬标环境启⽤session的条件下创建任意⽂件以及删除任意⽂件,在特定情况下还可以getshell。
具体受影响版本为ThinkPHP6.0.0-6.0.1。
漏洞复现
本地环境采⽤ThinkPHP 6.0.1+PHP7.1.20+Apache进⾏复现。在特定情况下执⾏测试验证程序即可写⼊⼀个webshell,如下图:
漏洞分析
根据官⽅github的commit:
因⽽推测,可能是在存储session时导致的⽂件写⼊。然后,跟踪:vendor/topthink/framework/src/think/session/Store.php:254。
这⾥调⽤了⼀个write函数,跟进⼀下:vendor/topthink/framework/src/think/session/driver/File.php:210。
调⽤writeFile函数,跟⼊:
果然是写⼊⽂件的操作。
继续反向看⼀下⽂件名是否可控,该⽂件名来⾃于最开始的getId()得到的$sessionId的值。既然有getId,就会有setId,看⼀下函数内容:
当传⼊的参数$id满⾜32位的长度时,就将该值设为$this->id。看⼀下调⽤setId的地
⽅:vendor/topthink/framework/src/think/middleware/SessionInit.php:46。
shell创建文件并写入内容这⾥的$cookieName的值是PHPSESSID。
⽽$sessionId是cookie中名为PHPSESSID的值,因此是攻击者可控的,从⽽导致写⼊的⽂件名可控。
写⼊的⽂件名可控,那么写⼊的内容是否可控呢?分析发现,写⼊的内容就是创建session使⽤的内容。但是session的创建是由实际的后端业务逻辑来决定的,⽽默认环境下并没有创建session。因此,默认环境下⽆法做到任意⽂件写⼊。
在对该漏洞的深⼊分析过程中,我们发现该漏洞还可以实现任意⽂件删除,且⽂件删除对后端业务逻辑依赖较低。
还是在vendor/topthink/framework/src/think/session/Store.php:254中:
通过分析验证,我们发现漏洞(如上图)还能导致任意⽂件删除。
总结
在⽬标环境为Windows且开启session的情况下,容易遭受任意⽂件删除攻击。
在⽬标环境开启session且写⼊的session可控的情况下,容易遭受任意⽂件写⼊攻击。建议相关⽤户及时升级到ThinkPHP6.0.2版本,以免遭受攻击。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。