标题党一下,其实这个不应该算是 Apache 的漏洞。
简述漏洞情况:
有的网站有文件上传功能,尤其是可以上传 rar 文件的。如果文件名是 abc.php.rar,而且这个文件被放在了 http://www.leakon.com/uploads/abc.php.rar,你在地址栏输入这个地址,Apache 就会调用 PHP 模块去解析 abc.php.rar。
为什么会解析呢?
因为 Apache 按照文件扩展名,寻找 handler,比如,如果扩展名是 php,就交给 PHP 模块,如果是 jpg,就会输出 image/jpg 类型 的 http 头。
Apache 有一些已知的文件类型,在 Apache 目录的 conf/mime.types 文件中可以查看。
但这里没有 rar 的 handler,这时 Apache 会把 php 当作 abc.php.rar 这个文件的扩展名!
这个可能是 Apache 的一个解析规则吧,反正在 2.2.4 版本测试是这样的。
最简单的测试方法,写一个文件,内容是:
<?php
phpinfo();
?>
保存为 abc.php.rar,然后上传到你的服务器,看能不能执行吧。
前面我也说过,可能这不应该算是漏洞,只是一个规则,如果把这个规则去掉,可能相当大的一部分网站会因此受到影响。不可否认的,也是具有讽刺意味的是:我们的程序能够正常运行,有时是因为它处在一个有“漏洞”的环境中……
避免问题的方法有很多,比如在 mime 文件中加上 rar 类型的定义,再给 rar 文件加个 handler,再限制 upload 目录的执行权限等等。
我觉得比较好的方法是在服务端检查文件扩展名,如果应用程序需要上传 rar 等类型的文件,建议把文件在服务端改名,写成没有扩展名的字母和数字的组合,然后把原始文件名保存在数据库里,当需要下载的时候,用 http 头声明文件名。
单点处理,可以避免很多后续的相互依赖的安全工作。