Ongelman ydin on, että käyttöliittymät ja taustajärjestelmät tarjoavat usein eri tasoisen tuen HTTP-protokollalle, mutta samalla kapseloivat eri käyttäjien pyynnöt yhteiseen kanavaan. Etupään vastaanottopyyntöjen ja taustaprosessointipyyntöjen yhdistämiseksi muodostetaan pitkäikäinen TCP-yhteys, jonka kautta käyttäjäpyynnöt välitetään, välitetään ketjua pitkin peräkkäin HTTP-protokollan avulla erotettuina. Pyyntöjen erottamiseksi otsikot "Content-Length" (määrittää pyynnön tietojen kokonaiskoon) ja "
Ongelma ilmenee, jos käyttöliittymä tukee vain "Content-Length" -toimintoa, mutta jättää huomiotta "Transfer-Encoding: chunked" (esimerkiksi Akamai CDN teki tämän) tai päinvastoin. Jos Transfer-Encoding: chunked on tuettu molemmilta puolilta, HTTP-otsikon jäsentimien toteutusominaisuuksia voidaan käyttää hyökkäykseen (esimerkiksi kun käyttöliittymä jättää huomioimatta rivit, kuten "Transfer-Encoding: xchunked", "Transfer-Encoding: chunked" ”, "Transfer-Coding" :[tab]chunked", "X: X[\n]Transfer-Coding: chunked", "Transfer-Coding[\n]: chunked" tai "Transfer-Encoding : chunked" ja taustaohjelma käsittelee ne onnistuneesti).
Tässä tapauksessa hyökkääjä voi lähettää pyynnön, joka sisältää sekä "Content-Length"- että "Transfer-Encoding: chunked"-otsikot, mutta "Content-Length"-kohdassa oleva koko ei vastaa paloitetun ketjun kokoa. on pienempi kuin todellinen arvo. Jos käyttöliittymä käsittelee ja välittää pyynnön "Content-Length" -määritelmän mukaisesti ja backend odottaa lohkon valmistumista "Transfer-Encoding: chunked" perusteella, "Transfer-Encoding: chunked" -perusteisen datan loppu tulee määritetään aikaisemmin ja pyynnön loppuosa hyökkääjä on seuraavan pyynnön alussa, ts. hyökkääjä voi liittää mielivaltaisia tietoja jonkun toisen seuraavaksi lähetettävän pyynnön alkuun.
Voit määrittää ongelman käytetyssä käyttöliittymän ja taustan yhdistelmässä lähettämällä seuraavanlaisen pyynnön käyttöliittymän kautta:
POST /about HTTP/1.1
Isäntä: example.com
Siirtokoodaus: paloiteltu
Content-Length: 4
1
Z
Q
Ongelma ilmenee, jos taustajärjestelmä ei käsittele pyyntöä välittömästi ja odottaa viimeisen nollarajauslohkon saapumista. Tarkempaa tarkistusta varten
Todellisen hyökkäyksen toteuttaminen riippuu hyökkäyksen kohteena olevan sivuston ominaisuuksista, esimerkiksi Trello-verkkosovellusta vastaan hyökätessäsi voit korvata pyynnön alun (korvaa data, kuten “PUT /1/members/1234... x=x&csrf =1234&käyttäjänimi=testzzz&bio=cake”) ja lähetä viesti, joka sisältää kolmannen osapuolen käyttäjän alkuperäisen pyynnön ja siinä määritellyn todennusevästeen. Saas-app.com-sivuston hyökkäyksessä osoittautui mahdolliseksi korvata JavaScript-koodi korvaamalla se yhdessä pyyntöparametreista. Redhat.com-hyökkäystä varten sisäistä käsittelijää käytettiin ohjaamaan hyökkääjän verkkosivustolle (pyyntö muodossa "POST /search?dest=../assets/idx?redir=//[sähköposti suojattu]/ HTTP/1.1").
Sisällönjakeluverkkojen menetelmän käyttö mahdollisti yksinkertaisesti pyydetyn sivuston korvaamisen korvaamalla "Host:"-otsikon. Hyökkäystä voidaan käyttää myös sisällön välimuistijärjestelmien sisällön myrkytykseen ja välimuistissa olevien luottamuksellisten tietojen poimimiseen. Menetelmän huippu oli PayPaliin kohdistuvan hyökkäyksen järjestäminen, joka mahdollisti käyttäjien todennuksen aikana lähettämien salasanojen sieppaamisen (iframe-pyyntöä muutettiin suorittamaan JavaScriptiä paypal.com/us/gifts-sivun yhteydessä, jota CSP:tä (Content Security Policy) ei sovellettu).
Mielenkiintoista, että vuonna 2005 oli
Lähde: opennet.ru