Interneto programų saugumas. Target=”_blank” pažeidžiamumas
Lukasz Kolko
Naudotis žiniatinklio programomis tapo įprasta kiekvienai visuomenei. Su jomis susiduriame kiekvieną dieną. Galima sakyti, kad jos mus supa. Naudojame jas darbe, pramogai ir kaip bendravimo su kitais asmenimis priemones. Dažnai kaip naudotojai ir kūrėjai nesuvokiame, kiek daug saugumo spragų kasdien aptinkama tokiose programose.
Šiame straipsnyje aptariamas pažeidžiamumas buvo su mus ilgą laiką ir dėl savo paprastumo dažnai nepakankamai įvertintas ar net nežinomas. žiniatinklio programų kūrėjai.
Beveik kiekvienas žiniatinklio svetainė programėlėje yra nuorodų, kurias spustelėjus atidaromas naujas skirtukas, kad nebūtų uždarytas skirtukas su pradiniu puslapiu. Tai pageidautinas elgesys, nes kūrėjai nori, kad naudotojas praleistų kuo daugiau laiko programoje.
Atakos, kuriomis pasinaudojama šia spraga, yra vadinamasis “atvirkštinis tabnabingas”. Tai ataka, kai iš tikslinio puslapio susietas puslapis gali pakeisti tą puslapį, pavyzdžiui, sukčiavimo svetaine.
Puolimo scenarijus
Tarkime, auka naudojasi ”Facebook”, kuris yra žinomas dėl nuorodų atidarymo per target="_blank",
Sukurkite netikrą virusinį puslapį,
Sukurkite apgaulingą svetainę, kuri atrodo kaip "Facebook" prisijungimo puslapis,
Įdėkite toliau nurodytą kodas virusiniame puslapyje, pvz., per rastą XSS pažeidžiamumą. window.opener.location = 'https://phishing-website/facebook.com';
Nukentėjusysis "Facebook" spusteli nuorodą į virusinį puslapį,
Virusiniame puslapyje "Facebook" skirtukas nukreipiamas į sukčiavimo svetainę, kurioje naudotojo prašoma dar kartą prisijungti.
Taigi, mes galime pakeisti pagrindinį skirtuką iš užkrėsto tikslinio puslapio lango objektu iš Web API. Paprastai atakos metu lygiagrečiai naudojamos kelios aptiktos pažeidžiamosios vietos ir sukčiavimo apgaulės.
Problema
Kai naršyklėje atidarome naują skirtuką naudodami nuorodą su target="_blank" atributą, turime prieigą prie savo “referrer” iš naujo skirtuko. Tiksliau, prie atidarymo įrenginys savybė Langas objektą, kuris grąžina nuorodą į jį atvėrusį langą, t. y. mūsų pagrindinį puslapį.
Taip yra dėl to, kad Window.open() funkcija. Turėdami prieigą prie šio atributo, galime lengvai pakeisti pagrindinį puslapį. Atkreipkite dėmesį, kad kai kurios šiuolaikinės naršyklės gali window.opener funkcija tiksliniame skirtuke kaip null užkirsti kelią tokiam elgesiui.
Kodo pavyzdys
<code> <a href="https://github.com" target="_blank">Eiti į "GitHub" - užkrėsta nuoroda</a>const
if (nuoroda)
link[0].onclick = () => {
if (window) window.opener.location = 'https://stackoverflow.com'
}
Viršuje matote užkrėstą nuorodą, kuri iš pradžių atveria naują skirtuką su “GitHub” puslapiu, bet tuo tarpu pakeičia mūsų "motininį" puslapį į "Stackoverflow" svetainę.
Tiesioginis pavyzdys
1. HTML nuorodos
Pridėti rel="noopener noreferrer" į <a> žyma.
Svetainė rel atributas apibrėžia susieto ištekliaus ir dabartinio dokumento ryšį.
noopener nurodo naršyklei pereiti prie tikslo, nesuteikiant prieigos prie jį atidariusio pagrindinio kompiuterio. Tikslinis skirtukas Window.opener bus null.
noreferrer neleidžia naršyklei, kai naršoma į tikslą, siųsti tėvui adresą ar bet kokią kitą reikšmę kaip nuorodą per kreipinys HTTP antraštė. Atkreipkite dėmesį, kad šios HTTP antraštės pavadinimas tyčia neteisingai užrašytas kaip “referrer”.”
Dėl JavaScript Window.open funkciją, galite pridėti reikšmes noopener ir noreferrer į langasFeatures parametras Window.open funkcija, tačiau skirtingos naršyklės gali reaguoti skirtingai, todėl rekomenduojama Window.opener kaip null panaudojus Window.open() funkcija.