Requisitos: Recentemente li o documento ASP.NET Core da Microsoft "Prevenindo ataques de redirecionamento aberto no ASP.NET Core", que significa aproximadamenteOs desenvolvedores devem prestar atenção ao caminho do site local ao pular para o endereço de retorno para evitar que algumas pessoas forjem maliciosamente o endereço de retorno para ataques de phishing。 Estude o código e prepare-se para portá-lo para o projeto ASP.NET MVC.
Lembro que um grande fabricante já teve essa vulnerabilidade antes, e algumas pessoas a usaram para drenar tráfego do QQ e do WeChat, da seguinte forma:
Explorando a vulnerabilidade, algumas ferramentas de chat não conseguiram impedir que usuários clicassem em links para acessar conteúdos maliciosos devido à confiança em domínios de grandes empresas.
O que é um ataque de redirecionamento aberto?
Aplicações web frequentemente redirecionam os usuários para páginas de login quando acessam recursos que exigem autenticação. Os redirecionamentos normalmente incluem um parâmetro de sequência de consulta returnUrl para que os usuários possam retornar à URL originalmente solicitada após um login bem-sucedido. Após a autenticação do usuário, ele é redirecionado para a URL que solicitou originalmente.
Exemplo de ataque
Um usuário malicioso pode desenvolver um ataque projetado para dar a um usuário malicioso acesso às credenciais ou informações sensíveis de um usuário. Para iniciar um ataque, um usuário malicioso enganaria o usuário para clicar em um link para a página de destino do seu site e adicionar o valor da sequência de consulta returnUrl àquela URL. para quecontoso.comPor exemplo, o aplicativo está emhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutContém uma página inicial. O ataque segue os seguintes passos:
- O usuário clica em um link malicioso parahttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(A segunda URL é "contoso1.com", em vez de "contoso.com”) 。
- O usuário faz login com sucesso.
- O usuário é redirecionado para o sitehttp://contoso1.com/Account/LogOn(Um site malicioso que se parece exatamente com o real).
- O usuário faz login novamente (fornecendo credenciais para o site malicioso) e é redirecionado de volta para o site real.
- Os usuários podem pensar que a primeira tentativa de login falhou e a segunda tentativa foi um sucesso.É provável que os usuários ainda não saibam que suas credenciais foram comprometidas。
Além das landing pages, alguns sites oferecem páginas de redirecionamento ou endpoints. Digamos que seu app tenha uma página que inclui um redirecionamento aberto, /Home/Redirection. Por exemplo, um atacante pode criar um ponto em um e-mail[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginlink. Usuários comuns verão que a URL começa com o nome do seu site. Por confiança, eles clicam no link. Abra redirecionamentos e então envie os usuários para sites de phishing que se parecem com o seu, e os usuários podem fazer login em sites que acham seus.
Prevenir ataques de redirecionamento aberto
Ao desenvolver aplicações web, todos os dados fornecidos pelo usuário são tratados como não confiáveis. Se seu app tem a capacidade de redirecionar usuários com base no conteúdo das URLs, certifique-se de que tais redirecionamentos sejam feitos apenas localmente no seu app (ou redirecionem para URLs conhecidas, não para quaisquer URLs que possam estar fornecidas na sequência de consulta).
LocalRedirecionamento
Usando o método ajudante Controller na classe base LocalRedirect:
Se uma URL não local for especificada, o LocalRedirect lança uma exceção. Caso contrário, ele se comporta da mesma forma que o método Redirecionar. As informações de exceção são as seguintes:
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. O código-fonte é o seguinte:
Processo de execução: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, e no final, IsLocalUrl será chamado para julgar (UrlHelperFactory implementa a interface IUrlHelperFactory por padrão. )。
Endereço do código-fonte:O login do hiperlink está visível.
IsLocalUrl
IsLocalUrl antes de redirecionar, teste a URL usando este método:
O código é o seguinte:
O código do teste é o seguinte:
Se você puder pular para outros sites de nomes de domínio, pode implementar a interface IUrlHelperFactory e modificar o IServiceCollection para substituir a classe padrão de implementação quando o programa iniciar.
Referência:O login do hiperlink está visível.
(Fim)
|