zoukankan      html  css  js  c++  java
  • ThinkPHP3.x、5.x框架任意文件包含

    ThinkPHP简介

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

    漏洞简述

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

    环境准备

    下载thinkphp框架,在 "thinkphplibrary hinkController.php" 文件中写入如下代码

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

    漏洞分析

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

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

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

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

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

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

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

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

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

    总会有不期而遇的温暖. 和生生不息的希望。
  • 相关阅读:
    slf4j + log4j 记录日志
    Executors介绍
    Java集合(JDK1.6.0_45)
    Java多线程系列目录(共43篇)
    线程池体系
    FutureTask
    23种设计模式分类
    结构型 之 适配器模式
    信号量Semaphore详解以及应用
    Excel格式转化工具
  • 原文地址:https://www.cnblogs.com/devi1/p/13486641.html
Copyright © 2011-2022 走看看