有人上传了几个 GIF 文件,在浏览器中查看时,浏览器说它是无效的,并且我的病毒扫描器警告我它是注入(或类似的东西)。请参见下面的 zip 文件,其中包含这些 GIF 文件。
我认为仅检查头信息是不足够的。我听说过一张图片可能完全有效,但也可能包含利用代码。
所以我有两个基本问题:
- 有人知道他们如何将恶意内容注入GIF图像(同时保持有效的GIF MIME类型)吗?如果我知道这个,也许我可以在上传时检查它。
- 我如何防止某人上传此类文件?
- 我在共享托管上,无法安装服务器端病毒扫描程序。
- 提交信息到在线病毒扫描网站可能太慢了。
- 是否有任何使用PHP类自己检查这些内容的方法?
- 如果使用GD调整图像大小失败,那么这种方法会失效吗?还是说这种漏洞仍然会通过并出现在调整大小后的图像中?如果失败了,那就太理想了,因为我可以使用调整大小作为一种技术来判断它们是否有效。
更新:感谢大家的回复。我正在尝试在服务器上查找已上传的GIF。如果我找到他们,我会更新这篇文章。
更新2:我找到了GIF,如果有人有兴趣,我将把它们放在一个用密码“123”加密的压缩文件中。它位于这里(请注意,这个托管网站上有多个“下载”按钮——其中一些是广告) http://www.filedropper.com/badgifs。名为5060.gif的那个被我的杀毒软件标记为特洛伊木马(TR/Graftor.Q.2)。我应该指出,这些文件是在我实施前12个字节的MIME检查之前上传的。所以现在,对于这些特定的文件,我是安全的。但是我仍然想知道如何检测隐藏在正确MIME类型后面的漏洞利用。
重要澄清:我只关心下载这些文件并查看它们的计算机的风险。这些文件不会对我的服务器造成风险。它们不会被执行。它们使用干净的名称(十六进制哈希输出)进行存储,扩展名为".enc",我使用fwrite过滤器将它们加密后保存到磁盘中。
// Generate random key to encrypt this file.
$AsciiKey = '';
for($i = 0; $i < 20; $i++)
$AsciiKey .= chr(mt_rand(1, 255));
// The proper key size for the encryption mode we're using is 256-bits (32-bytes).
// That's what "mcrypt_get_key_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)" says.
// So we'll hash our key using SHA-256 and pass TRUE to the 2nd parameter, so we
// get raw binary output. That will be the perfect length for the key.
$BinKey = hash('SHA256', '~~'.TIME_NOW.'~~'.$AsciiKey.'~~', true);
// Create Initialization Vector with block size of 128 bits (AES compliant) and CBC mode
$InitVec = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
$Args = array('iv' => $InitVec, 'key' => $BinKey, 'mode' => 'cbc');
// Save encoded file in uploads_tmp directory.
$hDest = fopen(UPLOADS_DIR_TMP.'/'.$Hash.'.enc', 'w');
stream_filter_append($hDest, 'mcrypt.rijndael-128', STREAM_FILTER_WRITE, $Args);
fwrite($hDest, $Data);
fclose($hDest);