Zahteve: Nedavno sem prebral Microsoftov dokument ASP.NET Core "Preprečevanje napadov z odprtimi preusmeritvami v ASP.NET Core", kar približno pomeniRazvijalci naj bodo pozorni na pot lokalne strani, ko preskakujejo na naslov za povratni klic, da preprečijo, da bi nekateri zlonamerno ponarejali naslov za povratni klic za phishing napade。 Preučite kodo in se pripravite na prenos na projekt ASP.NET MVC.
Spomnim se, da je imel večji proizvajalec to ranljivost že prej, nekateri pa so jo uporabili za odvzem prometa iz QQ in WeChata, kot sledi:
Zaradi izkoriščanja ranljivosti nekatera klepetalna orodja niso mogla preprečiti uporabnikom, da bi klikali na povezave za dostop do zlonamernih spletnih vsebin zaradi zaupanja v domene velikih podjetij.
Kaj je odprti preusmerjajoči napad?
Spletne aplikacije uporabnike pogosto preusmerjajo na prijavne strani, ko dostopajo do virov, ki zahtevajo avtentikacijo. Preusmeritve običajno vključujejo parameter querystring returnUrl, da se lahko uporabniki po uspešni prijavi vrnejo na prvotno zahtevani URL. Ko uporabnik potrdi avtentikacijo, je preusmerjen na URL, ki ga je prvotno zahteval.
Primer napada
Zlonamerni uporabnik lahko razvije napad, zasnovan tako, da zlonamernemu uporabniku omogoči dostop do uporabniških poverilnic ali občutljivih informacij. Za začetek napada bi zlonamerni uporabnik prevaral uporabnika, da klikne povezavo na pristajalno stran vaše strani in doda vrednost querystring returnUrl na ta URL. da bicontoso.comNa primer, aplikacija je vhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutVsebuje pristajalno stran. Napad sledi naslednjim korakom:
- Uporabnik klikne na zlonamerno povezavo zahttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Drugi URL je "contoso1.com", namesto "contoso.com”) 。
- Uporabnik se uspešno prijavi.
- Uporabnik je preusmerjen na stranhttp://contoso1.com/Account/LogOn(Zlonamerna stran, ki izgleda natanko kot prava).
- Uporabnik se ponovno prijavi (vnese podatke za zlonamerno stran) in je preusmerjen nazaj na pravo stran.
- Uporabniki lahko mislijo, da je njihov prvi poskus prijave spodletel, drugi pa je bil uspešen.Verjetno uporabniki še vedno ne vedo, da so bili njihovi podatki ogroženi。
Poleg pristajalnih strani nekatere strani ponujajo tudi preusmeritvene strani ali končne točke. Recimo, da ima vaša aplikacija stran, ki vsebuje odprto preusmeritev, /Home/Redirect. Na primer, napadalec lahko ustvari točko v e-pošti[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginpovezava. Redni uporabniki bodo opazili, da se URL začne z imenom vaše strani. Iz zaupanja kliknejo na povezavo. Odprte preusmeritve nato usmerjajo uporabnike na ribarske strani, ki so videti enako kot vaše, uporabniki pa se lahko prijavijo na strani, za katere mislijo, da so vaše.
Preprečevanje odprtih preusmerjajočih napadov
Pri razvoju spletnih aplikacij se vsi podatki, ki jih posredujejo uporabniki, obravnavajo kot nezanesljivi. Če ima vaša aplikacija možnost preusmerjanja uporabnikov glede na vsebino URL-jev, poskrbite, da se takšna preusmerjanja izvajajo samo lokalno v vaši aplikaciji (ali preusmerjajo na znane URL-je, ne na tiste, ki so morda navedeni v poizvedbenem nizu).
LocalRedirect
Uporaba metode Controller helper v osnovnem razredu LocalRedirect:
Če je določen nelokalni URL, LocalRedirect sproži izjemo. V nasprotnem primeru se obnaša enako kot metoda Preusmerjanja. Informacije o izjemi so naslednje:
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. Izvorna koda je naslednja:
Postopek izvajanja: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, in na koncu bo IsLocalUrl poklican, da presodi (UrlHelperFactory privzeto implementira vmesnik IUrlHelperFactory. )。
Naslov izvorne kode:Prijava do hiperpovezave je vidna.
IsLocalUrl
IsLocalUrl pred preusmeritvijo testirajte URL s to metodo:
Koda je naslednja:
Testna koda je naslednja:
Če vam je dovoljeno skočiti na druge domenske strani, lahko implementirate vmesnik IUrlHelperFactory in spremenite IServiceCollection, da ob zagonu programa nadomestite privzeti razred implementacije.
Referenčni:Prijava do hiperpovezave je vidna.
(Konec)
|