Uma das novidades presentes na versão do ASP.NET MVC 3 é a inclusão de um novo método presente dentro da classe UrlHelper chamado IsLocalUrl. Este método nos permite passar uma string de Url como parâmetro e nos retorna em forma de bool se a mesma é uma Url local ou não.

 

Mas o que seria um ataque de redirecionamento?

Vamos imaginar que estamos trabalhando com a aplicação padrão do MVC 1 ou MVC 2. Note que, se a executarmos e tentarmos acessar a Action “ChangePassword” localizada em “AccountController”, é solicitado que seja realizado o login primeiramente. Assim como qualquer requisição que seja realizada para Actions que seja decorada com o atributo Authorize.

Observe, nossa Url é modificada permanecendo da seguinte forma:

http://localhost:2077/Account/LogOn?ReturnUrl=%2fAccount%2fChangePassword

Isto é, quando for realizado o login pelo usuário, automaticamente podemos ou não já redirecionar para a Url solicitada, que é enviada automaticamente pelo parâmetro “ReturnUrl”.

Até ai tudo bem, o usuário se autenticou e foi redirecionado para a página solicitada. Agora observe que, como o conteúdo de “ReturnUrl” é enviado como parâmetro pela Url, o valor da mesma pode facilmente ser modificado para redirecionar para uma página externa a sua aplicação, como por exemplo:

http://localhost:2077/Account/LogOn?ReturnUrl=http://localhost:2078/AccountLogOn

Note no exemplo que, após a autenticação do usuário o mesmo será redirecionado para o endereço http://localhost:2142/Account/LogOn, que é uma Url externa a sua aplicação.

Com isto, é facilmente possível criar uma página semelhante a login da aplicação original e obter informações como senhas, nomes de usuários entre outras informações,   e o pior, como o usuário já se autenticou na aplicação original é possível redirecioná-lo novamente até a página solicitada inicialmente sem que o mesmo perceba que foi realizado um ataque de redirecionamento.

 

Evitando tais problemas

O ASP.NET MVC3 já possui um recurso especifico para a verificação de Url chamado IsLocalUrl. Felizmente é possível implementá-lo sem problemas e complicações nas versões 1 e 2 do MVC também.

Note que, no método de LogOn da aplicação MVC1 ou 2 é verificado apenas se o parâmetro ReturnUrl é vazio ou nulo, conforme a linha 47 da figura abaixo:

Figura 1

 

Agora note o mesmo método na aplicação MVC3, veja que já é utilizado o método IsLocalUrl, que verifica se a url passada como parâmetro é local.

 Figura 2

 

Com isso nossa Url do exemplo http://localhost:2077/Account/LogOn?ReturnUrl=http://localhost:2078/AccountLogOn seria redirecionada para a Action “Index” do “HomeController” e não para a enviada como parâmetro  http://localhost:2142/Account/LogOn.

 

Implementando a validação no MVC1 e MVC2

Felizmente podemos incluir um método adicional que irá realizar a função do método IsLocalUrl presente no ASP.NET MVC 3. Iremos criar o método ValidaUrlLocal no próprio “AccountController”. Conforme a imagem abaixo:

Figura 3

 

Agora basta chamarmos o método criado no momento da realização do login

Figura 4

 

Conclusão

Vimos como uma Url pode ser vulnerável a ataques de redirecionamentos e como o ASP.NET MVC3 disponibiliza o método IsLocalUrl para validar tais redirecionamentos indesejados. Pudemos ver também como implementar a mesma validação em aplicações ASP.NET MVC 1 e MVC 2, garantindo assim maior segurança contra ataques de redirecionamentos de Url.

 
Rafael Zaccanini
MTAC – Microsoft Technical Audience Contributor

Blog: http://www.rafaelzaccanini.net
Twitter: 
@rafaelzaccanini
Facebook: http://www.facebook.com/RafaelZaccaniniNet