Consentire il caricamento di file arbitrari può comportare l’esecuzione di codice PHP malevolo o attacchi Cross-Site Scripting (ad esempio tramite file SVG).
WordPress fornisce le funzioni wp_check_filetype() e wp_check_filetype_and_ext()per aiutare gli sviluppatori di plugin e temi WordPress a proteggere il caricamento dei file.
Inoltre, gli sviluppatori possono sfruttare il filtro upload_mimes per modificare l’array globale di WordPress dei tipi MIME consentiti, che possono essere recuperati utilizzando la funzione get_allowed_mime_types().
Infine, la funzione wp_handle_upload() gestisce l’intero processo di caricamento del file, inclusa la sanificazione dei nomi dei file, la verifica del tipo MIME (tranne quando l’override test_type è impostato a false) e lo spostamento del file nella directory appropriata all’interno della directory di caricamento.
wp_check_filetype()
La funzione wp_check_filetype() restituirà l’estensione del file (stringa) o false se il tipo MIME non è consentito.
$filetype = wp_check_filetype( $_FILES['file']['name'] );
if ( ! $filetype['ext'] ) {
wp_die( 'Invalid file type.' );
}wp_check_filetype_and_ext()
La funzione wp_check_filetype_and_ext() controlla il contenuto effettivo del file (tramite tmp_name) utilizzando la funzione PHP finfo_file() e l’estensione del file (tramite name ) rispetto a get_allowed_mime_types().
$checked = wp_check_filetype_and_ext(
$_FILES['file']['tmp_name'], // Actual file contents on disk (temporary location)
$_FILES['file']['name'] // Original filename (for extension checking)
);
if ( ! $checked['ext'] ) {
wp_die( 'Invalid file type.' );
}Trovare vulnerabilità nel caricamento dei file
L’omissione di queste funzioni in presenza di una funzionalità di caricamento file è un buon indicatore della possibile presenza di una vulnerabilità di caricamento file arbitrario.
Gli sviluppatori spesso sviluppano autonomamente la propria funzionalità di caricamento file e, con essa, la propria convalida (se presente).
In molti casi, queste convalide potrebbero essere imperfette e aggirabili.
Fare riferimento alla sezione “Funzioni correlate alle vulnerabilità di caricamento file” nell’Appendice per visualizzare i sink relativi al caricamento arbitrario di file.
Attraversamenti di percorsi e inclusioni di file
WordPress non fornisce funzioni specializzate esclusivamente per prevenire vulnerabilità di attraversamento dei percorsi o di inclusione dei file.
Questi attacchi vengono solitamente mitigati attraverso un’adeguata sanificazione dei nomi dei file e dei percorsi forniti dall’utente.
La funzione più importante in questo contesto è sanitize_file_name(), che garantisce che i nomi file forniti dall’utente vengano rimossi da caratteri pericolosi e sequenze di attraversamento del percorso.
Inoltre, la funzione basename() può essere utilizzata per rimuovere i percorsi delle directory da un nome file.
Individuazione delle vulnerabilità di attraversamento del percorso e inclusione dei file
I ricercatori dovrebbero cercare quanto segue:
- L’input dell’utente viene passato direttamente alle funzioni sink del file system (ad esempio,
include(),require(),fopen(),file_get_contents(), ecc.) senza sanificazione. - Utilizzo di
$_GET['file']superglobali o simili per creare percorsi di file. - Mancanza o uso improprio di
sanitize_file_name(). - Inclusioni dinamiche o accesso ai file che si basano su percorsi forniti dall’utente.
- Manca l’utilizzo di
basename()quando l’applicazione si aspetta solo un nome file ma lo concatena in un percorso file.
// Vulnerable
$file = $_GET['file'];
include( ABSPATH . '/themes/mytheme/templates/' . $file );
// Safe
$file = sanitize_file_name( $_GET['file'] );
$path = ABSPATH . '/themes/mytheme/templates/' . $file;
if ( file_exists( $path ) ) {
include( $path );
}
Lascia un commento
Devi essere connesso per inviare un commento.