È possibile che un hacker elimini il file di caricamento di PHP?

4

Voglio dare un sistema di filtraggio nel mio script. eccolo qui:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png","bmp");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if (in_array($extension, $allowedExts)){
//here is rst of codes
?>

Significa che il mio script controllerà l'estensione per il caricamento del file con explode . Quindi, ora è possibile che un hacker elimini questo sistema? E carica lo script del codice dannoso?

    
posta Imran Abdur Rahim 01.10.2013 - 18:56
fonte

3 risposte

9

Un sacco può ancora andare storto data un'applicazione che contiene questo piccolo frammento di codice.

  1. Un utente malintenzionato potrebbe utilizzare un file locale per includere la vulnerabilità per ottenere esecuzione di codice remoto inserendo il codice PHP nei metadati di un'immagine caricata.
  2. Un utente malintenzionato potrebbe potenzialmente scrivere un'immagine con un file valido
    estensione in qualsiasi directory usando directory traversal .
  3. Nelle versioni precedenti di PHP un utente malintenzionato potrebbe utilizzare un byte null controlla l'estensione troncando il nome del file, ma FILE le funzioni sfuggiranno ai byte null a partire da PHP 5.3.4.
risposta data 01.10.2013 - 19:45
fonte
0

Sebbene di per sé non sia sicuro al 100%, ti suggerisco di controllare il tipo MIME del file piuttosto che un'estensione usando exif_imagetype . È un buon passo per aiutare a convalidare l'immagine.

Chiunque può inserire codice PHP dannoso in un file .gif, e con molti fcgi / fpm e routing, verrà analizzato da PHP se verrà caricato in una directory web e l'utente malintenzionato scorrerà su questa pagina.

Per aggirare questo problema, assicurati che i tuoi file non siano nel tuo webroot e, se stai usando qualche tipo di routing o di riscrittura di URL, disattiva PHP-FPM / mod_php per .gif|.jpg|.jpeg ecc. Ciò ti aiuterà anche a lungo termine. A meno che non ci sia un 0day là fuori da qualche parte, il caricamento di un file non esegue un eval() su di esso, quindi è necessario accedere direttamente al file perché sia dannoso.

Oltre a questo, ti suggerisco di eseguire array getimagesize ( string $filename [, array &$imageinfo ] ) sull'immagine. Se restituisce 0 , non è un'immagine valida. Non è necessario GD perché funzioni.

    
risposta data 01.10.2013 - 21:15
fonte
0

Sì.

Un modo comune per aggirare un semplice controllo come quello che stai usando è usare un file di immagine reale (ad esempio un JPEG) e aggiungere una shell remota all'interno del commento dell'immagine.

Per verificare se l'implementazione è vulnerabile o meno, basta prendere qualsiasi immagine valida e aggiungere la seguente shell di base come commento al tuo editor di scelta (ad esempio Photoshop, GIMP):

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

Quando l'immagine viene caricata con successo, prova a chiamarla con il parametro cmd impostato su un comando semplice (ad es. /upload/shell.jpg?cmd=ls ). Se la cartella in cui viene caricato esegue qualsiasi tipo di file, la shell dovrebbe essere attiva.

Nota: alcune funzioni PHP, come quella del sistema qui usato, potrebbero essere disabilitate. In questo caso, è possibile provare un numero o diverse funzioni per eseguire i comandi.

    
risposta data 01.10.2013 - 19:45
fonte

Leggi altre domande sui tag