Cuidado com os response headers de sua aplicação!

Imagine a seguinte situação: Alguém quer invadir um site/sistema que você fez. Por onde começar? Quando alguém esta pensando em invadir um sistema, informação é ouro! Saber qual servidor está hospedando a aplicação, qual tecnologia foi utilizada para desenvolver, etc. é de grande importância. Quando criamos um projeto em asp.net mvc, por exemplo, e hospedamos no IIS, sem nenhuma configuração, preocupação com segurança, etc. estaremos informando a qualquer um que faça uma requisição ao nosso sistema, informações como qual a versão do iis que o sistema está hospedado, qual a versão do asp.net que utilizamos, etc. Dê uma olhada nessa requisição que foi feita em um sistema em produção de uma grande multinacional:

response headers

Apenas apertando F12 no chrome ou firefox, sabemos que é um sistema desenvolvido em asp.net 4, utilizando o asp.net mvc 5 e hospedado no iis 7. Até ai tudo bem, mas qual o problema? Sabendo que o sistema está hospedado no iis 7.5, basta uma simples pesquisa no google para descobrirmos as vulnerabilidades do servidor, como no exemplo abaixo:

https://www.google.com.br/search?q=cve+iis+7.5

Ao clicarmos no primeiro link do resultado, já podemos descobrir 5 vulnerabilidades conhecidas do iis 7.5. E tudo isso, qualquer um pode descobrir em menos de 1 minuto.

iis cve

Claro que existem diversas maneiras de se descobrir qual é o servidor que está hospedando a aplicação, qual a tecnologia utilizada, etc. Mas quando estamos pensando na segurança de nossa aplicação, são os pequenos cuidados que fazem com que evitemos grandes estragos.

Então vamos ao que interessa. Vamos criar um projeto em asp.net mvc, hospeda-lo no iss local e ver como estão as coisas por default (neste exemplo, estou utilizando o visual studio 2015 comunity, mas pode ser qualquer versão).

Criei um projeto MVC, sem autenticação e o configurei para rodar no iss local (lembre-se que precisa rodar o visual studio como administrador para utilizar esta opção). Ao rodar o projeto, eis que vemos todos os response headers disponíveis por default:

response headers default

Agora vamos lá, como podemos resolver este problema? Alguns são mais simples, alguns nem tanto. Mas o importante é removermos para evitar futuros aborrecimentos.

X-AspNet-Version

Para removermos o header X-AspNet-Version, é bem simples! Basta irmos no web.config da aplicação e colocarmos a opção enableVersionHeader="false" em httpRuntime, que fica dentro de

<httpRuntime targetFramework="4.5.2" enableVersionHeader="false" />

Ao rodarmos a aplicação, podemos notar que o header X-AspNet-Version já não está presente, porém ainda precisamos retirar mais alguns.

sem xaspnetversion

X-AspNetMvc-Version

Para remover o X-AspNetMvc-Version também é bem simples. Basta irmos no Global.asax e adicionar apenas uma linha de código para removermos este pequeno detalhe:

// precisamos adicionar esta linha MvcHandler.DisableMvcResponseHeader = true;

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    MvcHandler.DisableMvcResponseHeader = true;
}

E pronto! Ao rodarmos a nossa aplicação, já não veremos mais o header X-AspNetMvc-Version presente!

sem X-AspNetMvc-Version

Server

Este é um pouco mais trabalhoso, mas nada demais também. Para não informarmos mais qual o servidor que a nossa aplicação está hospedada, vamos criar um HttpModule:

using System;
using System.Web;

namespace ResponseHeaders
{
    public class ResponseHeadersModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

        public void Dispose() { }

        void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Headers.Remove("Server");
        }
    }
}

Agora precisamos informa-lo no web.config:

<system.webServer>
  <modules>
    <add name="ResponseHeadersModule" type="ResponseHeaders.ResponseHeadersModule"/>
  </modules>
</system.webServer>

E pronto! Podemos notar que ao rodarmos a nossa aplicação, aquele header chato informando o nosso servidor não está mais presente!

sem server

Note que nós podemos brincar um pouco com isso também, e no lugar de informarmos o server certo, podemos colocar qualquer outra informação! Para isso, basta alterar o nosso ResponseHeadersModule:

using System;
using System.Web;

namespace ResponseHeaders
{
    public class ResponseHeadersModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

        public void Dispose() { }

        void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Headers.Set("Server", "YOU SHALL NOT PASS!");
        }
    }
}

Agora quem tentar ver qual o server, verá esta resposta:

custom server

X-Powered-By

Este é bem simples, porém não faremos nada em nosso projeto. Para remover este header, iremos abrir o nosso iss (basta dar ctrl + r e digitar inetmgr)

iis

Se procurarmos por Cabeçalhos de Resposta HTTP, ou HTTP Response Headers caso o seu iis esteja em inglês, vamos encontrar o tal do header X-Powered-By:

x powered by

Agora basta deletá-lo que nos livramos de todos os response headers que não deveriam estar presentes em nossos sistemas! Quando entrarmos em nossa aplicação, não veremos mais nenhum dos headers!

sem response headers

Bom, por hoje é só!
Abraço 😉

Anúncios

4 comentários sobre “Cuidado com os response headers de sua aplicação!

    1. eu realmente nunca fiz e nem vi nada a respeito. Tudo que posso afirmar é que o seu response ficará ligeiramente mais leve.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s