Vereisten: Ik heb onlangs Microsofts ASP.NET Core-document "Preventing Open Redirect Attacks in ASP.NET Core" gelezen, wat ruwweg betekentOntwikkelaars moeten letten op het pad van de lokale site bij het springen naar het callback-adres om te voorkomen dat sommige mensen het callback-adres kwaadwillig vervalsen voor phishing-aanvallen。 Bestudeer de code en bereid je voor om deze te porten naar het ASP.NET MVC-project.
Ik herinner me dat een grote fabrikant deze kwetsbaarheid eerder had, en sommige mensen gebruikten het om verkeer van QQ en WeChat af te voeren, als volgt:
Door gebruik te maken van deze kwetsbaarheid konden sommige chattools gebruikers niet verhinderen op links te klikken om toegang te krijgen tot kwaadaardige website-inhoud vanwege hun vertrouwen in grote bedrijfsdomeinen.
Wat is een open omleidingsaanval?
Webapplicaties leiden gebruikers vaak door naar inlogpagina's wanneer ze toegang krijgen tot bronnen die authenticatie vereisen. Redirects bevatten doorgaans een returnUrl-querystringparameter zodat gebruikers na een succesvolle login kunnen terugkeren naar de oorspronkelijk gevraagde URL. Nadat de gebruiker zich heeft geauthenticeerd, wordt hij doorgestuurd naar de URL die hij oorspronkelijk heeft gevraagd.
Voorbeeld van een aanval
Een kwaadaardige gebruiker kan een aanval ontwikkelen die bedoeld is om een kwaadaardige gebruiker toegang te geven tot de inloggegevens of gevoelige informatie van een gebruikers. Om een aanval te starten, zou een kwaadaardige gebruiker de gebruiker misleiden om op een link naar de landingspagina van je site te klikken en de returnUrl-querystring aan die URL toe te voegen. omcontoso.combijvoorbeeld, de app is inhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutBevat een landingspagina. De aanval volgt deze stappen:
- De gebruiker klikt op een kwaadaardige link omhttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(De tweede URL is "contoso1.com", in plaats van "contoso.com”) 。
- De gebruiker logt succesvol in.
- De gebruiker wordt doorgestuurd naar de sitehttp://contoso1.com/Account/LogOn(Een kwaadaardige site die er precies uitziet als de echte).
- De gebruiker logt opnieuw in (geeft inloggegevens aan de kwaadaardige site) en wordt teruggestuurd naar de echte site.
- Gebruikers denken misschien dat hun eerste inlogpoging mislukte en de tweede poging slaagde.Het is waarschijnlijk dat gebruikers nog steeds niet weten dat hun inloggegevens zijn gecompromitteerd。
Naast landingspagina's bieden sommige sites ook doorverwijzingspagina's of eindpunten. Stel dat je app een pagina heeft met een open doorleiding, /Home/Redirect. Een aanvaller kan bijvoorbeeld een punt aanmaken in een e-mail[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginverbinden. Gewone gebruikers zullen zien dat de URL begint met de naam van je site. Uit vertrouwen klikken ze op de link. Open redirects sturen vervolgens gebruikers naar phishingsites die er hetzelfde uitzien als die van jou, en gebruikers kunnen inloggen op sites waarvan ze denken dat ze van jou zijn.
Open omleidingsaanvallen voorkomen
Bij het ontwikkelen van webapplicaties wordt alle door gebruikers verstrekte data als onbetrouwbaar beschouwd. Als je app gebruikers kan doorsturen op basis van URL-inhoud, zorg er dan voor dat zulke redirects alleen lokaal in je app worden uitgevoerd (of doorverwijzen naar bekende URL's, niet naar URL's die in de querystring worden vermeld).
LocalRedirect
Gebruik van de Controller helper-methode in de LocalRedirect-basisklasse:
Als een niet-lokale URL wordt opgegeven, gooit LocalRedirect een uitzondering. Verder gedraagt het zich hetzelfde als de Redirect-methode. De uitzonderingsinformatie is als volgt:
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. De broncode is als volgt:
Uitvoeringsproces: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, en uiteindelijk wordt IsLocalUrl aangeroepen om te jureren (UrlHelperFactory implementeert standaard de IUrlHelperFactory-interface). )。
Broncode-adres:De hyperlink-login is zichtbaar.
IsLocalUrl
IsLocalUrl test voordat je de URL omleidt met deze methode:
De code is als volgt:
De testcode is als volgt:
Als je naar andere domeinnaamsites mag springen, kun je de IUrlHelperFactory-interface implementeren en IServiceCollection aanpassen om de standaard implementatieklasse te vervangen wanneer het programma start.
Referentie:De hyperlink-login is zichtbaar.
(Einde)
|