我的广告服务器在周末被黑了。
根据这篇文章,这似乎是一个普遍存在的问题。
里面有东西让我思考...
他说,攻击者通过一次攻击获得了他服务器的登录权限,然后上传了一个恶意编码的图像,其中包含隐藏在其中的 PHP 脚本。通过查看图片,攻击者强制脚本在服务器上执行
这怎么可能?它是否依赖于使用 GD 或类似工具打开的图像?他们是否上传了一个冒充图像的脚本,并以某种方式包含它?
它可以像上传文件一样简单
GIF89a<?php
echo 'hi';
如果您的上传脚本通过fileinfo测试内容类型,或者mime_content_type()
将其识别为“GIF 图像数据,版本 89a”,因为GIF89a
这是将文件标识为 gif 所需的唯一模式/幻数。
OpenX 上传脚本显然保留了建议的文件名,即可以将这个“图像”保存为服务器上的 foo.php。现在,如果您通过脚本请求该文件http://hostname/uploaddir/foo.php
作为 php 脚本执行,因为网络服务器通常/经常仅通过文件扩展名确定内容类型,例如通过
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
php 然后回显前导GIF89a
并执行该<?php ...code...
块。
将 <?php 块放入 gif 注释中稍微复杂一些,但基本相同。
您的服务器出于 w/e 原因解析该文件。攻击者将 PHP 放入图像评论中。
您如何验证文件是图像?如果您仅对 mime 类型进行操作,那么我相信他们可以伪造图像标题并在此之后包含他们想要的任何内容。VolkerK 有一个实际的例子
在完美的世界中,我不会通过 PHP 提供任何面向公众的图像,因为担心这样的问题。
直接使用服务器提供图像;一个好的建议是将这些图像保存到可以在没有PHP 的情况下提供它们的目录。
我想这就是它的要点,如果我错了,请有人纠正我。
我看到的服务器妥协的唯一可能性是图像是include
d 而不是通过 egreadfile
和其他流函数读取。