Tīmekļa lietotņu drošība. Target=”_blank” ievainojamība
Lukāšs Kolko
Tīmekļa lietojumprogrammu izmantošana ir kļuvusi par ikdienišķu parādību ikvienā sabiedrībā. Mēs ar tām saskaramies katru dienu. Var teikt, ka tās mūs ieskauj. Mēs tās izmantojam darbā, izklaidei un kā rīkus saziņai ar citiem. Bieži vien mēs kā lietotāji un izstrādātāji neapzināmies, cik daudz drošības ievainojamību šādās lietojumprogrammās tiek atklāts katru dienu.
Šajā dokumentā aplūkotā neaizsargātība ir ar mums ilgu laiku, un tās vienkāršības dēļ daži to bieži vien nenovērtē vai pat nezina. tīmekļa lietojumprogrammu izstrādātāji.
Gandrīz katrs tīmekļa vietne lietojumprogrammā ir saites, uz kurām noklikšķinot tiek atvērta jauna cilne, lai netiktu aizvērta cilne ar sākotnējo lapu. Tā ir vēlama uzvedība, jo izstrādātāji vēlas, lai lietotājs pavadītu pēc iespējas vairāk laika lietojumprogrammā.
Uzbrukums, kas izmanto šo ievainojamību, ir tā sauktais “reversais tabnabings”. Tas ir uzbrukums, kad no mērķa lapas saistītā lapa var aizstāt šo lapu ar, piemēram, pikšķerēšanas vietni.
Uzbrukuma scenārijs
Pieņemsim, ka upuris izmanto Facebook, kas ir pazīstams ar to, ka atver saites, izmantojot target=”_blank”,
Izveidojiet viltus virālo lapu,
Izveidojiet pikšķerēšanas vietni, kas izskatās kā Facebook pierakstīšanās lapa,
Ievietojiet tālāk norādīto kods vīrusa lapā, piemēram, izmantojot atrastu XSS ievainojamību. window.opener.location = 'https://phishing-website/facebook.com';
Upuris noklikšķina uz saites Facebook vietnē, lai nokļūtu uz vīrusa lapu,
Vīrusa lapa novirza Facebook cilni uz pikšķerēšanas tīmekļa vietni, aicinot lietotāju vēlreiz pierakstīties.
Tātad, mēs varam mainīt vecāku cilni no inficētās mērķa lapas, izmantojot loga objektu no Web API. Parasti uzbrukumā paralēli tiek izmantotas vairākas atklātās ievainojamības un pikšķerēšanas metodes.
Problēma
Kad pārlūkprogrammā atveram jaunu cilni, izmantojot saiti ar saiti ar target="_blank" atribūtu, mums ir piekļuve mūsu “novirzītājam” no jaunās cilnes. Precīzāk, uz Atvērējs īpašība Logs objektu, kas atgriež atsauci uz logu, kurš to atvēra, mūsu vecāku lapu.
Tas ir saistīts ar to, ka Window.open() funkcija. Izmantojot šo atribūtu, mēs varam viegli nomainīt vecāku lapu. Ņemiet vērā, ka dažas mūsdienu pārlūkprogrammas var logs.opener funkcija mērķa cilnē kā null lai novērstu šādu uzvedību.
Koda piemērs
<code> <a href="https://github.com" target="_blank">Iet uz GitHub - inficētā saite</a>const
if (link)
link[0].onclick = () => { {
if (window) window.opener.location = 'https://stackoverflow.com'
}
Virs varat redzēt inficēto saiti, kas sākotnēji atver jaunu cilni ar GitHub lapu, bet tikmēr tā maina mūsu “vecāku” lapu uz Stackoverflow vietni.
Tiešraides piemērs
1. HTML saites
Pievienot rel="noopener noreferrer" uz <a> birka.
Portāls rel atribūts nosaka saikni starp saistīto resursu un pašreizējo dokumentu.
noopener uzdod pārlūkprogrammai pārvietoties uz mērķi, nepiešķirot piekļuvi vecākajam lietotājam, kas to atvēris. Mērķa cilne Window.opener būs null.
noreferrer neļauj pārlūkprogrammai, pārejot uz mērķi, sūtīt vecākam adresi vai jebkuru citu vērtību kā atsauces numuru, izmantojot referer HTTP galvene. Ņemiet vērā, ka šis HTTP galvenes nosaukums ir apzināti nepareizi rakstīts kā “referrer”.”
Attiecībā uz JavaScript Window.open funkciju, varat pievienot vērtības noopener un noreferrer in the logsFeatures parametrs Window.open funkcija, taču dažādās pārlūkprogrammās var būt atšķirīga reakcija, tāpēc ir ieteicams veikt Window.opener kā null pēc Window.open() funkcija.