Il nocciolo del problema è che frontend e backend spesso forniscono diversi livelli di supporto per il protocollo HTTP, ma allo stesso tempo incapsulano le richieste di utenti diversi in un canale comune. Per connettere il frontend che riceve le richieste e il backend che elabora le richieste, viene stabilita una connessione TCP di lunga durata, attraverso la quale vengono trasmesse le richieste degli utenti, trasmesse lungo la catena una dopo l'altra, separate mediante il protocollo HTTP. Per separare le richieste, le intestazioni "Content-Length" (determina la dimensione totale dei dati nella richiesta) e "
Il problema sorge se il frontend supporta solo “Content-Length” ma ignora “Transfer-Encoding: Chunked” (ad esempio, Akamai CDN lo ha fatto) o viceversa. Se Transfer-Encoding: Chunked è supportato su entrambi i lati, le funzionalità di implementazione dei parser di intestazione HTTP possono essere utilizzate per un attacco (ad esempio, quando il front-end ignora righe come "Transfer-Encoding: xchunked", "Transfer-Encoding: Chunked" ”, “Codifica di trasferimento” :[tab]chunked", "X: X[\n]Codifica di trasferimento: Chunked", "Codifica di trasferimento[\n]: Chunked" o "Codifica di trasferimento: Chunked" e il backend li elabora con successo).
In questo caso, un utente malintenzionato può inviare una richiesta che contiene entrambe le intestazioni "Content-Length" e "Transfer-Encoding: Chunked", ma la dimensione in "Content-Length" non corrisponde alla dimensione della catena in blocchi, che è inferiore al valore reale. Se il frontend elabora e inoltra la richiesta in base a "Content-Length" e il backend attende il completamento del blocco in base a "Transfer-Encoding: Chunked", la fine dei dati in base a "Transfer-Encoding: Chunked" verrà essere determinato in precedenza e la coda rimanente della richiesta dell'aggressore si troverà all'inizio della richiesta successiva, ad es. l'aggressore potrà allegare dati arbitrari all'inizio della richiesta di qualcun altro trasmessa successivamente.
Per determinare il problema nella combinazione frontend-backend utilizzata, puoi inviare una richiesta come questa tramite il frontend:
POST /su HTTP/1.1
Host: esempio.com
Transfer-Encoding: chunked
Content-Length: 4
1
Z
Q
Il problema è presente se il backend non elabora immediatamente la richiesta e attende l'arrivo del blocco finale di dati in blocchi con limite zero. Per un controllo più completo
L'esecuzione di un vero attacco dipende dalle capacità del sito attaccato, ad esempio, quando si attacca l'applicazione web Trello, è possibile sostituire l'inizio della richiesta (sostituire dati come “PUT /1/members/1234... x=x&csrf =1234&username=testzzz&bio=cake”) e inviare un messaggio contenente la richiesta originaria di un utente terzo e il Cookie di autenticazione in esso specificato. In caso di attacco a saas-app.com è stato possibile sostituire il codice JavaScript nella risposta sostituendolo in uno dei parametri della richiesta. Per l’attacco a redhat.com è stato utilizzato un gestore interno per reindirizzare al sito web dell’aggressore (una richiesta nel formato “POST /search?dest=../assets/idx?redir=//[email protected]/HTTP/1.1").
Utilizzando il metodo per le reti di distribuzione dei contenuti è stato possibile sostituire semplicemente il sito richiesto sostituendo l'intestazione "Host:". L'attacco può essere utilizzato anche per avvelenare il contenuto dei sistemi di caching dei contenuti ed estrarre dati riservati memorizzati nella cache. L'apice del metodo è stata l'organizzazione di un attacco a PayPal, che ha permesso di intercettare le password inviate dagli utenti durante l'autenticazione (la richiesta iframe è stata modificata per eseguire JavaScript nel contesto della pagina paypal.com/us/gifts, per quale CSP (Content Security Policy) non è stata applicata).
È interessante notare che nel 2005 c'era
Fonte: opennet.ru