Ricreazione di caricamenti / immagini collegate con imagecreate da * php

6

Come suggerito sulla mia domanda StackOverflow , ora sto dirigendo questo verso il gruppo Sicurezza dell'informazione, dal momento che nessuno è stato in grado di rispondere alla mia domanda nonostante i multipli voti positivi.

L'account di immagini caricate dall'utente per una gran parte del contenuto del sito su cui sto lavorando. Ho provato a memorizzarli al di fuori del webroot e recuperarli con readfile() per motivi di sicurezza, ma era troppo lento, quindi ho dovuto tornare al vecchio metodo.

Ora sto cercando di assicurarmi che tutti i caricamenti siano completamente sterilizzati al 100% dal momento che verranno archiviati all'interno del webroot. La mia domanda è, se un utente dovesse rinominare uno script dannoso in un file .jpg, .gif, .png o .bmp e lo abbia caricato, sarebbe comunque dannoso se eseguito o recuperato se l'immagine è stata ricreata con una funzione come questa :

function imageCreateFromAny($filepath) { 
    $type = exif_imagetype($filepath); // [] if you don't have exif you could use getImageSize() 
    $allowedTypes = array( 
        1,  // [] gif 
        2,  // [] jpg 
        3,  // [] png 
        6   // [] bmp 
    ); 
    if (!in_array($type, $allowedTypes)) { 
        return false; 
    } 
    switch ($type) { 
        case 1 : 
            $im = imageCreateFromGif($filepath); 
        break; 
        case 2 : 
            $im = imageCreateFromJpeg($filepath); 
        break; 
        case 3 : 
            $im = imageCreateFromPng($filepath); 
        break; 
        case 6 : 
            $im = imageCreateFromBmp($filepath); 
        break; 
    }    
    return $im;  
} 

In altre parole, c'è comunque un modo per ingannare una delle funzioni imagecreatefrom* nell'esecuzione del contenuto come script invece di un'immagine o anche uno script dannoso che è stato sottoposto a questo può essere ridotto a un'immagine spezzata?

Aggiorna Verificherò anche i tipi di file e le estensioni, ma volevo sapere se l'utente è riuscito a scavalcare quelli, sarebbe stato di aiuto per proteggere il mio server e / oi miei clienti in qualsiasi modo. Grazie.

    
posta DanL 07.03.2016 - 15:09
fonte

3 risposte

4

would even a harmful script that's been run through this be reduced to a broken image?

No, qualsiasi codice dannoso nell'immagine è ancora lì.

Ma se è sicuro dipende molto da cosa fai con l'output di imageCreateFromAny .

Da solo, imageCreateFromX non fa nulla all'immagine. Non lo ricrea, crea semplicemente un identificatore di risorsa immagine, quindi se lo desideri, puoi cambiare ulteriormente l'immagine. Ma ogni codice dannoso all'interno dell'immagine è conservato.

Il tuo controllo exif_imagetype può essere facilmente aggirato , quindi non garantisce che l'immagine non contenga codice dannoso.

Quindi, se non controlli l'estensione del file e usi la tua funzione, ad esempio in questo modo: imagepng(imageCreateFromAny($imageName), $imageName); , allora sarebbe insicuro.

is there anyway to trick one of the imagecreatefrom* functions into executing content as a script

Non speriamo. Non sarebbe una vulnerabilità nel tuo codice, ma una vulnerabilità in PHP stesso.

Quindi qual è la soluzione allora? Come puoi assicurarti che l'immagine caricata non contenga alcun codice dannoso? Mi vengono in mente due idee:

risposta data 07.03.2016 - 15:49
fonte
1

Questo metodo riduce solo la misura in cui i dati dell'immagine interagiscono con il PHP che la sta elaborando, ma il file interagisce con qualcosa che ha una superficie di attacco molto più grande del readfile ().

Anche la convalida del contenuto è sicura per il tuo server web, non significa che sia sicura per il cliente.

La loro memorizzazione all'interno del webroot comporta ulteriori rischi: il runtime di PHP cerca felicemente qualsiasi file inviato ad esso per il codice PHP, quindi lo esegue. Il codice che hai aggiunto qui non fa nulla per impedirlo. Il codice PHP entra nel runtime di PHP tramite 2 percorsi - o mappato dal server web (normalmente basato sulla presenza di un URL che risolve un nome di file che termina con '.php') o da include / require / eval / create_function, ecc. Codice PHP.

Puoi aggiungere livelli di protezione rispetto al primo metodo di

  • non consente ai file caricati di avere un'estensione .php
  • limitando i caricamenti a un albero di directory designato in cui l'handoff PHP è disabilitato nel server web
  • caricamento del contenuto nella root del documento di un server web separato che non ha affatto PHP

I livelli di difesa per il secondo metodo sono leggermente più complicati e costosi: controlli del codice, suexec, disabilitazione di alcune funzioni PHP, blocco della cache dell'opcode.

Uno strumento utile, nel quale hai già lavorato a metà del tuo codice e che fornisce protezione per i client, è la conversione del file; se è un BMP o GIF convertire in un PNG. Per JPeg usa webp (se i tuoi utenti possono tollerarlo) ecc. Anche se questo non sarà completamente a prova di proiettile, sarà un lungo cammino verso gli attacchi di de-fanging.

Il codice che ci hai mostrato legge solo il contenuto e controlla che sia un formato immagine valido. Il malware, incluso il malware scritto in PHP, può essere incorporato in uno qualsiasi di questi formati di file. Il tuo codice non stabilisce se accettare o meno contenuti diversi dal controllare che il formato del file appaia corretto, né mostrare in alcun modo che il contenuto sia stato modificato.

Così com'è, non aggiunge molto valore.

    
risposta data 07.03.2016 - 17:22
fonte
0

Penso che non ci sia comunque l'esecuzione di uno script attraverso le immagini, ma ricorda che il malware e gli attacchi di nuove tecniche vengono scoperti ogni giorno, quindi devi implementare diversi livelli di difesa. Ti consiglio quanto segue:

  1. Implementa convalide: imposta un limite di dimensioni, un formato di nome file e il tipo di estensioni. Le convalide sono molto importanti, perché è il primo punto di attacco, ad esempio, l'attacco di iniezione nulla, qualcuno può creare un file chiamato "script.sh% 00img.bmp" e potrebbe essere eseguito sul tuo server. Ricorda che le validazioni devono essere sul server laterale.
  2. Implementa meccanismi di anti-automazione, come un CAPTCHA. Potresti ridurre il rischio di attacchi di tipo denial of service con questo tipo di meccanismi di sicurezza.
  3. Indurimento del server Web: imposta una directory isolata per i tuoi file, imposta le autorizzazioni corrette, ad esempio, non imposta le autorizzazioni di esecuzione per i tuoi file, i messaggi di errore personalizzati e le pagine di errore e le azioni quando viene presentato un errore e altre impostazioni.

Spero che questa informazione ti aiuti.

Buona fortuna.

    
risposta data 07.03.2016 - 16:37
fonte

Leggi altre domande sui tag