Nesta primeira parte, num total de três, vou explicar o funcionamento do DOM XSS e demonstrar como encontrar falhas nesta variante do XSS - um tipo de ataque muito utilizado/comum hoje em dia para roubo de sessões, phishing e propagação de malware utilizando o XSS Persistente [mais perigoso que o XSS Refletido, pois o XSS Persistente fica armazenado na aplicação web].
Vou também fornecer referências e vídeos que ajudam a complementar este artigo.
Tive conhecimento do DOM XSS[1] há alguns anos, altura em que li o livro XSS Attacks: Cross Site Scripting Exploits and Defense de Seth Fogie[2], com a participação do Robert ‘RSnake’ Hansen[3]. Foi exatamente no site - ha.ckers.org - do RSnake que despertei o interesse pelo XSS.
O DOM XSS tem sido bastante popular na segurança informática, muito devido às recompensas nos programas de divulgação responsável de vulnerabilidades de diversas empresas [Google, Yahoo!, PayPal, etc]. Quem sabe se, com esta leitura, poderá ser uma oportunidade para o leitor ganhar uns trocados :-)
Essa popularidade também é originada pelo aumento da utilização de JavaScript [e por sua vez, AJAX] nas aplicações web [sites]. Ataques XSS baseados no DOM ainda são muito comuns encontrar nas aplicações web, muito por causa da complexidade de analisar códigos JavaScript [situação agravada quando o código está comprimido ou ofuscado].
Mas afinal o que é o DOM XSS?
DOM XSS é um ataque XSS[5] onde a ação nociva é executada como resultado de uma modificação no DOM [Document Object Model] do browser da vítima, presente num script do lado do cliente. Isto significa que, a resposta HTTP não é modificada mas o código do lado do cliente é executado de uma forma “diferente” [ou maliciosa] do habitual.
Ao contrário de outros ataques XSS, o DOM XSS opera do lado do cliente [client-side] e não no lado do servidor [server-side].
Por outras palavras, geralmente, uma aplicação web contém códigos em JavaScript que gerem o input do utilizador no HTML. Estes códigos controlam a aplicação web através do DOM. Uma injeção de código arbitrário no DOM é intitulado de DOM XSS.
Dependendo do tipo de vulnerabilidade, um utilizador malicioso pode utilizar ataques DOM XSS para roubo de dados de autenticação, phishing e até mesmo para propagar malware. Como os ataques DOM XSS são executados no browser da vítima, monitorizar este tipo de atividade pode ser uma tarefa difícil. Digo isto porque em determinados casos, o vector de ataque DOM XSS não passa sequer pelo servidor. Se a ação nociva estiver inserida num identificador hash (após o caracter #), os browsers não enviam essa parte do URL para os servidores.
Esta situação não ocorre apenas nos identificadores hash mas também em algumas novas funcionalidades HTML5, como o LocalStorage e o IndexedDB.
Tome como exemplo o seguinte código JavaScript numa página index.html:
var foobar = location.hash; document.write(foobar);
Se aceder ao endereço com o browser Mozilla Firefox [Google Chrome bloqueia algumas tentativas de XSS - mas não todas :-)]:
http://site-que-nao-existe.pt/index.html
Não vai surgir nada no ecrã. No entanto se colocar:
http://site-que-nao-existe.pt/index.html#1234
Irá surgir no ecrã #1234 [valor da propriedade hash do objeto location].
Dado que não existe qualquer tipo de validação do input do utilizador, é possível injetar código HTML.
Testamos então injetar no location.hash o seguinte:
#1234<img src=x onerror=prompt(1);>
Acabou de explorar uma falha DOM XSS.
Convém referir que nem todas as falhas DOM XSS são fáceis de detetar. Na maioria dos casos, é necessário ter um conhecimento mais avançado da linguagem Javascript.
Mas existem formas mais automáticas para analisar este tipo de falha.
Poderá programar a sua própria ferramenta, utilizando as expressões regulares disponibilizadas pelo DOM XSS Wiki[4]:
Detetar fontes [é a origem do conteúdo, ou seja, donde vem a informação - por exemplo: document.URL]:
/(location\s*[\[.])|([.\[]\s*["']?\s*(arguments|dialogArguments|innerHTML|write(ln)?|open(Dialog)?|showModalDialog|cookie|URL|documentURI|baseURI|referrer|name|opener|parent|top| content|self|frames)\W)|(localStorage|sessionStorage|Database)/
Detetar sinks [funções de JavaScript que poderão permitir executar strings como JavaScript]:
/((src|href|data|location|code|value|action)\s*["'\]]*\s*\+?\s*=)|((replace|assign|navigate|getResponseHeader|open(Dialog)?|showModalDialog|eval|evaluate|execCommand|execScript|setTimeout|setInterval)\s*["'\]]*\s*\()/
Caso contrário, já existem muitas ferramentas que auxiliam na pesquisa por DOM XSS:
- DOMinatorPRO [Licença comercial]
- Acunetix Web Vulnerability Scanner [Licença comercial]
- DOM-XSS Scanner [Plugin gratuito que necessita do Burp Suite 1.5]
- Ra.2 - Blackbox DOM XSS Scanner [Gratuito]
- DomXSScanner [Gratuito e online]
No artigo DOM XSS - Parte 3 irei focar-me numa destas ferramentas, com exemplos práticos e dicas de utilização.
Como um vídeo vale mais do 1,8 milhões palavras, penso que é importante salientar estas duas apresentações em vídeo porque demonstram muito bem, pela voz de dois grandes especialistas, o que é o DOM XSS.
In the DOM - No one will hear you scream By Mario Heiderich
Sapo CodeBits V - Stefano di Paola
Como corrigir?
São imensos os casos que podem ocorrer para corrigir falhas DOM XSS. Passa sempre por filtrar [um bom lema para os programadores web - encode and sanitize] todos os parâmetros possíveis de modificação por parte de um utilizador.
A OWASP[6] tem uma página[7] dedicada exclusivamente à prevenção de falhas DOM XSS. Essa página explora vários tipos de cenários e contribui bastante para uma boa regra de etiqueta na programação de aplicações web.
Na segunda parte deste artigo, irei fornecer 3 exemplos de casos reais que irão ajudar o leitor a entender melhor esta matéria.
Até lá!
Referências:
[1] https://www.owasp.org/index.php/DOM_Based_XSS
[2] http://www.amazon.com/XSS-Attacks-Scripting-Exploits-Defense/dp/1597491543
[3] http://www.websegura.net/entrevista-com-robert-hansen/
[4] https://code.google.com/p/domxsswiki/
[5] https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29
[6] http://www.owasp.org
[7] https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet
















