Requisiti: Ho recentemente letto il documento ASP.NET Core di Microsoft "Prevenire attacchi di reindirizzamento aperto in ASP.NET Core", che significa approssimativamenteGli sviluppatori dovrebbero prestare attenzione al percorso del sito locale quando saltano all'indirizzo di callback per evitare che alcune persone falsifichino malevolmente l'indirizzo di callback per attacchi di phishing。 Studia il codice e preparati a portarlo sul progetto ASP.NET MVC.
Ricordo che un grande produttore aveva già avuto questa vulnerabilità in passato, e alcune persone l'hanno usata per sottrarre traffico da QQ e WeChat, come segue:
Sfruttando la vulnerabilità, alcuni strumenti di chat non sono riusciti a impedire agli utenti di cliccare sui link per accedere a contenuti di siti web dannosi a causa della loro fiducia nei domini aziendali di grandi dimensioni.
Cos'è un attacco di reindirizzamento aperto?
Le applicazioni web spesso indirizzano gli utenti alle pagine di accesso quando accedono a risorse che richiedono autenticazione. I redirect includono tipicamente un parametro di querystring returnUrl in modo che gli utenti possano tornare all'URL originariamente richiesto dopo un login riuscito. Dopo che l'utente si è autenticato, viene reindirizzato all'URL richiesto originariamente.
Esempio di attacco
Un utente malevolto può sviluppare un attacco progettato per dare a un utente malevolo accesso alle credenziali o alle informazioni sensibili di un utente. Per avviare un attacco, un utente malevolo ingannerebbe l'utente facendolo cliccare su un link alla landing page del sito e aggiungerebbe il valore della querystring returnUrl a quell'URL. per potercontoso.comAd esempio, l'app è inhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutContiene una pagina di destinazione. L'attacco segue questi passaggi:
- L'utente clicca su un link malevolo ahttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Il secondo URL è "contoso1.com", invece di "contoso.com”) 。
- L'utente riesce ad effettuare il login.
- L'utente viene reindirizzato al sitohttp://contoso1.com/Account/LogOn(Un sito malevolo che assomiglia esattamente a quello reale).
- L'utente effettua nuovamente il login (fornendo credenziali al sito malevolino) e viene reindirizzato al sito reale.
- Gli utenti potrebbero pensare che il primo tentativo di accesso sia fallito e il secondo sia riuscito.È probabile che gli utenti non sappiano ancora che le loro credenziali sono state compromesse。
Oltre alle landing page, alcuni siti offrono pagine di reindirizzamento o endpoint. Supponiamo che la tua app abbia una pagina che include un redirect aperto, /Home/Redirect. Ad esempio, un attaccante potrebbe creare un punto in un'email[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Logincollegamento. Gli utenti abituali vedranno che l'URL inizia con il nome del tuo sito. Per fiducia, cliccano sul link. Apri i reindirizzamenti e poi invia gli utenti a siti di phishing che assomigliano ai tuoi, e gli utenti possono accedere a siti che ritengono siano i tuoi.
Prevenire attacchi di redirezione aperta
Quando si sviluppano applicazioni web, tutti i dati forniti dagli utenti vengono trattati come inaffidabili. Se la tua app ha la capacità di reindirizzare gli utenti in base al contenuto degli URL, assicurati che tali reindirizzamenti vengano effettuati solo localmente nella tua app (o reindirizzi verso URL noti, non verso quelli forniti nella querystring).
LocalRedirect
Usando il metodo Controller helper nella classe base LocalRedirect:
Se viene specificato un URL non locale, LocalRedirect lancia un'eccezione. Altrimenti, si comporta allo stesso modo del metodo Redirect. Le informazioni sulle eccezioni sono le seguenti:
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. Il codice sorgente è il seguente:
Processo di esecuzione: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, e alla fine, IsLocalUrl verrà chiamata a giudicare (UrlHelperFactory implementa di default l'interfaccia IUrlHelperFactory. )。
Indirizzo del codice sorgente:Il login del link ipertestuale è visibile.
IsLocalUrl
IsLocalUrl prima di reindirizzare, testa l'URL usando questo metodo:
Il codice è il seguente:
Il codice di prova è il seguente:
Se ti è permesso saltare su altri siti di nomi di dominio, puoi implementare l'interfaccia IUrlHelperFactory e modificare IServiceCollection per sostituire la classe di implementazione predefinita all'avvio del programma.
Riferimento:Il login del link ipertestuale è visibile.
(Fine)
|