2013-10-24 9 views
9

Apache Tomcat (almeno prima di Tomcat 6 vedere nota) tratta una barra con percentuale codificata (% 2F) in un percorso URI proprio come una barra regolare (vale a dire come un delimitatore di percorso).Perché Apache Tomcat gestisce le barre codificate (% 2F) come separatori di percorso?

Così ad es. Nella pagina servlet esempio di Tomcat è possibile accedere in

  • http://localhost:8080/examples/servlets/ e al
  • http://localhost:8080/examples%2Fservlets/

Questo non ha senso per me. L'intero punto di codifica percentuale di un carattere riservato come "/" è di evitare che venga trattato come un carattere riservato (in questo caso un delimitatore di percorso). Oltre a ciò, questo comportamento è (uno) causa della vulnerabilità CVE-2007-0450. Tuttavia, presumo ci deve essere stata una ragione per questo.

  • C'è qualche motivo tecnico per cui Tomcat tratta (ok, utilizzati per il trattamento)% 2F come delimitatore di percorso?

  • C'è qualche situazione in cui questo comportamento è stata utile?


Nota: mi rendo conto che il comportamento di default a causa di CVE-2007-0450 di Tomcat è stato cambiato a respingere barre per cento con codifica nel percorso. Tuttavia, se questo controllo è disabilitato (ALLOW_ENCODED_SLASH), il vecchio comportamento rimane.

risposta

8

è stato collegato con quando Tomcat era dietro un proxy inverso httpd. In alcune circostanze, l'URI era parzialmente codificato, quindi la gestione% 2F era necessaria per annullare quella codifica.

Si creerà un certo numero di problemi di sicurezza che sono stati fissati intorno allo stesso tempo CVE-2007-0450 è stato fissato. Per lo sfondo, guardare le opzioni ForwardURIxxx nella documentazione mod_jk: http://tomcat.apache.org/connectors-doc/reference/apache.html che copre alcuni casi in cui si potrebbe desiderare ancora questa funzione (ma a causa dei possibili problemi di sicurezza che avevo evitarlo se possibile).

Il comportamento predefinito è ora HTTPD per passare l'URI Tomcat invariata e per Tomcat di caratteri codificati trattati come esattamente questo.

+0

Mark, c'è un modo per dire Tomcat * non * treat% 2F come un separatore di percorso? Mi rendo conto che rifiuta la richiesta interamente a meno che non sia impostato il prop citato qui, ma dopo voglio che ".../foo% 2Fbar/..." sia trattato come un elemento di percorso con valore "foo/bar", e non come se fosse ".../foo/bar/..." –

+0

Ho paura di no. La decodifica% si verifica abbastanza presto e una volta decodificata, Tomcat non è in grado di distinguere tra un originale/e una volta decodificato da% 2F. Potresti essere in grado di utilizzare la doppia codifica, ad esempio% 252F, ma non la consiglierei in quanto è il tipo di cosa che ha causato problemi di sicurezza in passato. –

+2

Ho eseguito alcuni test con Tomcat 7 e ho rilevato che non accetta% 2F nel percorso dell'URL: restituisce il codice di stato HTTP 400 "Richiesta non valida". Se passo% 2F in un parametro funziona perfettamente. Se uso% 2C nell'URI viene convertito in "," quindi Tomcat gestisce veramente% 2F in un modo speciale. –