Atualmente, os aplicativos Web sofrem de uma variedade de vulnerabilidades.
Atualmente, os aplicativos Web sofrem de uma variedade de vulnerabilidades. O Cross Site Scripting (XSS) Ê uma das falhas de segurança de aplicativos da Web mais comuns, mas possivelmente a mais negligenciada. Ele ocupa a segunda posição no Top 10 dos 10 riscos de segurança de aplicativos da Web da OWASP para 2010.
O script entre sites ĂŠ um tipo de problema de injeção no qual scripts maliciosos (vb, js etc.) sĂŁo injetados em um site confiĂĄvel. As falhas do XSS ocorrem sempre que um aplicativo obtĂŠm dados nĂŁo confiĂĄveis ââ(geralmente fornecidos pelo usuĂĄrio) e os envia invĂĄlidos ou nĂŁo codificados para um navegador da web. O XSS permite que os invasores executem scripts no navegador da vĂtima e o script mal-intencionado pode acessar cookies, tokens de sessĂŁo ou outras informaçþes confidenciais retidas pelo navegador. Utilizados com esse site, eles podem atĂŠ reescrever o conteĂşdo da pĂĄgina HTML. Basicamente, explora a confiança que um navegador cliente tem no site. No XSS, o usuĂĄrio confia que o conteĂşdo exibido no navegador foi destinado ao site.Orkut .
Um exemplo de uma pĂĄgina vulnerĂĄvel ao XSS:
O seguinte segmento de código no JSP (Java Server Pages) lê um ID do funcionårio: empid, de uma solicitação HTTP e a exibe.
<% String empid = request.getParameter("empid"); %> ... ... Employee ID:
O cĂłdigo acima funcionarĂĄ corretamente se o empid contiver apenas texto alfanumĂŠrico padrĂŁo, mas se o empid tiver um valor que inclua script (js, vb etc.) ou meta-caracteres, o cĂłdigo (talvez malicioso) serĂĄ executado pelo navegador da web.
Tipos de XSS:
Existem basicamente trĂŞs tipos de falhas de XSS: refletidas, armazenadas e baseadas em DOM.
Refletido ou nĂŁo persistente:
O script entre sites refletido Ê o tipo mais comum de falha do XSS encontrada nos aplicativos da web atualmente. Nesse tipo de falha, o código injetado Ê refletido no servidor da Web, como em um resultado de pesquisa, em uma mensagem de erro ou em qualquer outra resposta que inclua entrada completa ou parcial enviada ao servidor como parte da solicitação.
O atacante precisa entregar o ataque Ă s vĂtimas por outra rota, como em uma mensagem de email ou em outro servidor da web. O invasor envia o link malicioso para a vĂtima e, quando a vĂtima ĂŠ enganada a clicar em um link malicioso ou enviar um formulĂĄrio especialmente criado (por meio da Engenharia Social etc.), o cĂłdigo injetado viaja para o servidor do aplicativo Web vulnerĂĄvel, o que reflete o ataque de volta ao navegador da vĂtima. O navegador, em seguida, executa o cĂłdigo malicioso, que veio de um servidor "confiĂĄvel".
Armazenado ou Persistente:
A vulnerabilidade XSS armazenada ĂŠ uma variante mais devastadora de uma falha de script entre sites. No tipo de falha Armazenada, o invasor pode injetar cĂłdigo malicioso no aplicativo vulnerĂĄvel e o cĂłdigo injetado ĂŠ armazenado permanentemente nos servidores de destino (em um banco de dados, campo de comentĂĄrio, log de visitante etc.) e, em seguida, exibido permanentemente nas pĂĄginas "normais" retornadas para outros usuĂĄrios durante a navegação regular. O XSS persistente ĂŠ bastante significativo quando comparado a outros tipos, pois o script malicioso de um invasor ĂŠ renderizado automaticamente, sem a necessidade de segmentar individualmente as vĂtimas ou atraĂ-las para um site de terceiros. Essa ĂŠ uma falha perigosa, pois qualquer dado recebido pelo aplicativo da Web vulnerĂĄvel (via email, logs do sistema etc.) que pode ser controlado por um invasor pode se tornar um vetor de injeção. Um exemplo clĂĄssico seria um invasor deixando um script mal-intencionado no campo de comentĂĄrios do blog de um aplicativo da web vulnerĂĄvel para blogs. O script malicioso serĂĄ executado nos navegadores dos usuĂĄrios que visitarĂŁo o blog posteriormente.
Baseado em DOM:
DOM ĂŠ uma especificação do World Wide Web Consortium (W3C), que define o modelo de objeto para representar estruturas XML e HTML. XSS baseado em DOM ou XSS tipo 0 ĂŠ uma falha XSS em que a carga Ăştil do ataque ĂŠ executada como resultado da modificação do "ambiente" DOM ââno navegador da vĂtima usado pelo script original do lado do cliente, para que o cĂłdigo do lado do cliente seja executado de uma maneira "inesperada". O XSS baseado em DOM nĂŁo ĂŠ resultado de vulnerabilidade em um script do lado do servidor, mas um tratamento inadequado dos dados fornecidos pelo usuĂĄrio no JavaScript do lado do cliente. Como os outros tipos de vulnerabilidades XSS, o XSS baseado em DOM pode ser usado para roubar informaçþes confidenciais ou invadir a conta do usuĂĄrio. No entanto, ĂŠ essencial entender que esse tipo de vulnerabilidade depende apenas do JavaScript e do uso inseguro de dados obtidos dinamicamente da estrutura do DOM.
Script atravĂŠs de um link malicioso
Nesse cenĂĄrio, o invasor envia uma mensagem de email criada para uma vĂtima que contĂŠm um link (contendo script malicioso) como o mostrado aqui:
<a href="http://VulnerableSite.com/registration.php?clprofile=<script"> malicious code here>Click here</a>
Quando um usuĂĄrio inocente clica nesse link, o URL ĂŠ enviado para o VulnerableSite.com, incluindo o cĂłdigo malicioso. Como o servidor legĂtimo envia uma pĂĄgina de volta ao usuĂĄrio, incluindo o valor de clprofile (perfil do cliente), o cĂłdigo malicioso serĂĄ executado no navegador da web do cliente. A Figura 1 mostra a ilustração do ataque.

Figura 1. Ataque via e-mail
SeqĂźestro de sessĂŁo (roubo de cookie)
Muitos sites usam autenticação de usuårio baseada em cookies e dependem apenas de cookies de sessão para autenticação entre solicitaçþes HTTP individuais e, como os scripts do lado do cliente geralmente têm acesso a esses cookies, exploraçþes simples de XSS podem roubar esses cookies. Nesse cenårio, o invasor pode enviar um link malicioso ou armazenar um script malicioso em uma pågina (XSS armazenada) do site vulneråvel. Quando a pågina maliciosa Ê exibida, o script malicioso Ê executado, coleta os cookies do usuårio e envia uma solicitação ao site do invasor com os cookies coletados. Usando essa tÊcnica, o invasor pode invadir a sessão do usuårio e obter informaçþes confidenciais, como mostra a Figura 2 .

Figura 2. Roubo de cookie e seqĂźestro de sessĂŁo
Como detectar se um site ĂŠ vulnerĂĄvel?
As falhas de script entre sites podem ser difĂceis de identificar e remover de um aplicativo Web. A melhor prĂĄtica para procurar falhas ĂŠ realizar uma intensa revisĂŁo de cĂłdigo e procurar todos os locais em que a entrada do usuĂĄrio por meio de uma solicitação HTTP possa entrar na saĂda HTML. Uma variedade de tags HTML diferentes (como <img srcâŚ>, <iframeâŚ>, <bgsound srcâŚ> etc.) pode ser usada para transmitir um JavaScript malicioso. As ferramentas do WebScanner como Burp Suite, WebInspect, Acunetix, Netsparker, Websecurify, NStalker etc. podem ser usadas para procurar essas vulnerabilidades da Web, mas, juntamente com o teste manual, como a maioria das ferramentas, apenas testam usando scripts comuns e ignoram diferentes codificaçþes e ignoram tĂŠcnicas ( descrito por RSnake: http://ha.ckers.org/xss.html ).
Como Ê diferente do CSRF (falsificação de solicitação entre sites)
Muitas vezes, as pessoas confundem entre XSS e CSRF. Ambas as vulnerabilidades requerem mÊtodos diferentes de exploração e proteção de aplicativos da web. A falsificação de solicitação entre sites ou a condução de sessþes Ê um tipo de ataque que força o usuårio final a executar açþes maliciosas indesejadas sem o conhecimento ou a intenção do aplicativo Web no qual eles estão atualmente autenticados. O script entre sites Ê a capacidade de fazer um site exibir o conteúdo fornecido pelo usuårio incorporado ao HTML / JavaScript. O CSRF explora a confiança que um site possui no navegador do usuårio, diferente do XSS, que tira proveito da confiança que um navegador cliente possui no site. No CSRF, o site confia que a solicitação proveniente do navegador do usuårio Ê pretendida por ele, enquanto no XSS o usuårio confia que o conteúdo exibido no navegador foi destinado ao site.
Um exemplo de ataque de CSRF:
Um usuårio, Bob estå navegando em um fórum, onde outro usuårio, Max postou uma mensagem. Esta mensagem Ê um link malicioso criado por Max, contendo um elemento de imagem HTML e refere uma ação no site do banco de Bob.
<img src="http://Bobbank.com/withdraw?acc_name=bob&amount=1000&to=max" />
Observe aqui que não hå um arquivo de imagem real, mas se o cookie de autenticação de Bob (para o site do banco) não tiver expirado, então, quando o navegador de Bob tentar carregar a imagem, ele enviarå automaticamente o formulårio de retirada (junto com o cookie de Bob), assim, uma transação não intencional da conta de Bob ocorrerå.
Atenuando a falha
As tĂŠcnicas a seguir podem ser usadas para proteger contra esta vulnerabilidade
UsuĂĄrio final: um usuĂĄrio pode tomar a seguinte medida para se proteger do XSS
Desativando scripts
Embora os designers da Web 2.0 e do Ajax sejam a favor do uso de JavaScript, alguns aplicativos da Web sĂŁo gravados para (opcionalmente) operar completamente sem a necessidade de scripts do lado do cliente. Isso permite que os usuĂĄrios desabilitem o script em seus navegadores antes de usar o aplicativo. Dessa forma, os usuĂĄrios nĂŁo seriam suscetĂveis a ataques XSS, mesmo que scripts potencialmente maliciosos do lado do cliente sejam inseridos sem codificação em uma pĂĄgina.
Alguns navegadores ou plug-ins de navegadores podem ser configurados para desativar scripts do lado do cliente por domĂnio. Uma dessas soluçþes para o Firefox e outros navegadores baseados no Gecko ĂŠ o complemento NoScript de cĂłdigo aberto que, alĂŠm de sua capacidade de desativar scripts por domĂnio, tambĂŠm fornece proteção anti-XSS, mesmo quando os scripts estĂŁo ativados, mas tambĂŠm pode diminuir a funcionalidade do site. Essa tĂŠcnica pode ser usada pelo usuĂĄrio para sua proteção contra a vulnerabilidade.
Final do desenvolvedor: as seguintes tĂŠcnicas podem ser usadas pelos desenvolvedores para liberar o aplicativo Web do XSS
Codificação de saĂda
O principal mecanismo de defesa para interromper o XSS ĂŠ a codificação ou saĂda de saĂda contextual. "Escapar" ĂŠ uma tĂŠcnica usada para garantir que os caracteres sejam tratados como dados, nĂŁo como caracteres relevantes para o analisador do intĂŠrprete. Ă o principal meio de garantir que dados nĂŁo confiĂĄveis âânĂŁo possam ser usados ââpara transmitir um ataque de injeção. NĂŁo hĂĄ mal em escapar dos dados corretamente - eles ainda serĂŁo renderizados no navegador corretamente. O escape simplesmente permite que o intĂŠrprete saiba que os dados nĂŁo devem ser executados e, portanto, impede que os ataques funcionem. Um cĂłdigo de exemplo no JSP para escape ĂŠ mostrado abaixo.
public static String encode(String data) { final StringBuffer newbuf = new StringBuffer(); final char[] chars = data.toCharArray(); for (int i = 0; i < chars.length; i++) { newbuf.append("&#").append((int) chars[i]); } return newbuf.toString(); }
Quando uma entrada maliciosa no formato de script Ê inserida atravÊs do campo nome de usuårio, a pågina vulneråvel exibe um pop-up de alerta, conforme exibido na Figura 3 . Isso pode levar ao seqßestro de sessþes, desfiguração do lado do cliente etc.

Figura 3: O pop-up ocorre para uma entrada semelhante na pĂĄgina vulnerĂĄvel
Para uma entrada semelhante na pĂĄgina segura, nĂŁo hĂĄ efeito, pois a saĂda ĂŠ codificada, como mostra a Figura 4 .

Figura 4: Nenhum efeito de entrada maliciosa na PĂĄgina segura
Validando entrada nĂŁo confiĂĄvel
A validação de entrada Ê simplesmente verificar a validade de cada entrada. Isso pode significar muitas coisas, mas, no caso mais simples, significa verificar o tipo e o comprimento dos dados. Nesse caso, pode significar verificar entradas comuns com script, suas variaçþes e formas codificadas. Se a validação de entrada for feita corretamente em todo o código do site, eliminaremos um grande número de vulnerabilidades, como XSS e SQL Injection, etc. A validação de entrada deve ser realizada em qualquer dado recebido que não seja controlado e confiåvel. Isso inclui dados fornecidos pelo usuårio, dados de terceiros ou outros locais.
Antes de usar os dados recebidos nĂŁo confiĂĄveis, siga as etapas a seguir:
- Normalize
URL / UTF-7 / Unicode / US-ASCII / etc. decodificar os dados recebidos. - Verificação do conjunto de caracteres
Verifique se os dados contĂŞm apenas caracteres esperados. - Restriçþes de comprimento (mĂnimo / mĂĄximo)
Verifique se os dados estĂŁo dentro de um nĂşmero mĂnimo e mĂĄximo restrito de bytes. - Formato dos dados
Verifique se a estrutura dos dados ĂŠ consistente com o que ĂŠ esperado.
Implementando WAFs
Os firewalls têm sido amplamente utilizados para proteger os servidores implementando regras baseadas em rede; da mesma forma, um firewall de aplicativo da web (WAF) Ê um dispositivo, plug-in de servidor ou filtro que aplica um conjunto de regras a uma conversa HTTP. Geralmente, essas regras abrangem ataques comuns, como XSS (Cross-site Scripting) e SQL Injection. Ao personalizar as regras para o aplicativo, muitos ataques podem ser identificados e bloqueados. O esforço para executar essa customização pode ser significativo e precisa ser mantido à medida que o aplicativo Ê modificado. Alguns exemplos comuns de WAF são ModSecurity e PHPIDS.
API de segurança
ESAPI (A API de segurança corporativa da OWASP) Ê uma biblioteca de controle de segurança de aplicativos da web de código aberto e gratuita desenvolvida pela OWASP, que facilita aos programadores a criação de aplicativos de menor risco. As bibliotecas ESAPI foram projetadas para facilitar a adaptação dos programadores à segurança dos aplicativos existentes. As bibliotecas ESAPI tambÊm servem como uma base sólida para novos desenvolvimentos.
Os mĂłdulos e seu lugar na arquitetura do aplicativo podem ser vistos na Figura 5 .
Os mĂłdulos e seu lugar na arquitetura do aplicativo podem ser vistos na Figura 5 .

Figura 5. MĂłdulos ESAPI ( www.owasp.org )
ConclusĂŁo
Com o advento da Web 2.0, os aplicativos da Web melhoraram significativamente a funcionalidade e a apresentação, mas, ao mesmo tempo, o fator de risco tambÊm aumentou. A implementação ignorante dessas tecnologias afeta a funcionalidade e o comportamento do aplicativo, o que representa um risco significativo para o usuårio final. O risco se torna ainda mais grave quando outra falha em um componente Ê fundida com ele (neste caso, XSS + CSRF). Portanto, para garantir a segurança, os desenvolvedores e os usuårios finais devem tomar as devidas precauçþes ao lidar com aplicativos da Web.
ReferĂŞncias para leitura adicional
ComentĂĄrios
Postar um comentĂĄrio