ThinkPHP3.x、5.x框架任意文件包含

ThinkPHP简介

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。

漏洞简述

ThinkPHP在加载模版解析变量时存在变量覆盖的问题,且没有对 $cacheFile 进行相应的消毒处理,导致模板文件的路径可以被覆盖,从而导致任意文件包含漏洞的发生。

环境准备

下载thinkphp框架,在 "thinkphp\library\think\Controller.php" 文件中写入如下代码

在 "application\index\view\index" 目录下建立一个 index.html 文件,不建立会出现 模板文件不存在 错误。

漏洞分析

攻击者可以通过POST方式访问链接:http://192.168.1.8/thinkphp/public/index.php/index/index/index,POST的数据为:cacheFile=../phpinfo.php ,这个 cacheFile 变量就是可以被攻击者覆盖的变量。

程序在一开始会调用 "thinkphp\library\think\Controller.php" 文件中的 assign 方法,并传入 POST 数组数据, assign 方法代码如下:

assign 方法又调用了视图类中的 assign 方法, assign 方法在 "thinkphp\library\think\View.php" 文件中。可以看到该方法用 array_merge 方法将 POST 数组数据合并到 $this->data 中,代码如下:

我们再来看 fetch 方法,该方法用于输出模板内容,代码定义在 "thinkphp\library\think\Controller.php" 文件中,该方法同样调用的是视图类中的 fetch 方法,代码如下:

查看 "thinkphp\library\think\View.php" 文件中的 fetch 方法,这里注代码$this->engine->$method($template, $vars, $config);

在默认情况下 $method 的值为 fetch ,也就是说调用了视图引擎中的 fetch 方法,该方法在"thinkphp\library\think\view\driver\Think.php" 文件中,代码如下:

视图引擎的 fetch 方法又调用了模板类的fetch 方法,继续跟进 。我们注意到 "thinkphp\library\think\Template.php" 文件中语句:$this->storage->read($cacheFile, $this->data);这是用于读取编译存储,此时 $cacheFile 的值类似于 runtime\temp\md5(×××).php

我们跟进该 read 方法,在"thinkphp\library\think\template\driver\File.php" 文件中,我们看到程序使用 extract 方法,并用了 EXTR_OVERWRITE 参数,该参数的作用是:如果有冲突,则覆盖已有的变量。 extract 方法将 $vars 数组中的数据元素注册成变量,而 $vars 数组又包含了 POST 数组数据,这也就是导致变量覆盖的原因。然后程序在最后包含了 $cacheFile 文件,最终导致了任意文件包含。具体代码如下:

如果目标站点开启了 allow_url_include ,攻击者甚至可以执行任意代码,攻击方法如下

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP是一款流行的PHP开发框架,5.x版本也是比较常用的版本。虽然ThinkPHP是一个优秀的框架,但仍然存在一些潜在的安全漏洞,因此及时修复这些漏洞是非常重要的。修复ThinkPHP 5.x漏洞可以从以下几个方面入手: 1. 更新最新版本:保持框架的版本更新是修复漏洞的首要措施。ThinkPHP团队会不断发布更新版本来修复漏洞和增加新功能,因此及时更新到最新版本是必要的。可以在官方网站上查看并下载最新版本的ThinkPHP。 2. 安全审计:进行代码审计是另一个重要的步骤。检查应用程序的代码和配置文件,特别是控制器和模型中的用户输入和数据库查询,以确保没有任何可能导致代码执行或SQL注入等安全问题的漏洞。 3. 安全加固:可以通过加强安全措施来修复漏洞。例如,禁用不必要的文件或函数、密钥管理和访问控制等措施可以帮助提高系统的安全性。 4. 过滤用户输入:用户输入是最常见的安全漏洞来源之一。应该对用户输入数据进行严格的过滤和验证,确保输入的数据符合预期的格式和范围,并防止XSS和SQL注入等攻击。 5. 强化认证与权限管理:加强用户认证措施,使用强密码和加密技术来保护用户的登录信息。在系统中实施严格的权限管理,限制用户的访问权限,以避免恶意用户越权操作。 总之,修复ThinkPHP 5.x漏洞需要全面考虑各个方面的安全问题,并严格遵循最佳实践。及时更新版本、进行安全审计、加强安全措施、过滤用户输入、强化认证与权限管理等措施都是非常有效的方法。同时也建议开发者关注ThinkPHP官方的漏洞公告和安全建议,及时了解并修复已经公开的漏洞。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值