Nylig har vi skrevet om sikkerhet i webapplikasjoner når det gjelder XSS-sårbarhet. Denne gangen vil vi rette oppmerksomheten mot en annen fare.
Sårbarheten som diskuteres i denne artikkelen har vært kjent i lang tid, og på grunn av sin enkelhet er den ofte undervurdert eller til og med ukjent av noen utviklere av webapplikasjoner.
Nesten alle webapplikasjoner inneholder lenker som åpnes i en ny fane når man klikker på dem, slik at fanen med den opprinnelige siden ikke lukkes. Dette er en foretrukket oppførsel fordi skaperne ønsker at brukeren skal tilbringe så mye tid i applikasjonen som mulig.
Et angrep som utnytter denne sårbarheten, er såkalt "reverse tabnabbing". Det er et angrep der en side som er lenket fra målsiden, kan erstatte denne siden med for eksempel et phishing-nettsted.
Angrepsscenario
- Anta at offeret bruker Facebook, som er kjent for å åpne lenker via target="_blank",
- Opprett en falsk viral side,
- Lag et phishing-nettsted som ser ut som en påloggingsside på Facebook,
- Sett inn nedenstående kode på virussiden, f.eks. via funnet XSS-sårbarhet
window.opener.location = 'https://phishing-website/facebook.com';
- Offeret klikker på lenken på Facebook til den virale siden,
- Den virale siden omdirigerer Facebook-fanen til phishing-nettstedet og ber brukeren om å logge på igjen.
Vi kan altså endre den overordnede fanen fra den infiserte målsiden ved hjelp av et vindusobjekt fra Web API. Et angrep innebærer vanligvis at flere oppdagede sårbarheter og phishing-svindel brukes parallelt.
Problemet
Når vi åpner en ny fane i nettleseren ved hjelp av en lenke med target="_blank"
attributtet, har vi tilgang til "henviseren" vår fra den nye fanen. Mer spesifikt, til åpner
egenskapen til Vindu
objektet, som returnerer en referanse til vinduet som åpnet det, vår overordnede side.
Dette skyldes oppførselen til Window.open()
funksjon. Med tilgang til dette attributtet kan vi enkelt erstatte den overordnede siden. Merk at noen moderne nettlesere kan gjøre window.opener
funksjon i målfanen som null
for å forhindre denne oppførselen.
Eksempel på kode
<code> <a href="https://github.com" target="_blank">Gå til GitHub - infisert lenke</a>
konst if (lenke) link[0].onclick = () => { if (window) window.opener.location = 'https://stackoverflow.com' }
Ovenfor kan du se den infiserte lenken som opprinnelig åpner en ny fane med en GitHub-side, men i mellomtiden endrer den vår "overordnede" side til Stackoverflow-nettstedet.
Direkte eksempel
1. HTML-lenker
Legg til rel="noopener noreferrer"
til <a>
tag.
Den rel
attributtet definerer forholdet mellom en lenket ressurs og det aktuelle dokumentet.
noopener
forteller nettleseren at den skal navigere til målet uten å gi tilgang til den overordnede som åpnet det. Mål-fanen Window.opener
vil være null
.
noreferrer
forhindrer at nettleseren, når den navigerer til målet, sender adressen eller en hvilken som helst annen verdi som referrer til den overordnede via henviser
HTTP-overskrift. Merk at navnet på dette HTTP-overskriften med vilje er feilstavet som "referrer".
2. JavaScript lenker
For JavaScript Window.open
funksjon, kan du legge til verdiene noopener
og noreferrer
i windowFeatures
parameteren til Window.open
funksjon, men ulike nettlesere kan reagere ulikt, så det anbefales å lage Window.opener
som null
etter bruk av Window.open()
funksjon.
Les mer om dette:
Rails API og CORS. Et snev av bevissthet
Strategier for datahenting i NextJS
7 grunner til at nettbutikken din trenger Magento
Hvis du synes denne artikkelen er interessant, kan du følge Lukasz på Github: https://github.com/twistezo