ThinkPHP6恣意文件操作误差剖析
宣布时间 2020-01-14
2020年1月10日,ThinkPHP团队宣布一个补丁更新,修复了一处由不清静的SessionId导致的恣意文件操作误差。该误差允许攻击者在目的情形启用session的条件下建设恣意文件以及删除恣意文件,在特定情形下还可以getshell。
详细受影响版本为ThinkPHP6.0.0-6.0.1。
误差复现
外地情形接纳ThinkPHP 6.0.1+PHP7.1.20+Apache举行复现。在特定情形下执行测试验证程序即可写入一个webshell,如下图:
误差剖析
凭证官方github的commit:https://github.com/top-think/framework/commit/1bbe75019ce6c8e0101a6ef73706217e406439f2。
因而推测,可能是在存储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。
这里的$cookieName的值是PHPSESSID。
而$sessionId是cookie中名为PHPSESSID的值,因此是攻击者可控的,从而导致写入的文件名可控。
写入的文件名可控,那么写入的内容是否可控呢?剖析发明,写入的内容就是建设session使用的内容。可是session的建设是由现实的后端营业逻辑来决议的,而默认情形下并没有建设session。因此,默认情形下无法做到恣意文件写入。
在对该误差的深入剖析历程中,我们发明该误差还可以实现恣意文件删除,且文件删除对后端营业逻辑依赖较低。
照旧在 vendor/topthink/framework/src/think/session/Store.php:254中:
通太过析验证,我们发明误差(如上图)还能导致恣意文件删除。
总 结
在目的情形为Windows且开启session的情形下,容易遭受恣意文件删除攻击。
在目的情形开启session且写入的session可控的情形下,容易遭受恣意文件写入攻击。
建议相关用户实时升级到ThinkPHP6.0.2版本,以免遭受攻击。
尊龙凯官网入口起劲防御实验室(ADLab)
ADLab建设于1999年,是中国清静行业最早建设的攻防手艺研究实验室之一,微软MAPP妄想焦点成员,“黑雀攻击”看法首推者。阻止现在,ADLab已通过CVE累计宣布清静误差1000余个,通过 CNVD/CNNVD累计宣布清静误差600余个,一连坚持国际网络清静领域一流水准。实验室研究偏向涵盖操作系统与应用系统清静研究、移动智能终端清静研究、物联网智能装备清静研究、Web清静研究、工控系统清静研究、云清静研究。研究效果应用于产品焦点手艺研究、国家重点科技项目攻关、专业清静服务等。


京公网安备11010802024551号