Caricamento in block di immagini eseguibili (PHP)

Ho notato che un utente sta tentando di creare un exploit tramite i caricamenti di immagini avatar. Ciò è stato scoperto quando un utente mi ha segnalato che stava ricevendo un avviso dal suo Norton Anti-virus che recitava "Download image eseguibile sospetto HTTP". Questo avvertimento faceva riferimento all'image dell'avatar dell'utente. Non penso che abbiano effettivamente ottenuto nulla nel modo di rubare informazioni o qualcosa del genere, ma presumo che potrebbe essere ansible se il buco viene lasciato aperto abbastanza a lungo. Uso PHP per caricare i file image e controllo se il file che viene caricato è un png, jpg, bmp o gif.

Questo è il codice che controlla se si tratta di un'image:

$allow_types = arrays('image/jpeg', 'image/png', 'image/gif', 'image/jpg', 'image/png', 'image/bmp', 'image/bitmap'); if (in_arrays($this->tmp_image['type'], $this->allow_types)) { return true; } 

Non c'è modo di impedire il caricamento di file dannosi. Quello che ti interessa invece è come gestisci questi file.

Suggerimenti come il ri-salvataggio del file image sono condannati. È ansible ignorare tale manipolazione ordinando i bit in modo che siano nell'ordine che l'hacker desidera dopo che è stato eseguito un compressore di immagini noto.

Ci sono tanti modi per combinare immagini e file dannosi. Un file dannoso potrebbe essere un eseguibile o contenere solo JavaScript interpretato da un browser. Inoltre, come si dovrebbe salvare nuovamente i file che non sono un tipo di image?

Quando si gestiscono i caricamenti di file, è necessario occuparsi di quanto segue.

  • Limita la quantità di byte da caricare per utente in modo che il tuo server non esaurisca lo spazio.

  • Limita la quantità di file da caricare per utente in modo che il tuo server non esaurisca gli inode.

  • Archiviare i file sopra la radice del documento in modo che non siano direttamente accessibili.

  • Servi i tuoi file tramite uno script proxy PHP, scrivi qualcosa come:

     $data = file_get_contents('/home/account/files/file.png'); header('Content-Type: image/png'); header('Content-Length: '. strlen($data)); header('X-Content-Type-Options: nosniff'); echo $data; 
  • Rinomina i file caricati per avere un nome completamente random senza un'estensione. Se è necessario memorizzare il nome file (e l'estensione / tipo), memorizzare i dettagli nel database.

  • Se necessario, serve i file solo quando l'utente ha il permesso di averlo.

  • Non includere / eseguire mai i file che hai caricato. Ciò significa non includere o richiedere in PHP. Nessun tag di script HTML o tag del foglio di stile compresi. Nessun command Apache Include compresi. E così via.

  • Se ansible, servi i file di altra origine. Questo elimina i problemi di origine che si verificano principalmente con Flash. Anche usare una port diversa, un nome di dominio o un indirizzo IP va bene. L'offerta da sottodomini è pericolosa e con gli indirizzi IP l'implementazione diventa leggermente più difficile (ovvero, non è ansible pubblicare file tramite il dominio, solo tramite IP e non è ansible servire il sito tramite IP, ma tramite il dominio).

  • Attenzione a LFI e RFI. Rinominare i nomi dei file prima di utilizzare il nome del file all'interno di funzioni come fopen() , read() , ecc. E validationre / disinfettare qualsiasi valore di directory secondo necessità.

La soluzione più semplice consiste nel re-campionare l'image. Ottieni una semplice lib di manipolazione delle immagini (GD) e carica nuovamente l'image, dovrebbe rimuovere efficacemente qualsiasi contenuto eseguibile o semplicemente fallire se l'image è solo un exe rinominato.

usa imagecreatefromjpeg (e altri imagecreatefrom *) per verificare che i dati passati siano reali. exe non passerà.

Penso che l'approccio migliore sarebbe quello di verificare che il file sia un'image in upload. se non lo è, allora errore l'utente, proprio come faresti con qualsiasi altro dato di input non validato

vedi questo link http://www.bitrepository.com/how-to-validate-an-image-upload.html