我是一名安全研究人员,曾遇到过多个可以利用文件上传表单的案例,这些案例允许攻击者控制的 PHP 代码被服务器解释,从而导致远程代码执行。此漏洞的根本原因似乎是以下 Linux 发行版的 Apache 配置中默认启用的旧设置:
- CentOS 5.8
- CentOS 6.5
- 红帽 5.10
- 红帽 6.5
可能还有其他。设置如下:
AddHandler application/x-httpd-php .php
此设置的效果令人担忧,因为它告诉服务器,名称匹配的文件\.php应该被解释为 PHP 代码。如果攻击者上传了名为shell.php.jpg其中嵌入了 php 代码,并导航到该页面,服务器将以服务器用户的身份执行该脚本。
我建议的补救措施是通过注释掉此设置来禁用它。我的理由是 .php 文件已经有一个内置于 Apache 的隐式处理程序,它告诉服务器将代码解释为 php,所以在我看来这个设置是多余的。我感觉这是旧版本 CentOS 和 RedHat 遗留的设置,最新版本没有这个设置。
我的问题是:在什么情况下禁用此设置会导致功能中断?
答案1
我的理由是 .php 文件已经有一个内置于 Apache 的隐式处理程序,它告诉服务器将代码解释为 php
据我所知,没有隐式处理程序,这个AddHandler
命令告诉 apache 将带有.php
扩展名的文件传递给application/x-httpd-php
处理程序(mod_php)
但是,总体来说你是对的。这是一个鲜为人知的功能,mod_mime
即具有多个扩展名的文件会检查其所有扩展名以获取处理程序和其他信息。 Apache 的文档建议该指令应替换为:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
仅将以该处理程序结尾的文件传递.php
给该处理程序。
不过,最好的解决方案是将不可信的用户上传文件存储在DocumentRoot
浏览器无法请求的位置之外script.php.jpg
(或将链接邮寄到http://www.example.com/uploads/thisisreallyyourbank.html
)