Et angreb på front-end-back-end-systemer, der giver os mulighed for at kile ind i tredjepartsanmodninger

Afsløret detaljer om et nyt angreb på websteder, der bruger en front-end-backend-model, såsom dem, der kører gennem indholdsleveringsnetværk, belastningsbalancere eller proxyer. Angrebet tillader, ved at sende visse anmodninger, at kile ind i indholdet af andre anmodninger, der behandles i samme tråd mellem frontend og backend. Den foreslåede metode blev med succes brugt til at organisere et angreb, der gjorde det muligt at opsnappe godkendelsesparametrene for brugere af PayPal-tjenesten, som betalte forskere omkring 40 tusind dollars som en del af et program for at informere om tilstedeværelsen af ​​uoprettede sårbarheder. Angrebet gælder også for websteder, der bruger Akamais indholdsleveringsnetværk.

Kernen i problemet er, at frontends og backends ofte giver forskellige niveauer af understøttelse af HTTP-protokollen, men samtidig indkapsler anmodninger fra forskellige brugere i en fælles kanal. For at forbinde frontend-modtagelsesanmodningerne og backend-behandlingsanmodningerne etableres en langvarig TCP-forbindelse, hvorigennem brugeranmodninger transmitteres, transmitteret langs kæden efter hinanden, adskilt ved hjælp af HTTP-protokollen. For at adskille anmodninger, overskrifterne "Indhold-Længde" (bestemmer den samlede størrelse af dataene i anmodningen) og "Overførsels-kodning: chunked"(giver dig mulighed for at overføre data i dele, angive blokke af forskellige størrelser i formatet "{størrelse}\r\n{blok}\r\n{størrelse}\r\n{blok}\r\n0").

Problemet opstår, hvis frontenden kun understøtter "Content-Length", men ignorerer "Transfer-Encoding: chunked" (for eksempel gjorde Akamai CDN dette) eller omvendt. Hvis Transfer-Encoding: chunked er understøttet på begge sider, kan implementeringsfunktionerne i HTTP-header-parsere bruges til et angreb (f.eks. når frontenden ignorerer linjer som "Transfer-Encoding: xchunked", "Transfer-Encoding: chunked" ”, “Transfer-Encoding” :[tab]chunked”, "X: X[\n]Transfer-Encoding: chunked", "Transfer-Encoding[\n]: chunked" eller "Transfer-Encoding: chunked", og backend behandler dem med succes).

I dette tilfælde kan en angriber sende en anmodning, der indeholder både "Content-Length" og "Transfer-Encoding: chunked" headers, men størrelsen i "Content-Length" svarer ikke til størrelsen af ​​den chunked kæde, hvilket er mindre end den faktiske værdi. Hvis frontenden behandler og videresender anmodningen i henhold til "Content-Length", og backend'en venter på, at blokeringen er fuldført baseret på "Transfer-Encoding: chunked", så vil slutningen af ​​data baseret på "Transfer-Encoding: chunked" bestemmes tidligere, og den resterende del af anmodningen vil angriberen være i begyndelsen af ​​den næste anmodning, dvs. angriberen vil være i stand til at vedhæfte vilkårlige data til begyndelsen af ​​en andens anmodning, der sendes næste gang.

Et angreb på front-end-back-end-systemer, der giver os mulighed for at kile ind i tredjepartsanmodninger

For at bestemme problemet i den brugte frontend-backend-kombination kan du sende en anmodning som denne via frontend:

POST /om HTTP/1.1
Vært: example.com
Overførsels-kodning: chunked
Content-Length: 4

1
Z
Q

Problemet er til stede, hvis backend ikke straks behandler anmodningen og venter på ankomsten af ​​den endelige nulgrænseblok af chunked data. For en mere komplet kontrol forberedt et særligt værktøj, der også tester mulige metoder til at skjule "Transfer-Encoding: chunked"-headeren fra frontend.

Udførelse af et rigtigt angreb afhænger af det angrebne websteds muligheder, for eksempel, når du angriber Trello-webapplikationen, kan du erstatte begyndelsen af ​​anmodningen (erstat data som "PUT /1/members/1234... x=x&csrf =1234&username=testzzz&bio=cake") og sende en besked, der inkluderer den oprindelige anmodning fra en tredjepartsbruger og den autentificeringscookie, der er angivet i den. For et angreb på saas-app.com viste det sig at være muligt at erstatte JavaScript-kode i svaret ved at erstatte den i en af ​​anmodningsparametrene. Til angrebet på redhat.com blev en intern handler brugt til at omdirigere til angriberens websted (en anmodning på formen "POST /search?dest=../assets/idx?redir=//[e-mail beskyttet]/ HTTP/1.1").

Brug af metoden til indholdsleveringsnetværk gjorde det muligt blot at erstatte det anmodede websted ved at erstatte "Host:"-headeren. Angrebet kan også bruges til at forgifte indholdet af indholdscachesystemer og udtrække cachelagrede fortrolige data. Metodens højdepunkt var organiseringen af ​​et angreb på PayPal, som gjorde det muligt at opsnappe adgangskoder sendt af brugere under godkendelse (iframe-anmodningen blev ændret til at udføre JavaScript i sammenhæng med paypal.com/us/gifts-siden, f.eks. hvilken CSP (Content Security Policy) ikke blev anvendt).

Interessant nok var der i 2005 foreslog en i det væsentlige lignende anmodningsspoofing-teknik, der giver dig mulighed for at forfalske data i caching-proxyer (Tomcat, squid, mod_proxy) eller omgå firewall-blokering ved at specificere flere "GET"- eller "POST"-anmodninger inden for en HTTP-session.

Kilde: opennet.ru

Tilføj en kommentar