Cerințe: Am citit recent documentul Microsoft ASP.NET Core "Prevenirea atacurilor de redirecționare deschisă în ASP.NET Core", ceea ce înseamnă aproximativDezvoltatorii ar trebui să fie atenți la traiectoria site-ului local atunci când sar la adresa de callback pentru a preveni ca unii oameni să falsifice în mod rău intenționat adresa de callback pentru atacuri de tip phishing。 Studiază codul și pregătește-te să-l portezi pe proiectul ASP.NET MVC.
Îmi amintesc că un producător important a avut această vulnerabilitate înainte, iar unii oameni au folosit-o pentru a consuma trafic din QQ și WeChat, după cum urmează:
Exploatând vulnerabilitatea, unele instrumente de chat nu au putut împiedica utilizatorii să dea click pe linkuri pentru a accesa conținut malițios de pe site-uri din cauza încrederii lor în domeniile mari ale companiilor.
Ce este un atac de redirecționare deschisă?
Aplicațiile web redirecționează frecvent utilizatorii către paginile de autentificare atunci când accesează resurse care necesită autentificare. Redirecționările includ de obicei un parametru returnUrl querystring, astfel încât utilizatorii să poată reveni la URL-ul solicitat inițial după o autentificare reușită. După ce utilizatorul se autentifică, este redirecționat către URL-ul cerut inițial.
Exemplu de atac
Un utilizator rău intenționat poate dezvolta un atac conceput pentru a oferi acces la datele de acreditare sau informațiile sensibile ale acestuia. Pentru a începe un atac, un utilizator malițios ar păcăli utilizatorul să dea click pe un link către pagina de destinație a site-ului tău și ar adăuga valoarea string-ului de interogare returnUrl pe acel URL. pentru acontoso.comDe exemplu, aplicația este înhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutConține o pagină de destinație. Atacul urmează următorii pași:
- Utilizatorul dă click pe un link malițios cătrehttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Al doilea URL este "contoso1.com", în loc de "contoso.com”) 。
- Utilizatorul se autentifică cu succes.
- Utilizatorul este redirecționat către sitehttp://contoso1.com/Account/LogOn(Un site malițios care arată exact ca cel real).
- Utilizatorul se conectează din nou (oferind acreditări site-ului malițios) și este redirecționat înapoi către site-ul real.
- Utilizatorii pot crede că prima lor încercare de autentificare a eșuat, iar a doua încercare a reușit.Este probabil ca utilizatorii încă să nu știe că datele lor de autentificare au fost compromise。
Pe lângă paginile de destinație, unele site-uri oferă pagini de redirecționare sau endpoint-uri. Să presupunem că aplicația ta are o pagină care include o redirecționare deschisă, /Home/Redirect. De exemplu, un atacator ar putea crea un punct într-un e-mail[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginlegătură. Utilizatorii obișnuiți vor vedea că URL-ul începe cu numele site-ului tău. Din încredere, dau click pe link. Deschide redirecționările apoi trimite utilizatorii către site-uri de phishing care arată la fel ca al tău, iar utilizatorii se pot conecta pe site-uri pe care le consideră ale tale.
Prevenirea atacurilor de redirecționare deschisă
La dezvoltarea aplicațiilor web, toate datele furnizate de utilizatori sunt tratate ca fiind nesigure. Dacă aplicația ta are capacitatea de a redirecționa utilizatorii pe baza conținutului URL-urilor, asigură-te că astfel de redirecționări se fac doar local în aplicație (sau redirecționează către URL-uri cunoscute, nu către URL-urile care pot fi oferite în stringul de interogare).
LocalRedirect
Folosind metoda Controller helper din clasa de bază LocalRedirect:
Dacă este specificat un URL non-local, LocalRedirect aruncă o excepție. În rest, se comportă la fel ca metoda Redirecționare. Informațiile despre excepții sunt următoarele:
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. Codul sursă este următorul:
Proces de execuție: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, iar la final, IsLocalUrl va fi chemat să judece (UrlHelperFactory implementează implicit interfața IUrlHelperFactory. )。
Adresa codului sursă:Autentificarea cu hyperlink este vizibilă.
IsLocalUrl
IsLocalUrl înainte de redirecționare, testează URL-ul folosind această metodă:
Codul este următorul:
Codul testului este următorul:
Dacă ai voie să sari către alte site-uri de nume de domeniu, poți implementa interfața IUrlHelperFactory și modifica IServiceCollection pentru a înlocui clasa implicită de implementare la pornirea programului.
Referință:Autentificarea cu hyperlink este vizibilă.
(Sfârșit)
|