ThinkPHP常见漏洞包括文件包含、反序列化RCE、变量覆盖、文件上传缺陷及SQL注入与日志泄露五类;需分别通过路径白名单+realpath校验、禁用unserialize+启用allowed_classes、入口参数硬拦截、重命名+MIME校验+图片重绘、禁用调试模式等措施修复。

ThinkPHP 常见漏洞不是集中在某一个版本,而是随开发习惯、配置疏忽和框架演进持续暴露的几类高危模式。它们大多不依赖“一键利用”,但一旦出现在生产环境,极易被黑产工具链批量打穿。
文件包含与路径遍历漏洞
典型表现是 include(): Filename cannot be empty 或直接读取 application/database.php。根本原因不是框架强制包含,而是业务代码拼接了用户输入:
-
view('../runtime/log/' . input('file')) -
/index/ajax/lang?lang=../../config/database
绕过手法包括双重 URL 编码(%2e%2e%2f)、大小写混用(..%252f)、NTFS 流(shell.php::$DATA)。修复关键不是加过滤,而是禁用动态路径、改用白名单映射(如lang_map = ['zh-cn' => 'zh-cn.php']),所有路径必须经realpath()规范化后再校验是否落在允许目录内。
反序列化远程代码执行(RCE)
ThinkPHP 5.x 到 6.0.13 多个版本存在 POP 链,CVE-2022-38352 就是典型——通过 Psr6Cache::__destruct 触发 think\log\driver\Socket 加载攻击者控制的 callable。常见入口点包括:
- 缓存驱动(
File->read()直接unserialize()) - Session 解析(Redis/Memcache 中污染数据)
- 控制器里显式调用
unserialize($_GET['data'])
最有效修复是砍掉入口:全部替换为json_decode();若必须用unserialize(),务必启用allowed_classes白名单(设为false最安全),并关闭phar://协议和allow_url_include。
变量覆盖与动态方法调用漏洞
ThinkPHP 5.0.0 的 _method=__construct 是经典案例,攻击者能覆盖 Request 类的 filter、get 属性,后续在 input() 中触发 call_user_func。类似风险也存在于:
-
$obj->$method()、new $className()等动态调用 -
call_user_func_array([input('class'), input('method')])
修复不是加正则,而是在入口文件硬拦_method、s等参数,在Request::method()中只放行标准 HTTP 方法(GET/POST/PUT),控制器名必须用正则校验^[A-Za-z][A-Za-z0-9]*$。
文件上传逻辑缺陷
框架本身不提供上传组件,所谓“上传漏洞”全是业务层失守:
- 仅靠
$_FILES['type']或后缀截取判断类型(可伪造) - 未重绘图片就保存(图片马末尾藏
) - 上传目录没禁执行(Nginx 少配
deny all,Apache 没.htaccess)
必须强制重命名(md5(uniqid()).'.jpg')、用finfo_file()校验真实 MIME、图片必须imagecreatefromxxx()+imagejpeg()重绘、上传目录权限设为 755 且禁止解析 PHP。
SQL 注入与日志泄露
前者多因滥用 Db::query() 拼接字符串,后者几乎都源于 APP_DEBUG = true 未关闭:
- 调试模式下,
Runtime/Logs/26_10_15.log可被直接下载,含 SQL 语句、密码明文、堆栈路径 - 日志路径可预测,攻击者用脚本批量请求就能拖库
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











