Reikalavimai: Neseniai perskaičiau "Microsoft" ASP.NET Core dokumentą "Atviro peradresavimo atakų prevencija ASP.NET Core", o tai apytiksliai reiškiaKūrėjai turėtų atkreipti dėmesį į vietinės svetainės kelią, kai pereina prie atgalinio skambinimo adreso, kad kai kurie žmonės negalėtų piktybiškai suklastoti atgalinio skambinimo adreso sukčiavimo atakoms。 Išstudijuokite kodą ir pasiruoškite jį perkelti į ASP.NET MVC projektą.
Prisimenu, kad pagrindinis gamintojas anksčiau turėjo šį pažeidžiamumą, o kai kurie žmonės jį naudojo srautui iš QQ ir WeChat išleisti taip:
Išnaudodami pažeidžiamumą, kai kurie pokalbių įrankiai negalėjo užkirsti kelio vartotojams spustelėti nuorodų, kad pasiektų kenkėjišką svetainės turinį, nes jie pasitiki dideliais įmonės domenais.
Kas yra atviro peradresavimo ataka?
Žiniatinklio programos dažnai nukreipia vartotojus į prisijungimo puslapius, kai jie pasiekia išteklius, kuriems reikalingas autentifikavimas. Peradresavimai paprastai apima returnUrl querystring parametrą, kad vartotojai galėtų grįžti į iš pradžių prašomą URL po sėkmingo prisijungimo. Kai vartotojas autentifikuojasi, jis nukreipiamas į iš pradžių prašytą URL.
Atakos pavyzdys
Kenkėjiškas vartotojas gali sukurti ataką, skirtą suteikti kenkėjiškam vartotojui prieigą prie vartotojo kredencialų ar neskelbtinos informacijos. Norėdamas pradėti ataką, kenkėjiškas naudotojas apgautų naudotoją, kad jis spustelėtų nuorodą į jūsų svetainės nukreipimo puslapį ir prie to URL pridėtų returnUrl užklausos eilutės reikšmę. Siekiantcontoso.comPavyzdžiui, programa yrahttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutYra nukreipimo puslapis. Ataka atliekama šiais veiksmais:
- Vartotojas spustelėja kenkėjišką nuorodą įhttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Antrasis URL yra "contoso1.com", vietoj "contoso.com”) 。
- Vartotojas sėkmingai prisijungia.
- Vartotojas nukreipiamas į svetainęhttp://contoso1.com/Account/LogOn(Kenkėjiška svetainė, kuri atrodo lygiai taip pat, kaip tikroji).
- Vartotojas vėl prisijungia (pateikdamas kredencialus kenkėjiškai svetainei) ir nukreipiamas atgal į tikrąją svetainę.
- Vartotojai gali manyti, kad pirmasis bandymas prisijungti nepavyko, o antrasis bandymas pavyko.Tikėtina, kad vartotojai vis dar nežino, kad jų kredencialai buvo pažeisti。
Be nukreipimo puslapių, kai kurios svetainės siūlo peradresavimo puslapius arba galinius taškus. Tarkime, kad programoje yra puslapis, kuriame yra atidarytas peradresavimas /Home/Redirect. Pavyzdžiui, užpuolikas gali sukurti tašką el. laiške[jūsųsvetainė]/Pradžia/Redirect?url=http://phishingsite.com/Home/Loginsaitas. Įprasti vartotojai matys, kad URL prasideda jūsų svetainės pavadinimu. Iš pasitikėjimo jie paspaudžia nuorodą. Atidarykite peradresavimus, tada nukreipkite vartotojus į sukčiavimo svetaines, kurios atrodo taip pat, kaip jūsų, ir vartotojai gali prisijungti prie svetainių, kurios, jų manymu, yra jūsų.
Užkirskite kelią atvirų peradresavimo atakų prevencijai
Kuriant žiniatinklio programas, visi vartotojo pateikti duomenys laikomi nepatikimais. Jei programa gali peradresuoti naudotojus pagal URL turinį, įsitikinkite, kad tokie peradresavimai atliekami tik vietoje programoje (arba nukreipiami į žinomus URL, o ne į URL, kurie gali būti pateikti užklausos eilutėje).
Vietinis peradresavimas
Valdiklio pagalbinio metodo naudojimas LocalRedirect bazinėje klasėje:
Jei nurodytas ne vietinis URL, "LocalRedirect" pateikia išimtį. Priešingu atveju jis veikia taip pat, kaip ir peradresavimo metodas. Informacija apie išimtis yra tokia:
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. Šaltinio kodas yra toks:
Vykdymo procesas: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, o galų gale IsLocalUrl bus pakviestas spręsti (UrlHelperFactory pagal numatytuosius nustatymus įgyvendina IUrlHelperFactory sąsają. )。
Šaltinio kodo adresas:Hipersaito prisijungimas matomas.
IsLocalUrl
IsLocalUrl prieš peradresuodami patikrinkite URL naudodami šį metodą:
Kodas yra toks:
Bandymo kodas yra toks:
Jei jums leidžiama pereiti į kitas domenų vardų svetaines, galite įdiegti IUrlHelperFactory sąsają ir modifikuoti IServiceCollection, kad pakeistų numatytąją diegimo klasę, kai programa paleidžiama.
Nuoroda:Hipersaito prisijungimas matomas.
(Pabaiga)
|