php代码审计之ThinkPHP5的文件包含漏洞详解

 更新时间:2023年06月19日 09:20:03   作者:姜小孩.  
这篇文章主要介绍了php代码审计之ThinkPHP5的文件包含漏洞,较为详细的分析了thinkphp5文件包含漏洞的形成原因与危害,需要的朋友可以参考下

漏洞影响范围

加载模版解析变量时存在变量覆盖问题,导致文件包含漏洞的产生 漏洞影响版本:5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10

我复现用的是5.1.15

(PS:这里附上thinkphp5.1 手册本站下载地址:https://www.jb51.net/books/729512.html

环境配置要将将 application/index/controller/Index.php 文件代码设置如下:

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
​
    public function index()
    {
​
        $this->assign(request()->get());
        return $this->fetch(); // 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
    }
}

创建 application/index/view/index/index.html 文件,内容随意(没有这个模板文件的话,在渲染时程序会报错)

漏洞分析

先跟进assign方法

再跟进

array_merge() 函数用于把一个或多个数组合并为一个数组。

只是赋值操作,跟进下面的fetch

继续跟进

用于$this引用当前对象。用于self引用当前类。换句话说, $this->member用于非静态成员,self::$member用于静态成员。

范围解析运算符(也称为 Paamayim Nekudotayim)或更简单的术语是双冒号,是一个允许访问类的 静态常量和重写属性或方法的标记。

fetch 前面的方法 主要是加载模板输出。这里的method值可以追溯到view\driver\Think.php 视图引擎

跟入84行fetch进入think\templae.php

第200行在读取的时候采用了一个read的方法。继续跟进read,进入template\driver\File.php

危险危险危险!!这里调用了一个extract函数,可控变量 $vars 赋值给 $this->data 并最终传入 File 类的 read 方法。而 read 方法中在使用了 extract 函数后,直接包含了 $cacheFile 变量。这里就是漏洞发生的关键原因(可以通过 extract 函数,直接覆盖 $cacheFile 变量,因为 extract 函数中的参数 $vars 可以由用户控制)。

这里extract 该函数使用数组键名作为变量名, EXTR_OVERWRITE 变量存在则覆盖

EXTRACT() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。

POC

http://localhost:8000/index/index/index?cacheFile=shell.jpg

图片马 shell.jpg 放至 public 目录下(模拟上传图片操作)。

相关文章

  • php使用curl详细解析及问题汇总

    php使用curl详细解析及问题汇总

    CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。
    2016-08-08
  • php 删除cookie方法详解

    php 删除cookie方法详解

    本文简单介绍了关于php删除cookie的方法,就是设置cookie有效期或者为空,非常实用的小技巧,这里推荐给大家。
    2014-12-12
  • PHP中创建空文件的代码[file_put_contents vs touch]

    PHP中创建空文件的代码[file_put_contents vs touch]

    php中用file_put_contents比touch快,大约两倍左右。
    2012-01-01
  • 利用phpExcel实现Excel数据的导入导出(全步骤详细解析)

    利用phpExcel实现Excel数据的导入导出(全步骤详细解析)

    本人的这段例程是使用在Thinkphp的开发框架上,要是使用在其他框架也是同样的方法,很多人可能不能正确的实现Excel的导入导出,问题基本上都是phpExcel的核心类引用路径出错,如果有问题大家务必要对路劲是否引用正确进行测试
    2013-11-11
  • PHP和JavaScrip分别获取关联数组的键值示例代码

    PHP和JavaScrip分别获取关联数组的键值示例代码

    关联数组的键值获取,有很多方法,在本文为大家介绍下PHP和JavaScrip中时如何实现的,感兴趣的朋友可以参考下
    2013-09-09
  • php查找字符串出现次数的方法

    php查找字符串出现次数的方法

    这篇文章主要介绍了php查找字符串出现次数的方法,较为详细的介绍了substr_count函数的用法,并补充说明了相关的字符串操作函数,具有一定的实用价值,需要的朋友可以参考下
    2014-12-12
  • PHP连接MySQL查询结果中文显示乱码解决方法

    PHP连接MySQL查询结果中文显示乱码解决方法

    MySQL和Apache两个系统的编码(字符集)问题让我费劲脑筋,吃尽苦头。网上对这些问题的解决比较零散,比较片面,大部分是提供解决方法,却不说为什么。于是我将这几天收获总结一下,避免后来者再走弯路
    2013-10-10
  • php实现统计目录文件大小的函数

    php实现统计目录文件大小的函数

    本文给大家介绍了使用php实现统计目录文件大小的函数,其主要的思路是通过递归遍历目录中的所有文件从而计算出文件总大小的,有需要的小伙伴可以参考下
    2015-12-12
  • PHP树形结构tree类用法示例

    PHP树形结构tree类用法示例

    这篇文章主要介绍了PHP树形结构tree类用法,结合实例形式分析了php无限分类树tree.class.php的定义及使用相关操作技巧,需要的朋友可以参考下
    2019-02-02
  • php中访问修饰符的知识点总结

    php中访问修饰符的知识点总结

    在本篇文章里小编给大家分享了关于php中访问修饰符的知识点总结,兴趣的朋友们可以学习参考下。
    2019-01-01

最新评论