Rischi per la sicurezza di ospitare immagini fornite dall'utente?

2

Ho un programma che accetterà e recupererà le immagini dagli URL. Verificherà se l'estensione è .png, .jpg, ecc ...

Prenderò questi file e li conserverò, verranno mostrati agli utenti in una galleria (come Imgur e TinyPic ). Non posso fidarmi che questi file siano immagini.

  • Come posso verificare che quelle immagini siano effettivamente immagini e non, per esempio, uno script di shell php?
  • Se faccio questo, avrò altri rischi per la sicurezza?

So che esiste un numero magico per i file, quindi come potrei verificarlo? (il linguaggio sarebbe python).

    
posta Lucas Kauffman 11.07.2012 - 21:42
fonte

4 risposte

3

Un'immagine potrebbe ancora essere un'immagine valida e contenere ancora materiale dannoso come commenti incorporati o altri (non definiti) vettori di attacco. Uno, anche se vecchio, esempio era la vulnerabilità JPEG GDI in Windows a partire dal 2004.

Penso che la tua preoccupazione principale sia garantire che il tuo meccanismo di accettazione delle immagini sia semplice e stretto. Ti consigliamo di controllare gli errori di autorizzazione dei file, l'esaurimento delle risorse (esaurimento dello spazio, il vincolamento delle risorse di rete, ecc.) E gli attacchi ai percorsi (ad esempio, potenzialmente sovrascrittura dei file).

Inoltre, assicurati che tutti i controlli di gestione delle stringhe siano definiti in modo rigoroso e preciso. C'è stata una domanda recente su sec.SE riguardante l'attacco del codice di caricamento ASP che utilizzava un meccanismo di ricerca delle stringhe meno rigoroso .

Infine, cerca su questo sito il termine "upload". Alcuni buoni esempi che possono darti un'immagine chiara (no pun intended!) Di tutte le sfide che potresti affrontare:

risposta data 11.07.2012 - 22:42
fonte
3

Sono d'accordo che è difficile proteggersi da un attacco quando inviti potenziali aggressori con un modo per caricare file sul tuo server. Il miglior consiglio che posso dare è quello di utilizzare più approcci per proteggere i contenuti caricati.

Assicurati che il nome file che viene inviato sia sterilizzato. Ad esempio, non vuoi che qualcuno invii "/../../index.html" come nome file e sovrascrivi la tua pagina indice.

I nomi dei file dovrebbero anche essere controllati per un tipo mime valido e un'estensione (.jpg, .gif), tuttavia vale anche la pena di indagare se la tua lingua di scelta presenta potenziali vulnerabilità quando si tratta di nomi di file, ad esempio quando si ha a che fare con PHP a volte è possibile passare un byte null che può bypassare le restrizioni di estensione.

Scegliendo un nome file personalizzato per i contenuti caricati, puoi mitigare molto il rischio di nomi di file dannosi. Quindi se accetti un tipo mime di 'image / jpeg', scrivi questo in un file con un nome file di '[RANDOMSTRING] .jpg'.

Come commentato da woliveirajr, il controllo dei byte magici può anche essere una buona idea, tuttavia non ci sarebbe nulla da impedire a qualcuno di caricare uno script di backdoor php contenente pochi byte magici e quindi procedere con <% php code.

Una volta che sei felice di aver protetto lo script di caricamento, controlla se il tuo server web ha un'opzione di configurazione per disabilitare l'esecuzione di script nella tua directory di destinazione (come IIS esegue le autorizzazioni ). Ciò significa che anche se qualcuno è in grado di ignorare la tua whitelist di caricamento, troverà difficile avere uno script da eseguire sul tuo server.

Tieni presente anche gli attacchi non direttamente correlati all'esecuzione del codice sul tuo server. Ho visto innumerevoli volte che i caricamenti di file sono protetti contro l'esecuzione lato server, tuttavia il caricamento di un nome file di "....." provoca un attacco XSS.

Questo non è affatto un elenco esauriente, ma spero che ti fornisca alcune idee sulle diverse aree da proteggere.

    
risposta data 12.07.2012 - 00:01
fonte
1

Caricamento della sicurezza:

  1. Codice di sicurezza:

    • Dovresti verificare l'estensione usando white-list (.jpg, .png, .doc ...). Non utilizzare black-list (.php, .aspx ...)
    • Non fidarti del tipo mime, che viene inviato dall'utente.
    • Evita nomi di file dannosi cambiando il nome in un nuovo nome casuale, ad esempio: Nuovo nome file = prefisso_MD5 (nome file). Estensione
    • Ridimensiona tutte le immagini.
  2. Server di configurazione:

    • Disattiva l'esecuzione degli script nella directory di destinazione
    • Imposta la directory di caricamento fuori dalla directory del sito web, ad esempio: Percorso root del sito web: / home / utente / public_html / upload directory: / home / utente / upload_dir / Pertanto, l'hacker non può accedere direttamente al file caricato malevolo.
risposta data 12.07.2012 - 04:46
fonte

Leggi altre domande sui tag