PHP 漏洞

整理了 PHP 应用程序中反复出现的安全缺陷类型、成因及应对措施的文档

PHP 漏洞

概述

PHP 是驱动全球大量网站的服务器端脚本语言,但其动态类型与自动类型转换、基于文件包含(include)的模板处理、长期保留的遗留函数等语言设计上的灵活性,一直成为各类安全缺陷的成因。“PHP 漏洞”是一个涵盖 PHP 应用程序中反复出现的漏洞类型、其根本原因以及防御手段的概念。

主要内容

代表性漏洞类型

  • SQL 注入:在将用户输入以字符串拼接方式放入查询时发生。使用 PDO、mysqli 的预处理语句(prepared statement)即可防御大部分情况。
  • XSS(跨站脚本攻击):在用 echo 原样输出用户输入时发生,基本应对方式是使用 htmlspecialchars($s, ENT_QUOTES, 'UTF-8') 进行输出转义。
  • 文件包含(LFI/RFI):include、require 中混入用户输入,进而导致本地或远程文件执行。需要白名单与 realpath() 校验。
  • 操作系统命令注入:当输入被传入 system、exec、shell_exec、passthru、popen、proc_open 等函数时发生,建议使用 escapeshellarg()。
  • PHP 对象注入(反序列化):当 unserialize() 被应用于不可信数据时,可能遭受滥用魔术方法(__wakeup、__destruct)的攻击。需要使用 allowed_classes 选项或以 json_decode() 替代。
  • 类型混淆(Type Juggling):== 比较的宽松类型转换可能导致认证绕过,因此建议使用 ===。
  • 文件上传漏洞:因扩展名、MIME 校验不充分而导致 WebShell 被上传的案例十分典型。
  • 会话固定与劫持:重新生成会话 ID(session_regenerate_id)以及设置 Cookie 属性(HttpOnly、Secure、SameSite)是关键。

语言与运行时层面的成因

过去的 register_globals 与 magic_quotes_gpc 扭曲了输入校验,造成了大规模漏洞,二者分别于 PHP 5.4 中被移除。preg_replace 的 /e 修饰符于 PHP 7.0 中被移除,create_function() 在 7.2 中弃用后于 8.0 中被移除。assert() 自 8.0 起不再将字符串作为代码求值。即便如此,eval()、动态变量($var)、extract() 等功能依然危险。此外,通过 phar:// 流包装器进行的反序列化、因启用 display_errors 而导致的路径与配置信息泄露也常被指出。

各版本的安全变化

PHP 5.4 移除了全局变量与魔术引号,PHP 7.0 清理了执行运算符与 /e 修饰符,在提升性能的同时改善了安全性。PHP 8.0 在引入 JIT 的同时移除了 create_function,并强化了类型系统;8.1 引入枚举,8.2 预告弃用动态属性,8.3、8.4 则延续了类型与安全相关的清理。老旧的 5.x、7.x 系列因停止支持(EOL)而不再提供补丁,存在较大的结构性风险。

防御手段

原则是将输入校验与输出转义分离。数据库使用预处理语句,HTML 按上下文进行转义,Shell 使用参数转义。文件路径通过白名单与 basename()、realpath() 进行规范化,反序列化尽量替换为签名令牌或 JSON。设置 open_basedir、display_errors=Off、采用最小权限运行账户、PHP-FPM 池隔离、基于容器的沙箱化也同样有效。依赖项应通过 composer audit 进行检查,并利用框架(Laravel、Symfony)提供的 CSRF、ORM、校验功能更为安全。

实际案例

WordPress 插件与主题中反复报告的文件包含、SQL 注入漏洞,phpMyAdmin 的众多 CVE,PHPUnit 的 eval-stdin.php 远程代码执行(CVE-2017-9841),Laravel Ignition 的反序列化漏洞(CVE-2021-3129)等均属典型。2024 年,Windows 环境下的 PHP-CGI 因参数注入可导致任意代码执行的 CVE-2024-4577 成为重大议题。

最新动向

截至 2024~2025 年,随着 PHP 8.1 支持终止临近,迁移至 8.2 以上已成为安全建议,PHP 8.4 于 2024 年 11 月正式发布。CVE-2024-4577 之后,针对 PHP-CGI 及 Windows 发行版配置的检查受到强调,针对 Composer 生态的供应链攻击(恶意包、域名抢注)呈增长趋势。静态分析(SAST)、依赖扫描、运行时应用自我保护(RASP)工具的引入日益增多,对遗留 CMS、插件的自动化漏洞扫描与补丁管理已成为实务中的核心课题。

相关主题

  • [[SQL 注入]]
  • [[跨站脚本攻击]]
  • [[反序列化漏洞]]
  • [[Web 应用安全]]
  • [[CVE]]