Sto lavorando su un sito web - proprio ora è nelle prime fasi di test, non ancora lanciato e ha solo dati di test - grazie al cielo.
Prima di tutto, un hacker ha capito la password per accedere alle pagine di amministrazione dei siti web * . Penso che abbiano usato un keylogger sul computer di un amico che ha effettuato l'accesso al sito per darmi un feedback.
In secondo luogo, hanno usato una casella di caricamento delle immagini per caricare un file PHP. Ho effettuato controlli rigorosi in modo che solo i file .jpg e .png siano accettati, tutto il resto dovrebbe essere stato rifiutato. Sicuramente non c'è modo di caricare un file .jpg e quindi modificare l'estensione una volta archiviato il file?
Per fortuna anch'io generi nuovi nomi di file quando mi viene inviato un file, quindi non penso che siano riusciti a localizzare il file per eseguire il codice.
Non riesco proprio a capire come il sito web abbia consentito il passaggio di un file PHP. Cosa c'è che non va nella mia sicurezza? Il codice della funzione di convalida è riportato di seguito:
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;
}
Una volta che il file arriva al server, utilizzo il seguente codice per conservare l'estensione e generare un nuovo nome casuale. È un po 'complicato, ma funziona bene.
// 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;
Ho appena testato con un nome come logo.php;.jpg
e sebbene l'immagine non possa essere aperta dal sito web, ha cambiato correttamente il nome in 123456.jpg
. Per quanto riguarda logo.php/.jpg
, Windows non consente questo tipo di file.
* Pagine protette sul sito web che consentono funzioni semplici: come caricare un'immagine che diventa quindi un nuovo logo per il sito web. I dettagli FTP sono completamente diversi dalla password utilizzata per accedere alle pagine protette sul sito web. Come le credenziali di database e cPanel. Mi sono assicurato che le persone non possano nemmeno visualizzare la cartella e la struttura del file del sito. Non c'è letteralmente alcun modo per pensare di rinominare un'estensione .jpg o .png in .php su questo sito se non si dispone di dettagli FTP.