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实现文件与16进制相互转换的方法示例

    php实现文件与16进制相互转换的方法示例

    这篇文章主要介绍了php实现文件与16进制相互转换的方法,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • php适配器模式简单应用示例

    php适配器模式简单应用示例

    这篇文章主要介绍了php适配器模式简单应用,结合实例形式分析php适配器模式原理及使用适配器模式创建的天气预报查询接口功能相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • thinkphp备份数据库的方法分享

    thinkphp备份数据库的方法分享

    这篇文章主要介绍了thinkphp备份数据库的方法分享,非常的简单实用,推荐给有需要的小伙伴们
    2015-01-01
  • 7个鲜为人知却非常实用的PHP函数

    7个鲜为人知却非常实用的PHP函数

    这篇文章主要介绍了7个鲜为人知却非常实用的PHP函数,本文总结了如highlight_string()、str_word_count()、levenshtein()、get_defined_vars()、escapeshellcmd()等非常有用但不常见的函数,需要的朋友可以参考下
    2015-07-07
  • 队列在编程中的实际应用(php)

    队列在编程中的实际应用(php)

    队列(Queue)是运算受到限制的一种线性表。只允许在表的一端进行插入,而在另一端进行删除元素的线性表。队尾(rear)是允许插入的一端。队头(front)是允许删除的一端。空队列是不含元素的空表。
    2010-09-09
  • PHP使用Pthread实现的多线程操作实例

    PHP使用Pthread实现的多线程操作实例

    这篇文章主要介绍了PHP使用Pthread实现的多线程操作的方法,以完整实例形式分析了php多线程的创建及使用相关技巧,需要的朋友可以参考下
    2015-11-11
  • php_pdo 预处理语句详解

    php_pdo 预处理语句详解

    许多成熟的数据库都支持预处理语句(Prepared Statements)的概念。可以使用多种方式实现预处理,下面通过这篇文章来给大家详细的介绍下关于php_pdo预处理语句,文中通过实例代码介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-11-11
  • php+mysqli批量查询多张表数据的方法

    php+mysqli批量查询多张表数据的方法

    这篇文章主要介绍了php+mysqli批量查询多张表数据的方法,涉及multi_query、store_result及more_results等函数的使用技巧,需要的朋友可以参考下
    2015-01-01
  • php文件上传简单实现方法

    php文件上传简单实现方法

    这篇文章主要介绍了php文件上传简单实现方法,以一个完整实例形式分析了文件上传的过程,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • CodeIgniter生成网站sitemap地图的方法

    CodeIgniter生成网站sitemap地图的方法

    用CodeIgniter只需要三步就可以生成网站sitemap地图,方法很简单,大家可以参考一下
    2013-11-11

最新评论