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.
CenĂĄrios de ataque
Alguns dos cenĂĄrios de ataque de amostra sĂŁo os seguintes:
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.
(Fonte: Jeremiah Grossman )
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 .

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

Ebook

Postagens mais visitadas