PHP 漏洞

总结 PHP 应用程序与运行时中产生的安全缺陷、主要攻击类型及应对措施。

PHP 漏洞

概述

PHP 漏洞是 PHP 编写的 Web 应用程序以及 PHP 运行时·配置中产生的安全缺陷的统称。输入验证不足、文件·命令·数据库处理使用不当,以及过旧版本和不恰当的服务器配置相结合,可能导致远程代码执行(RCE)、SQL 注入、认证绕过等致命事故。相比 PHP 本身的缺陷,更多由应用程序代码和运营配置引发,因此开发、部署、运营各阶段的安全控制很重要。

主要内容

成因与特性

PHP 广泛用于 Web 托管、CMS、遗留系统,攻击面较大。动态类型和宽松比较、文件·URL·命令执行函数的多样性、在框架之外直接编写的代码会放大漏洞。过去的 register_globals 或 magic_quotes 已被移除,但如今信任输入值或原样暴露错误的配置仍然有问题。

注入类

最常见的类型是 SQL 注入。将用户输入以字符串拼接方式放入查询会导致认证绕过和数据泄露。预处理语句与绑定、安全使用 ORM 是基本对策。将输入传给 OS 命令执行函数导致的命令注入、未转义 HTML 输出导致的 XSS,以及头·日志·LDAP 注入也是主要类别。

文件·路径漏洞

include/require 中包含用户输入时,可能发生本地文件包含(LFI)和远程文件包含(RFI)。路径遍历(path traversal)、危险的文件上传、缺少扩展名·MIME 验证也会导致服务器被入侵。文件上传应将存储位置置于 Web 根目录之外,并分离允许的扩展名和执行权限。

反序列化与对象注入

将不可信数据放入 unserialize() 时,可能滥用 magic method 进行对象注入和 RCE。phar:// 元数据反序列化与文件函数结合时也危险。外部数据应使用 JSON 等安全格式交换,若不可避免则应用签名·白名单·类限制。

认证·会话·API

会话固定、未设置 Cookie 属性、弱密码哈希、缺少 JWT 验证会导致账户被接管。需要重新签发会话 ID,使用 HttpOnly·Secure·SameSite Cookie、password_hash(),并验证 JWT 的 alg·iss·aud。REST API 中还应检查批量赋值、IDOR、SSRF。

配置·运行时漏洞

display_errors 暴露、启用 allow_url_include、未设置 open_basedir、公开 PHP-FPM 状态页面会导致信息泄露和攻击扩大。仅靠 disable_functions 可能被绕过,因此必须同时最小化 OS 权限并进行容器隔离。2024 年,Windows PHP-CGI 环境中的参数注入漏洞(CVE-2024-4577)被利用为远程代码执行,凸显了配置和补丁的重要性。

依赖与供应链

Composer 包和框架依赖中可能引入已知漏洞。应注意被弃用的包、错拼域名抢注(typosquatting)、依赖混淆(dependency confusion)、被污染的部署脚本,并应用 composer audit、SBOM、版本固定和完整性验证。

应对策略

输入验证和输出转义、最小权限、预处理语句、白名单、安全反序列化、上传隔离是核心。应以分层方式运行 SAST·DAST·SCA、代码审查、渗透测试、WAF 和日志监控,并将 PHP 与扩展模块、框架保持在最新安全支持版本。

最新趋势

截至 2024-2025 年,PHP 8.1 的安全支持即将结束,迁移到 8.2·8.3·8.4 变得重要,PHP 8.4 于 2024 年 11 月发布,成为新项目的选择。Windows PHP-CGI RCE(CVE-2024-4577)之后,针对 CGI/FPM 配置暴露和参数处理的检查得到加强。随着 Composer 供应链攻击和容器·Kubernetes 配置错误成为主要威胁,SBOM、依赖自动扫描、CI/CD 安全门禁呈现标准化趋势。基于 AI 的代码审查和自动补丁建议也在扩散,但仅靠 WAF 存在绕过可能,安全编码和快速补丁仍然优先。

相关主题

  • [[PHP]]
  • [[SQL 인젝션]]
  • [[XSS]]
  • [[웹 보안]]
  • [[CVE]]
  • [[의존성 관리]]