Požadavky: Nedávno jsem četl dokument Microsoftu ASP.NET Core "Preventing Open Redirect Attacks in ASP.NET Core", což přibližně znamenáVývojáři by měli při přechodu na callback adresu věnovat pozornost směru místního webu, aby zabránili některým lidem zlomyslně falšovat callback adresu pro phishingové útoky。 Prostudujte kód a připravte se na jeho portování do projektu ASP.NET MVC.
Pamatuji si, že jeden velký výrobce měl tuto zranitelnost dříve a někteří lidé ji používali k odčerpání provozu z QQ a WeChatu, a to následovně:
Některé chatovací nástroje využily tuto zranitelnost a nedokázaly zabránit uživatelům klikat na odkazy pro přístup k škodlivému obsahu webových stránek díky jejich důvěře ve velké firemní domény.
Co je to otevřený přesměrovací útok?
Webové aplikace často přesměrovávají uživatele na přihlašovací stránky, když přistupují ke zdrojům vyžadujícím autentizaci. Přesměrování obvykle obsahují parametr querystring returnUrl, aby se uživatelé mohli po úspěšném přihlášení vrátit k původně požadované URL. Po autentizaci je uživatel přesměrován na URL, o kterou původně žádal.
Příklad útoku
Škodlivý uživatel může vyvinout útok navržený tak, aby mu umožnil přístup k přihlašovacím údajům nebo citlivým informacím uživatele. Pro zahájení útoku by škodlivý uživatel uživatele oklamal, aby klikl na odkaz na vstupní stránku vašeho webu a přidal k této URL hodnotu querystringu returnUrl. abycontoso.comNapříklad aplikace je vhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutObsahuje vstupní stránku. Útok následuje tyto kroky:
- Uživatel klikne na škodlivý odkazhttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Druhá URL je "contoso1.com", místo "contoso.com”) 。
- Uživatel se úspěšně přihlásí.
- Uživatel je přesměrován na stránkuhttp://contoso1.com/Account/LogOn(Škodlivý web, který vypadá přesně jako ten skutečný).
- Uživatel se znovu přihlásí (zadá přihlašovací údaje na škodlivý web) a je přesměrován zpět na skutečný web.
- Uživatelé si mohou myslet, že jejich první pokus o přihlášení selhal a druhý pokus byl úspěšný.Je pravděpodobné, že uživatelé stále nevědí, že jejich přihlašovací údaje byly kompromitovány。
Kromě landing pages některé weby nabízejí přesměrovací stránky nebo endpointy. Řekněme, že vaše aplikace má stránku, která obsahuje otevřené přesměrování, /Home/Redirect. Například útočník může vytvořit bod v e-mailu[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginpropojit. Běžní uživatelé uvidí, že URL začíná názvem vašeho webu. Z důvěry kliknou na odkaz. Otevřená přesměrování pak přesměrují uživatele na phishingové stránky, které vypadají stejně jako vaše, a uživatelé se mohou přihlašovat na stránky, které považují za vaše.
Zabránit otevřeným přesměrovacím útokům
Při vývoji webových aplikací jsou všechna uživatelsky poskytovaná data považována za nedůvěryhodná. Pokud má vaše aplikace možnost přesměrovat uživatele na základě obsahu URL adres, ujistěte se, že taková přesměrování probíhají pouze lokálně ve vaší aplikaci (nebo přesměrovávají na známé URL, ne na ty z dotazovacího řetězce).
LocalRedirect
Použitím metody Controller helper v základní třídě LocalRedirect:
Pokud je určena nelokální URL, LocalRedirect vyhodí výjimku. Jinak se chová stejně jako metoda Přesměrování. Informace o výjimce jsou následující:
InvalidOperationException: The supplied URL is not local. A URL with an absolute path is considered local if it does not have a host/authority part. URLs using virtual paths ('~/') are also local. Zdrojový kód je následující:
Proces vykonání: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl a nakonec bude IsLocalUrl vyvolán k posouzení (UrlHelperFactory ve výchozím nastavení implementuje rozhraní IUrlHelperFactory. )。
Adresa zdrojového kódu:Přihlášení k hypertextovému odkazu je viditelné.
IsLocalUrl
IsLocalUrl před přesměrováním otestujte URL touto metodou:
Kód je následující:
Testovací kód je následující:
Pokud je povoleno přejít na jiné doménové stránky, můžete implementovat rozhraní IUrlHelperFactory a upravit IServiceCollection tak, aby nahradil výchozí implementační třídu při spuštění programu.
Odkaz:Přihlášení k hypertextovému odkazu je viditelné.
(Konec)
|