Požiadavky: Nedávno som čítal dokument Microsoftu ASP.NET Core "Preventing Open Redirect Attacks in ASP.NET Core", čo približne znamenáVývojári by si mali dávať pozor na trasu miestnej stránky pri preskakovaní na spätnú adresu, aby zabránili niektorým ľuďom zlovestne falšovať spätnú adresu pre phishingové útoky。 Študujte kód a pripravte sa na jeho portovanie do projektu ASP.NET MVC.
Pamätám si, že jeden veľký výrobca mal túto zraniteľnosť už predtým a niektorí ľudia ju používali na odčerpávanie návštevnosti z QQ a WeChatu, nasledovne:
Využívajúc zraniteľnosť, niektoré chatovacie nástroje nedokázali zabrániť používateľom klikať na odkazy na prístup k škodlivému obsahu webových stránok kvôli ich dôvere vo domény veľkých spoločností.
Čo je to otvorený presmerovací útok?
Webové aplikácie často presmerovávajú používateľov na prihlasovacie stránky, keď pristupujú k zdrojom vyžadujúcim autentifikáciu. Presmerovania zvyčajne obsahujú parameter querystring returnUrl, aby sa používatelia mohli po úspešnom prihlásení vrátiť na pôvodne požadovanú URL. Po autentifikácii je používateľ presmerovaný na pôvodne požadovanú URL.
Príklad útoku
Škodlivý používateľ môže vyvinúť útok navrhnutý tak, aby mu umožnil prístup k prihlasovacím údajom alebo citlivým informáciám používateľa. Na spustenie útoku by škodlivý používateľ oklamal používateľa, aby klikol na odkaz na vstupnú stránku vášho webu a pridal hodnotu querystringu returnUrl k tejto URL. abycontoso.comNapríklad aplikácia je vhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutObsahuje vstupnú stránku. Útok nasleduje tieto kroky:
- Používateľ klikne na škodlivý odkazhttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Druhá URL je "contoso1.com", namiesto "contoso.com”) 。
- Používateľ sa úspešne prihlási.
- Používateľ je presmerovaný na stránkuhttp://contoso1.com/Account/LogOn(Škodlivá stránka, ktorá vyzerá presne ako tá skutočná).
- Používateľ sa opäť prihlási (poskytne prihlasovacie údaje škodlivej stránke) a je presmerovaný späť na skutočnú stránku.
- Používatelia si môžu myslieť, že ich prvý pokus o prihlásenie zlyhal a druhý bol úspešný.Je pravdepodobné, že používatelia stále nevedia, že ich prihlasovacie údaje boli kompromitované。
Okrem vstupných stránok niektoré stránky ponúkajú aj presmerovacie stránky alebo koncové body. Povedzme, že vaša aplikácia má stránku, ktorá obsahuje otvorené presmerovanie, /Home/Redirect. Napríklad útočník môže vytvoriť bod v e-maile[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginväzba. Bežní používatelia uvidia, že URL začína názvom vašej stránky. Z dôvery kliknú na odkaz. Otvorené presmerovania potom posielajú používateľov na phishingové stránky, ktoré vyzerajú rovnako ako tie vaše, a používatelia sa môžu prihlásiť na stránky, o ktorých si myslia, že sú vaše.
Zabránenie otvoreným presmerovacím útokom
Pri vývoji webových aplikácií sa všetky údaje poskytované používateľmi považujú za nedôveryhodné. Ak má vaša aplikácia možnosť presmerovať používateľov na základe obsahu URL, uistite sa, že takéto presmerovania sa vykonávajú iba lokálne vo vašej aplikácii (alebo na známe URL, nie na URL, ktoré môžu byť uvedené v querystringu).
LocalRedirect
Použitím metódy Controller helper v základnej triede LocalRedirect:
Ak je špecifikovaná nelokálna URL, LocalRedirect vyhodí výnimku. Inak sa správa rovnako ako metóda Presmerovania. Informácie o výnimke sú nasledovné:
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 nasledovný:
Proces vykonávania: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, a nakoniec bude IsLocalUrl vyvolaný na posúdenie (UrlHelperFactory štandardne implementuje rozhranie IUrlHelperFactory. )。
Adresa zdrojového kódu:Prihlásenie na hypertextový odkaz je viditeľné.
IsLocalUrl
IsLocalUrl pred presmerovaním otestujte URL touto metódou:
Kód je nasledovný:
Testovací kód je nasledovný:
Ak je povolené skočiť na iné doménové stránky, môžete implementovať rozhranie IUrlHelperFactory a upraviť IServiceCollection tak, aby nahradil predvolenú implementačnú triedu pri spustení programu.
Referencia:Prihlásenie na hypertextový odkaz je viditeľné.
(Koniec)
|