Ci sono sequenze diverse da ../ che saranno interpretate come directory traversal in * nix o Windows?

9

Una vulnerabilità comune è che le applicazioni Web accettino un percorso del file system come parametro di richiesta e quindi eseguano alcune azioni sul percorso specificato. Ad esempio, il recupero di un file e il suo invio all'utente, o forse anche la scrittura / eliminazione di un file. Questo può consentire agli utenti malintenzionati di accedere a file a cui non dovrebbero essere in grado di accedere, come codice sorgente, file password, ecc.

Questo può essere un problema anche se si antepone un percorso di base, poiché un utente malintenzionato può utilizzare sequenze di attraversamento di directory come ../ (* nix) e ..\ (Windows) per attraversare il percorso di base e limitarsi a directory e file.

L'idea generale, quindi, è quella di escludere a titolo definitivo tali sequenze di attraversamento, o di "normalizzare" i percorsi contenenti questi sequenze e quindi verificare che siano ancora all'interno del percorso di base.

Da quanto ho capito, cercare di inserire nella blacklist sequenze trasversali nel parametro request è difficile, perché esistono codifiche URL e Unicode alternative (ad esempio %2e%2e%2f e molti , molti altri) che potrebbero finire per essere interpretati dal web server come ../ o ..\ .

Tuttavia, le codifiche alternative sono ancora un problema se normalizziamo il percorso dopo che è stato ricevuto dal server web (ad es. Apache) e passato alla mia applicazione? Ad esempio, utilizzando queste regole di normalizzazione ?

Il mio ragionamento è che, se il web server riceve %2e%2e%2f e lo decodifica a ../ , o il web server riceve direttamente ../ , l'algoritmo di normalizzazione vedrà ../ e lo risolverà / filtrerà prima di verificare contro la directory di base. Anche se un utente malintenzionato utilizza una doppia codifica come %252e%252e%252f , verrà decodificato come %2e%2e%2f , che verrà trattato letteralmente dal sistema operativo / file system.

Tuttavia, in questa domanda , suggerisce che :

However, if a web server is serving files and decoding the unicode is done after the check that prevents directory traversal or done slightly differently by the operating system, this attack may get past the filter allowing the attack to work.

Quindi, in altre parole, ci sono sequenze di caratteri noti che potrebbero superare la decodifica del server Web E la routine di normalizzazione summenzionata (che gestisce ../ o ..\ ), che potrebbe essere interpretata dal sistema operativo o inferiore -leveloce gestione dei file funziona come directory traversal?

Ad esempio, in PHP:

$base = "/path/to/allowed/directory/";
$path = $_GET['path'];

$normalizedPath = normalize($path);   // normalize will remove or resolve ../ and ..\
$fullPath = $base . $normalizedPath;

echo file_get_contents($fullPath);
    
posta alexw 25.04.2016 - 20:54
fonte

2 risposte

6

Su Windows e Unix - no . Potrebbero esserci sistemi operativi oscuri che utilizzano separatori di percorso diversi.

Per gestire la codifica in modo sicuro, esiste una semplice regola: decodificare completamente prima di eseguire la sanificazione . Se non lo fai, la sanitizzazione può essere aggirata. Immagina un'applicazione che fa open(urldecode(normalize(path))) . Se il percorso contiene ../ , normalizza con rimuoverlo. Ma se contiene %2e%2e%2f , normalize non farà nulla e urldecode lo convertirà in ../ . Questo errore ha portato a numerose vulnerabilità del mondo reale, tra cui il ben noto bug Unicode IIS .

Un altro problema che a volte viene visualizzato è sequenze nidificate . Supponiamo che la tua funzione di normalizzazione faccia path.replaceAll('../', '') . Questo può essere aggirato provando ....// - la% interna di../ viene rimossa, lasciando ../ . La soluzione consiste nel rifiutare completamente le stringhe contenenti sequenze vietate o applicare in modo ricorsivo la funzione di normalizzazione.

Ci sono altri personaggi che possono avere risultati sorprendenti nei percorsi. Un byte null è generalmente consentito all'interno di stringhe in linguaggi di alto livello, ma quando questo viene passato alla libreria C, la stringa nulla è un terminatore. I nomi di file come evil.php%00.jpg possono ignorare i controlli dell'estensione dei file. C'era anche il bug semi-colon di IIS .

In generale, i nomi dei file non sono un buon posto per dati non fidati. Esiste il potenziale per gli attacchi di secondo ordine, in cui altri processi che leggono l'elenco delle directory presentano vulnerabilità. Potrebbe esserci uno scripting cross-site in una pagina web che elenca i file; ci sono state vulnerabilità di Windows Explorer che i nomi di file malevoli possono sfruttare; e attaccare una shell Unix attraverso le sequenze di escape è una preoccupazione recente. Invece, consiglio di memorizzare il nome del file fornito dall'utente in un database e di avere il nome del file come chiave primaria.

    
risposta data 26.04.2016 - 09:02
fonte
6

Utilizzando Unicode, è possibile codificare \ e / in caratteri multi-byte. Se le funzioni di confronto delle stringhe non sono sensibili all'unicode, potrebbe esserci un bug che consente a questi caratteri di passare attraverso.

Wikipedia ha una sezione su questo in relazione a un vecchio attacco sui server Windows:

When Microsoft added Unicode support to their Web server, a new way of encoding ../ was introduced into their code, causing their attempts at directory traversal prevention to be circumvented.

Multiple percent encodings, such as

  • %c1%1c
  • %c0%af

translated into / or \ characters.

Tecnicamente questo è ancora utilizzando il carattere slash quando si tratta della directory traversal, non è solo il vero carattere single-byte che può confondere un po 'di codice.

Credo che il miglior consiglio per evitare tali caratteri sarebbe quello di disabilitare qualsiasi carattere per i percorsi del file system eccetto un sottoinsieme sicuro di caratteri ASCII. Puoi anche sottrarre altri problemi relativi ai caratteri consentiti in alcuni sistemi operativi e file system contemporaneamente.

    
risposta data 25.04.2016 - 21:50
fonte