Používání webových aplikací se stalo samozřejmostí pro každou společnost. Setkáváme se s nimi každý den. Dá se říci, že nás obklopují. Používáme je v práci, pro zábavu i jako nástroje pro komunikaci s ostatními. Často si jako uživatelé a vývojáři neuvědomujeme, kolik bezpečnostních chyb je v těchto aplikacích každý den objeveno.
Zranitelnost diskutovaná v tomto článku byla s nás po dlouhou dobu a pro svou jednoduchost je často podceňována nebo dokonce neznámá. vývojáři webových aplikací.
Téměř každá webová aplikace obsahuje odkazy, které se po kliknutí otevřou na nové kartě, aby nedošlo k zavření karty s původní stránkou. Jedná se o preferované chování, protože tvůrci chtějí, aby uživatel strávil v aplikaci co nejvíce času.
Útokem, který tuto zranitelnost využívá, je takzvaný "reverzní tabnabbing". Jedná se o útok, při kterém je stránka odkazovaná z cílové stránky schopna nahradit tuto stránku například podvodným webem.
Scénář útoku
Předpokládejme, že oběť používá Facebook, který je známý tím, že otevírá odkazy prostřednictvím target="_blank",
Vytvořte falešnou virální stránku,
Vytvoření podvodné webové stránky, která vypadá jako přihlašovací stránka na Facebooku,
Vložte níže uvedené kód na virové stránce, např. prostřednictvím nalezené zranitelnosti XSS. window.opener.location = 'https://phishing-website/facebook.com';
Oběť klikne na odkaz na Facebooku na virovou stránku,
Virová stránka přesměruje kartu Facebook na podvodnou webovou stránku a požádá uživatele o nové přihlášení.
Můžeme tedy změnit nadřazenou kartu z infikované cílové stránky pomocí objektu okna z rozhraní Web API. Obvykle útok zahrnuje souběžné použití několika objevených zranitelností a phishingových podvodů.
Problém
Když otevřeme novou kartu v prohlížeči pomocí odkazu s příznakem target="_blank" atribut, máme přístup k našemu "odkazu" z nové karty. Přesněji řečeno k otvírák vlastnost Okno který vrací odkaz na okno, které jej otevřelo, tedy na naši nadřazenou stránku.
To je způsobeno chováním Window.open() funkce. S přístupem k tomuto atributu můžeme snadno nahradit naši nadřazenou stránku. Všimněte si, že některé moderní prohlížeče mohou window.opener funkce v cílové kartě jako null zabránit tomuto chování.
Příklad kódu
<code> <a href="https://github.com" target="_blank">Přejít na GitHub - infikovaný odkaz</a>const
if (link)
link[0].onclick = () => {
if (window) window.opener.location = 'https://stackoverflow.com'
}
Výše můžete vidět infikovaný odkaz, který původně otevře novou kartu se stránkou GitHub, ale mezitím změní naši "rodičovskou" stránku na stránku Stackoverflow.
Živý příklad
1. HTML odkazy
Přidat rel="noopener noreferrer" na <a> tag.
Na stránkách rel atribut definuje vztah mezi propojeným prostředkem a aktuálním dokumentem.
noopener říká prohlížeči, aby přešel k cíli bez udělení přístupu k rodiči, který jej otevřel. Karta cíle Window.opener bude null.
noreferrer zabrání prohlížeči, aby při přechodu na cíl odeslal nadřazenému počítači adresu nebo jinou hodnotu jako odkaz prostřednictvím odkazu. referer Hlavička HTTP. Všimněte si, že název této hlavičky HTTP je záměrně chybně napsán jako "referrer".
Pro JavaScript Window.open můžete přidat hodnoty noopener a noreferrer v windowFeatures parametr Window.open ale různé prohlížeče mohou reagovat různě, proto se doporučuje, abyste Window.opener jako null po použití Window.open() funkce.