Sfruttamento del mancante check_uploaded_file?

4

La documentazione PHP per is_uploaded_file dice:

Returns TRUE if the file named by filename was uploaded via HTTP POST. This is useful to help ensure that a malicious user hasn't tried to trick the script into working on files upon which it should not be working--for instance, /etc/passwd.

Suggerisce anche questo:

For proper working, the function is_uploaded_file() needs an argument like $_FILES['userfile']['tmp_name'], - the name of the uploaded file on the client's machine $_FILES['userfile']['name'] does not work.

Ma per quanto ne so, tmp_name non è comunque controllato dall'utente, quindi il controllo non dovrebbe essere richiesto.

E se utilizzo name invece di tmp_name durante il caricamento di file (ad esempio utilizzando copy anziché move_uploaded_file ), il mio script di caricamento file non funzionerebbe in realtà, in quanto sposterebbe sempre la parte sbagliata file.

Le mie domande:

  • I commenti menzionano che move_uploaded_file esegue la verifica di is_uploaded_file , vero?
  • È tmp_name controllato dall'utente in qualche modo?
  • Esiste uno scenario realistico in cui is_uploaded_file è effettivamente richiesto quando si carica un file - o quando si esegue qualsiasi altra azione come la lettura, l'eliminazione, ecc., in quanto vi sarebbe una vulnerabilità senza di essa? O la funzione è completamente inutile?
posta tim 20.08.2016 - 13:47
fonte

1 risposta

3

Per rispondere alle tue domande:

The comments mention that move_uploaded_file performs the is_uploaded_file check itself, it that true?

Lo fa. Puoi consultare il codice sorgente di move_uploaded_file () che i controlli eseguiti sono (quasi) uguali a quelli eseguiti in is_uploaded_file () metodo.

Is tmp_name user controlled in any way?

No, l'utente non può controllare questo valore. È assegnato dall'interprete ed è casuale ogni volta. Anche se carichi lo stesso identico file più di una volta, avrà sempre una percentuale diversa ditmp_name.

Is there a realistic scenario where is_uploaded_file is actually required when uploading a file - or when performing any other action such as reading, deleting, etc. - , as there would be a vulnerability without it? Or is the function completely useless?

Come sviluppatore PHP, personalmente non l'ho mai usato. Dal momento che è già incorporato nel metodo move_uploaded_file() . Non ho mai incontrato uno scenario in cui volevo caricare un file, ma non sono stato spostato in un percorso a mia scelta e rimanere solo da qualche parte nella directory di caricamento temporanea con un nome casuale. Immagino che potresti usarlo se vuoi solo visualizzare il contenuto del file caricato, ma non tenerlo memorizzato sul tuo server, come esempio # 1 nei documenti suggerisce. Uno scenario che mi viene in mente è se dovessi eseguire un servizio pastebin con funzionalità di caricamento o simili. Puoi consentire il caricamento del file, leggerne il contenuto dalla directory temp, utilizzarlo come input per la textarea e quindi rimuovere immediatamente il file dalla sua posizione temporanea (o far eseguire periodicamente un cronjob di pulizia).

    
risposta data 23.08.2016 - 10:22
fonte

Leggi altre domande sui tag