我在一个网站上工作——现在它处于测试的早期阶段,还没有推出,只有测试数据——谢天谢地。
首先,黑客找到了登录网站“管理”页面的密码*。我认为他们在朋友的计算机上使用了一个键盘记录器,该记录器登录到该网站给我反馈。
其次,他们使用图片上传框上传PHP文件。我进行了严格的检查,只接受 .jpg 和 .png 文件——其他所有文件都应该被拒绝。当然没有办法上传 .jpg 文件,然后在文件存储后更改扩展名?
值得庆幸的是,当文件发送给我时,我还会生成新的文件名,所以我认为他们无法找到文件来执行代码。
我似乎无法弄清楚该网站如何让 PHP 文件通过。我的安全出了什么问题?验证函数代码如下:
function ValidateChange_Logo(theForm)
{
var regexp;
if (theForm.FileUpload1.value == "")
{
alert("You have not chosen a new logo file, or your file is not supported.");
theForm.FileUpload1.focus();
return false;
}
var extension = theForm.FileUpload1.value.substr(theForm.FileUpload1.value.lastIndexOf('.'));
if ((extension.toLowerCase() != ".jpg") &&
(extension.toLowerCase() != ".png"))
{
alert("You have not chosen a new logo file, or your file is not supported.");
theForm.FileUpload1.focus();
return false;
}
return true;
}
文件到达服务器后,我使用以下代码保留扩展名,并生成一个新的随机名称。它有点乱,但效果很好。
// Process and Retain File Extension
$fileExt = $_FILES[logo][name];
$reversed = strrev($fileExt);
$extension0 = substr($reversed, 0, 1);
$extension1 = substr($reversed, 1, 1);
$extension2 = substr($reversed, 2, 1);
$fileExtension = ".".$extension2.$extension1.$extension0;
$newName = rand(1000000, 9999999) . $fileExtension;
我刚刚测试了一个名称,例如logo.php;.jpg
,虽然图片无法被网站打开,但它正确地将名称更改为123456.jpg
. 至于logo.php/.jpg
,Windows 不允许这样的文件名。
* 网站上允许简单功能的受保护页面:例如上传一张图片,然后成为网站的新徽标。FTP 详细信息与用于登录网站上受保护页面的密码完全不同。数据库和 cPanel 凭据也是如此。我确保人们甚至无法查看该站点的文件夹和文件结构。如果您没有 FTP 详细信息,我根本无法想到在此站点上将 .jpg 或 .png 扩展名重命名为 .php。