caratteri jolly Bash: manipola il globbing per cancellare file arbitrari

1

Attualmente sto verificando un plug-in e ho la seguente situazione (semplificata ad esempio):

<?php

$post_id = false;
$absolute_path = "/var/www/html/wordpress/cache";
$extension = ".min.css";
$filename = $_GET['filename'];  // I have complete control over the $filename variable

$absolute_path = $absolute_path . "/{$post_id}/{$filename}-[0-9]*{$extension}";

$files = glob($absolute_path);

foreach($files as $file) {
    unlink($file);
}

?>

Il punto è che voglio sfruttare questa situazione per eliminare file arbitrari sul sistema, che potrebbero portare all'esecuzione di codice in modalità remota. Il problema è che controllo $filename , ma qualcosa verrà aggiunto in seguito.

glob() è una funzione in PHP che utilizza la corrispondenza dei modelli per trovare file e directory. glob utilizza i caratteri jolly del sistema.

Quando espandi la variabile $absolute_path , questo è il risultato:

/var/www/html/wordpress/cache//I-HAVE-CONTROL-OVER-THIS-PART-[0-9]*.min.css

Il mio obiettivo è ottenere il seguente risultato: avere glob() restituire il percorso a wp-config.php ( /var/www/html/wordpress/cache/../../wp-config.php )

Per ottenere ciò, dovrei in qualche modo ottenere glob per "ignorare" tutto ciò che viene dopo il controllo della parte I o qualche altro bypass. C'è un modo per fare questo?

Ho già provato il debug di glob() , ma non ne so più.

    
posta Simon Scannell 20.05.2018 - 14:33
fonte

1 risposta

2

Ho pensato alla possibilità che attaccare un byte NUL ( glob() ) al percorso causasse 7.0.27 per ignorare la parte dopo il NUL. Questo è esattamente il modo in cui le stringhe C funzionano e i nomi dei file vengono passati ad es. chiamate di sistema come stringhe C.

Ma ciò non sembra accadere: sul mio sistema (% PHP di Debian% co_de), sia glob() che unlink() richiedono una stringa senza NUL byte, e l'errore è fuori se ne date uno. E ogni altro carattere sarebbe valido nei nomi dei file, quindi glob() non avrebbe motivo di abbandonare il resto del percorso.

Il possibile problema con NUL è menzionato con un esempio nel manuale online, quindi è possibile che alcune versioni precedenti di PHP sarebbero state vulnerabili. Problemi relativi ai byte null :

As PHP uses the underlying C functions for filesystem related operations, it may handle null bytes in a quite unexpected way. As null bytes denote the end of a string in C, strings containing them won't be considered entirely but rather only until a null byte occurs.

    
risposta data 20.05.2018 - 17:07
fonte

Leggi altre domande sui tag