在 PHP 应用的安全性方面,历史漏洞是不可忽视的威胁。本文将深入探讨两个经典漏洞:CVE-2019-11043(SAPI 整数溢出)和 CVE-2012-1823(CGI 参数注入),并提供详细的复现步骤、原理分析以及防御策略。这些漏洞虽然年代久远,但仍有部分老旧系统存在风险,同时理解它们的原理对于提升整体安全意识至关重要。
CVE-2019-11043:Nginx + PHP-FPM 的 RCE 风险
问题场景重现
CVE-2019-11043,也被称为 "破壳漏洞 2.0",影响的是 Nginx + PHP-FPM 的配置。漏洞允许攻击者通过精心构造的 URL,在服务器上执行任意代码。假设我们有以下 Nginx 配置:
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$; #高危配置
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
如果 fastcgi_split_path_info 配置不当,攻击者可以通过构造类似 index.php/%0a 这样的 URL,触发 SAPI 中的整数溢出,导致 PHP 尝试打开一个错误的文件,最终导致远程代码执行。
底层原理深度剖析
该漏洞的根源在于 PHP-FPM 的 fastcgi_split_path_info 指令的错误配置。攻击者通过在 URL 中注入换行符(%0a)可以绕过路径检查。当传入的 URL 中包含 %0a 时,PATH_INFO 变量会被错误地解析,导致 SCRIPT_FILENAME 指向了攻击者可控的文件名,从而执行恶意代码。
Nginx 作为反向代理服务器,将请求转发给 PHP-FPM。PHP-FPM 负责解析请求并执行 PHP 代码。如果 Nginx 配置中存在漏洞,攻击者就可以利用 Nginx 将恶意请求传递给 PHP-FPM,从而达到攻击的目的。
代码/配置解决方案
解决 CVE-2019-11043 的关键在于正确配置 Nginx。以下是一些推荐的配置方式:
- 升级 PHP 版本: 升级到 PHP 7.3.11 或更高版本,这些版本修复了该漏洞。
- 禁用
fastcgi_split_path_info: 如果不需要使用PATH_INFO,可以将其禁用。 - 使用
try_files指令: 使用try_files指令来检查文件是否存在,可以防止攻击者访问不存在的文件。
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
实战避坑经验总结
- 定期安全扫描: 使用专业的安全扫描工具,定期扫描服务器,及时发现潜在的安全漏洞。
- 最小权限原则: 确保 PHP-FPM 进程以最小权限运行,防止攻击者利用漏洞提升权限。
- 加强输入验证: 对用户输入进行严格的验证,防止恶意输入。
- 使用 Web 应用防火墙(WAF): 部署 WAF 可以有效地防御各种 Web 攻击,包括 CVE-2019-11043。
CVE-2012-1823:PHP CGI 参数注入漏洞
问题场景重现
CVE-2012-1823 影响的是以 CGI 模式运行的 PHP。当 PHP 作为 CGI 处理器时,允许攻击者通过 URL 查询字符串传递 -s、-d 等参数,从而修改 PHP 的配置或执行任意代码。比如,构造如下 URL:
http://example.com/index.php?-s
这将导致 PHP 显示源代码,暴露敏感信息。
底层原理深度剖析
CGI 模式下,Web 服务器将请求转发给 PHP CGI 解释器。PHP CGI 解释器会解析请求的 URL 查询字符串,并将查询字符串中的参数传递给 PHP 脚本。如果 PHP CGI 解释器没有对传入的参数进行充分的过滤,攻击者就可以通过构造恶意的 URL 查询字符串,将恶意的参数传递给 PHP 脚本,从而达到攻击的目的。
代码/配置解决方案
- 禁用 CGI 模式: 尽可能避免使用 CGI 模式运行 PHP,推荐使用 PHP-FPM。
- 配置
cgi.fix_pathinfo: 确保php.ini中cgi.fix_pathinfo设置为0,防止某些类型的路径信息注入攻击。
cgi.fix_pathinfo=0
- Web 服务器配置: 在 Web 服务器配置中限制传递给 PHP CGI 的参数。
实战避坑经验总结
- 避免使用 CGI 模式: 这是最有效的防御方法。
- 定期更新 PHP 版本: 及时更新 PHP 版本,修复已知漏洞。
- 加强配置管理: 定期检查 PHP 和 Web 服务器的配置,确保配置安全。
通过理解和防范这些 PHP 安全漏洞,我们可以有效地提高 Web 应用的安全性,保护用户数据和服务器资源不受侵害。同时,了解如宝塔面板等工具对 Web 服务器配置的影响,有助于更好地管理和维护服务器的安全。关注服务器的并发连接数和负载均衡,确保在高流量下服务器的稳定性和安全性。
冠军资讯
半杯凉茶