ThinkPHP6 任意文件操作漏洞分析

发布时间 - 2020-01-20 00:00:00    点击率:

漏洞介绍

2025年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的SessionId导致的任意文件操作漏洞。该漏洞允许攻击者在目标环境启用session的条件下创建任意文件以及删除任意文件,在特定情况下还可以getshell。

  1. 具体受影响版本为ThinkPHP6.0.0-6.0.1。

漏洞复现

本地环境采用ThinkPHP 6.0.1+PHP7.1.20+Apache进行复现。在特定情况下执行测试验证程序即可写入一个webshell,如下图:

漏洞分析

根据官方github的commit:

https://github.com/topthink/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版本,以免遭受攻击。

,大量的免费thinkphp入门教程,欢迎在线学习!


# php  # thinkphp  # Cookie  # Session  # this  # github  # windows  # apache  # 看一下  # 是在  # 后端  # 情况下  # 还可以  # 还能  # 是由  # 设为  # 发现该  # 在特定情况下 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python高阶函数应用_函数作为参数说明【指导】  JavaScript如何操作视频_媒体API怎么控制播放  如何在云主机快速搭建网站站点?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel如何处理CORS跨域请求?(配置示例)  如何用PHP工具快速搭建高效网站?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  jQuery中的100个技巧汇总  历史网站制作软件,华为如何找回被删除的网站?  手机软键盘弹出时影响布局的解决方法  如何打造高效商业网站?建站目的决定转化率  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  JS经典正则表达式笔试题汇总  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何获取上海专业网站定制建站电话?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  如何用wdcp快速搭建高效网站?  详解Android中Activity的四大启动模式实验简述  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  郑州企业网站制作公司,郑州招聘网站有哪些?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  微信小程序 闭包写法详细介绍  Bootstrap CSS布局之列表  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel如何使用Service Container和依赖注入?(代码示例)  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Internet Explorer官网直接进入 IE浏览器在线体验版网址  如何在万网开始建站?分步指南解析  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  详解jQuery中基本的动画方法  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  如何在万网自助建站平台快速创建网站?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Laravel如何为API生成Swagger或OpenAPI文档  java ZXing生成二维码及条码实例分享  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  Laravel怎么使用Intervention Image库处理图片上传和缩放  如何在Windows 2008云服务器安全搭建网站?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?