Caricamento immagine sicuro, o Bypassare controllo mime di tipo PHP

1

Quando si proteggono i caricamenti di immagini ci sono fondamentalmente tre approcci che conosco (ovviamente, idealmente, tutti e tre sono usati):

  1. controlla l'estensione del file
  2. archivia i file caricati nella directory non eseguibile al di fuori del webroot
  3. controlla il contenuto / il tipo mime del file

Per il terzo punto, ci sono varie funzioni PHP suggerite, molte delle quali possono essere scavalcato codificando il codice in chunk IDAT . Ecco i risultati che ottengo:

<?php $image = 'imageshell.png';

echo exif_imagetype($image);
// -> 3 (IMAGETYPE_PNG)

echo "<br>" . getimagesize($image)[2];
// -> 3 (IMAGETYPE_PNG)

echo "<br>" . mime_content_type($image);
// -> image/png

echo "<br>" . finfo_file(finfo_open(FILEINFO_MIME_TYPE), $image);
// -> image/png

echo "<br>" . finfo_file(finfo_open(FILEINFO_MIME_TYPE, "/usr/share/misc/magic"), $image);
// -> application/octet-stream

In sostanza ho queste domande ora:

  1. Perché il risultato è diverso se passo un file magico (non dovrebbe accettare il file come file immagine, poiché è quello che effettivamente è?), che cos'è esattamente un file magico e che cosa fa PHP integrato sembra un file magico?
  2. Posso controllare in anticipo se il sistema ha un file magico che consentirà di identificare correttamente una non immagine o un'immagine che contiene codice PHP?
  3. Se non riesco, c'è un approccio migliore per verificare se un file immagine contiene codice PHP?
  4. È forse possibile ignorare l'ultimo controllo - quello risultante in application/octet-stream - come pure?
posta tim 21.02.2016 - 21:29
fonte

1 risposta

2

Why is the result different if I pass a magic file (shouldn't it still accept the file as an image file, as that is what it actually is?), what exactly is a magic file, and what does PHPs inbuilt magic file look like?

Un file magico è la descrizione di alcune euristiche per determinare il tipo di file. Risultati diversi possono essere causati da diversi file magici ma anche da diverse implementazioni del motore euristico.

Can I check beforehand if the system has a magic file that will result in correctly identifying a non-image or an image which contains PHP code?

Le varie funzioni magiche dei file sono progettate per rilevare il tipo di file solo osservando alcuni byte all'inizio. Non sono progettati per scoprire se il codice PHP è nascosto all'interno del file. Dovrebbe essere possibile creare un documento poliglotta che sia sia PHP valido sia un'immagine valida.

Il che significa che controllare il contenuto / mimo non è una validazione sufficiente.

If I can't, is there a better approach to check if an image file contains PHP code?

È meglio non controllare, ma invece per essere sicuri. Questo può essere fatto convertendo l'immagine in un formato diverso e denudando tutte le meta informazioni.

store uploaded files in non-executable directory outside the webroot

Questo è in realtà il modo migliore. Ma assicurati anche di non poter essere ingannato per includere il file in un altro script PHP, ad esempio Inclusione file locale .

    
risposta data 21.02.2016 - 21:54
fonte

Leggi altre domande sui tag