A Uma Visão da (In)Segurança na Web XSS- Cross-Site Scripting Attacks Segurança em Código Móvel • Tanenbaum / Wetherall – Redes de Computadores –Edição 5 – 2011, páginas 537, 538. Segurança em Código Móvel • No início, quando páginas Web eram apenas arquivos HTML estáticos, essas não continham códigos executável. • Mas, hoje, as páginas frequentemente contém pequenos programas (Aplets Java, controles ActiveX, código de JavaScript, ... Segurança em Código Móvel • Baixar e executar um código móvel num navegador, é sem dúvida, um risco de segurança. • Existem alguns métodos para minimizar esse risco de segurança. ActiveX • Programas binários X86 que podem ser incorporados às páginas Web. • Tem poder como qualquer outro programa do usuário e tem potencial para causar grandes danos. • A segurança se resume na decisão de executar ou não o controle ActiveX. ActiveX • O método que a Microsoft escolheu para tomar a decisão de executar ou não, chama-se Authenticode. • Baseado na ideia de assinatura de código. • Cada controle é acompanhado por uma assinatura digital – um hash do código, assinado pelo seu criador, com o uso de criptografia assimétrica. ActiveX • Quando um controle ActiveX aparece no navegador, esse verifica a assinatura, para ter certeza de que não foi adulterado em trânsito. • Se a assinatura estiver correta, o navegador consulta suas tabelas internas para ver se o criador do programa é confiável. • Se o criador for confiável, o programa é executado. ActiveX • Não é feito nenhum monitoramento do comportamento de execução do controle ActiveX, como um código móvel. • Se veio de origem confiável e não foi adulterado em trânsito, é executado pelo navegador. ActiveX • Não é verificado se o código é malicioso ou não. • Controles ActiveX podem ser desenvolvidos, distribuídos, mas podem ser desativados no navegador. ActiveX • Como não há como policiar milhares de empresas de software que poderiam escrever código móvel, a técnica de assinatura de código é um risco que pode ocorrer a qualquer momento. JavaScript • Não tem nenhum modelo de segurança formal. • Cada fornecedor cuida da segurança de modo diferente. • O problema é que permitir a execução de código estranho em seu navegador significa procurar problemas. JavaScript • Um código móvel pode permitir imagens gráficas atraentes e de interação rápida, e muito projetistas de sites acham que isso é muito mais importante que a segurança. Extensões do Navegador e Plug-ins • São programas que estendem a funcionalidade dos navegadores. • Complementos oferecem novos recursos ao navegador, como formas de interagir com páginas, gerenciamento de senhas, ... • Plug-ins, normalmente oferecem a capacidade de interpretar ou exibir um certo tipo de conteúdo, como PDFs e animações Flash. Extensões do Navegador e Plug-ins • Instalar é muito fácil. • São escritos, dependendo do navegador. • Se tornam parte da computação confiável do navegador. • Se o código tiver bugs, o navegador inteiro fica comprometido. Extensões do Navegador e Plug-ins • Problemas: – Esses programas podem se comportar de forma maliciosa. – Plug-ins dão ao navegador a capacidade de interpretar novos tipos de conteúdo. Frequentemente, o conteúdo está escrito numa linguagem de programação completa. – O código pode apresentar vulnerabilidades. • Solução: – Só devem ser instalados se realmente forem necessários e apenas de fornecedores confiáveis. Vírus • São outra forma de código móvel. • Mas, chegam sem ser convidados. • Desenvolvido para se reproduzir • Em geral, começa infectando programas executáveis no disco. Vírus • Quando um desses programas infectados é executado, o controle é passado ao vírus. • Que pode se difundir para outras máquinas. • Alguns infectam o setor de inicialização no disco, e quando a máquina é inicializada, o vírus é executado. Applets Java • Códigos Java que podem ser transferidos, da aplicação-página para serem executados no navegador, junto com a apresentação da página. • Depois que a página é carregada, o código da applet é interpretado na JVM do navegador. Applet Java • Cada instrução é examinada pelo interpretador antes de ser executada. • Isso dá ao interpretador a oportunidade de verificar se o endereço da instrução sendo interpretada é válido. • As chamadas de sistema também são interpretadas. Applet Java • Se o applet for não confiável (veio da Internet), ele é encapsulado em uma “sandbox”, para limitar seu comportamento e bloquear quaisquer tentativas de usar recursos do sistema. Applet Java • Se a applet tentar acessar recursos do sistema, a chamada de sistema é repassada a um gerenciador de segurança, que examina a chamada levando-se em consideração a política de segurança Java local, que permitirá acesso, ou não a recursos do sistema. Ataques com Applet Java • http://www.offensivesecurity.com/metasploitunleashed/SET_Java_Applet_Attack • https://nealpoole.com/blog/2011/10/javaapplet-same-origin-policy-bypass-via-httpredirect/ Cross-Site Scripting • Por Armando Gonçalves da Silva Junior • Trabalho de Graduação • UFPE-CIn • Novembro de 2009 Cross-Site Scripting • Cross-Site Scripting é um ataque encontrada normalmente em aplicações WEB que permite ao atacante inserir código malicioso em uma página visitada por outro usuário. • Vulnerabilidade encontrada: a Aplicação no lado do servidor não trata devidamente a entrada de dados ... Cross-Site Scripting (XSS) • Esse código malicioso somente vai afetar o navegador da vítima. • O código malicioso não é executado pelo servidor. Tipos de XSS • XSS Não Persistente (Reflected) • XSS Persistente (Storage) • XSS Baseado em DOM • Os não persistentes são os mais comuns, sendo os principais responsáveis por ataques de phishing. • Esse tipo de ataque depende de uma ação do usuário – normalmente um click num link malicioso. • O XSS se beneficia da confiança depositada pelo usuário no domínio. • Possivelmente, poucos clicariam em um link para http://www.evilsite.com/photos • Mas, caso um “amigo” mandasse a URL http://www.nasa-news.org/ %7D%3C/style%3E%3Cscript%3Ea=eval;b=alert;a(b(/XSS/ source));%3C/script%3E%27%22%3E%3Cmarquee%3E% Ch1%3EXSS%3C/h1%3E%3C/marquee%3E • O XSS persistente é o tipo mais perigoso, pois não depende da ação do usuário e frequentemente acontece em sites no qual o atacante pode postar texto, como, por exemplo, fóruns, Orkut, Twitter, Facebook. • Vírus do Orkut, que profiferou e virou um worm. • Um worm também começou a se proliferar, recentemente, no Twitter – o Mikeyy • DOM Based ocorre quando um código JavaScript usa o parâmetro passado na URL para escrever na própria página, e esse parâmetro não é uma entidade HTML. • O parâmetro abriga um código malicioso. Fluxo de Ataque, XSS Não Persistente. Cross-Site Scripting Atackes Cross-Site Scripting Não Persistente (Reflected XSS) • Ataques XSS do tipo não persistente são as mais encontradas na Web. • Uma lista de sites afetados pode ser encontrada em http://www.xssed.com Cross-Site Scripting Não Persistente (Reflected XSS) • Com referências a vários sites famosos como Google, Yahoo, Bradesco, HSBC e Banco do Brasil. Tela de busca do Banco do Brasil com o valor malicioso Resultado de busca Fluxo de Ataque, XSS não Persistente. • Um possível fluxo para esse ataque seria o envio, por parte do atacante, de SPAM com link malicioso, para caixa de entrada de email de vários usuários com alguma notícia referente ao Banco do Brasil, seguido por uma URL como esta: http://busca.bb.com.br/buscabb/busca/busca?q= %22%3E%3Cscript%3ECODIGOMALICIOSO%3C%2 Fscript%3E&x=12&y=9 Fluxo de Ataque, XSS não Persistente. • Como o usuário confia no domínio do banco, clicaria no link sem maiores ressalvas. • A resposta do servidor a tal URL seria a própria página do banco com um código malicioso embutido. Fluxo de Ataque, XSS não Persistente. • Com esse código sendo executado no browser da vítima, o atacante pode coletar todas as informações desejadas e enviá-las para um servidor próprio, sem que o usuário percebesse qualquer anomalia ou mesmo imaginasse que estava sendo vítima de um ataque. Fluxo de Ataque, XSS não Persistente Fluxo de Ataque, XSS não Persistente 1. Atacante manda um SPAM para diversas vítimas e uma delas clica no link passado, lembrando que essa URL é para a vítima de uma fonte confiável. 2. Ao clicar a Vítima passará será redirecionada para o site, e como resposta receberá a página da “notícia” mais o código malicioso embutido. 3. O navegador da vítima irá mandar informações para o host do atacante, como cookies. 4. O atacante rouba a sessão da vítima. Fluxo de Ataque, XSS não Persistente • Como agravante, para esse tipo de ataque existem algumas aplicações que guardam cookies persistentes os quais reautenticam o usuário a cada visita – também conhecido como a função “remember me”. • Nesse cenário, o atacante terá acesso permanente à conta da vítima. Fluxo de Ataque, XSS não Persistente • Casos comuns de ocorrências dessa vulnerabilidade são quando um parâmetro ou um cookie ecoado (o valor do parâmetro/cookie é escrito sem filtros) na página, possibilitando ao atacante inserir scripts maliciosos. Fluxo de Ataque, XSS não Persistente • Um exemplo ocorre quando o programador cria uma página para buscas. Tome-se como url da busca: http://www.infoconsumo.gov.br/busca/busca. asp Fluxo de Ataque, XSS não Persistente Fluxo de Ataque, XSS não Persistente Fluxo de Ataque, XSS não Persistente • A busca pela palavra Inmetro ecoa na página. • Então para inserimos um código malicioso deverá ser observado o código fonte. <input type="TEXT" name="SearchString" size="25" maxlength="100" value="Inmetro" class="caixaSimples"> Fluxo de Ataque, XSS não Persistente • Então, para executar um script, iremos passar como parâmetro ‘ "><script>alert('xss');alert(document.cookie)</script> • Assim teremos como resposta: <input type="TEXT" name="SearchString" size="25" maxlength="100" value="'"> <script>alert('xss');alert(document.cookie)</script>" class="caixaSimples"> Fluxo de Ataque, XSS não Persistente • O que acarretará a execução do script no navegador da vítima. Fluxo de Ataque, XSS não Persistente Fluxo de Ataque, XSS não Persistente • Então, de modo geral, para realizar XSS Reflected basta listar todos os parâmetros da página e colocar valores maliciosos para execução de scripts, tarefa essa feita por diversas ferramentas de detecção de vulnerabilidades. Fluxo de Ataque, XSS não Persistente • Como, por exemplo, Acunetix • Acunetix é uma ferramenta para: TEST and Demonstration site for Acunetix Web Vulnerability Scanner Fluxo de Ataque XSS Persistente Cross-Site Scripting Attack Fluxo de Ataque, XSS Persistente • Também chamado de Storage XSS. • O XSS persistente é semelhante ao Reflected. • A diferença entre eles está no fato de não ser necessário o atacante mandar a crafted URL – URL maliciosa – que é o endereço da página junto com código malicioso) para a vítima. Fluxo de Ataque, XSS Persistente • Uma vez que a página visitada já contém o código malicioso anteriormente inserido pelo atacante. • O código malicioso será executado a cada visita. Fluxo de Ataque, XSS Persistente • Nesse tipo de ataque existem dois tipos de armazenamento: no Cliente, ou no Servidor. • Os servidores, que guardam em sua base de dados informações passadas pelo usuário e as mostra para outros, são vítimas em potencial desse tipo de ataque. Fluxo de Ataque, XSS Persistente • Um exemplo em que acontece um XSS Persistente com Armazenamento no Servidor são comentários postados por usuários em um Blog ou Fóruns, que normalmente aceitam tags HTML. • Ao invés de comentários, o atacante insere um script malicioso. Fluxo de Ataque, XSS Persistente • Então, caso não haja um filtro, para tratar a informação no lado da aplicação, o atacante poderá injetar um código malicioso no comentário e quem visitar a página, para ler o suposto comentário, desse modo, rodará o script no seu navegador. • No exemplo a seguir, há um exemplo de um fórum que é vulnerável a esse ataque: Fluxo de Ataque, XSS Persistente • Exemplo: Fórum Vulnerável a XSS Persistente com Armazenamento no Servidor Fluxo de Ataque, XSS Persistente • Nessa página, usuários podem deixar mensagens para outros lerem. • Na figura anterior, o atacante vai deixar um código malicioso e para cada usuário que visite a página vai aparecer a mensagem: Fluxo de Ataque, XSS Persistente Resposta do Servidor XSS Persistente com Armazenamento no Servidor Fluxo de Ataque, XSS Persistente • No caso do XSS Persistente com armazenamento no Cliente, o alvo do ataque são alguns cookies do usuário que não irão ser excluídos ao fim da sessão. • Alguns sites usam o cookie do usuário para relembrar ações dele. Fluxo de Ataque, XSS Persistente • Considere-se um site que relembra o nome do usuário, segue o código em PHP. $name=$_COOKIE[“user”]; if (“” == $name) printf (“Welcome guest\n”); else printf (“Welcome back %s\n”, $name); Fluxo de Ataque, XSS Persistente • A página funcionaria normalmente, mas nada impediria do atacante setar o campo user para <script>alert(‘Poisoned Cookie..’)</script> • Então toda vez que a vítima entrasse no site ela receberia como mensagem: Fluxo de Ataque, XSS Persistente XSS Persistente com Armazenamento no Cliente Fluxo de Ataque, XSS Persistente • Quando esse tipo de ataque é descoberto em redes sociais, como Twitter, Orkut, Facebook, ... , normalmente são utilizados para criação de Worms. Fluxo de ataque com XSS persistente • Um exemplo desse ataque seria o worm Mikeyy, por Michel Mooney. • O autor, inseriu um código malicioso na página, fazendo com que qualquer um ao ler a mensagem "infectada“, executasse o código malicioso do "Mikeyy". Fluxo de ataque com XSS persistente Fluxo de ataque com XSS persistente • O fluxo de ataque com XSS persistente, da figura anterior) pode ser descrito da seguinte maneira: 1. O computador atacante injeta código malicioso, que vai persistir, em algum site/cookie vulnerável. 2. A vítima acessa o site vulnerável. 3. Como resposta da requisição a vítima recebe a página normal mais o código malicioso que está embutido no mesmo. 4. O código é executado pelo navegador da vítima. O computador da vítima manda dados para o atacante. Fluxo de ataque com XSS persistente • No caso do worm Mikeyy [3] e do vírus do Orkut[8], não houve intenção de roubo de dados, mas apenas da proliferação do código malicioso. • Nestes ataques, o passo quatro foi um pouco diferente, infectando a página do usuário (o perfil), ao invés de enviar as informações coletadas para um servidor do atacante. Fluxo de ataque com XSS persistente • O computador da vítima pode torna-se, assim, um computador atacante, continuando o ciclo até a falha XSS do site seja corrigida. Fluxo do Ataque XSS Persistente, Worm Fluxo do Ataque XSS Persistente, Worm • O fluxo do ataque com XSS Persistente, Worm , pode ser descrito como: 1. O computador Atacante injeta código malicioso em vários profiles, que vão persistir, em algum site vulnerável. 2. A vítima acessa o site vulnerável 3. Como resposta da requisição, a vítima recebe a página normal mais o código malicioso que está embutido no mesmo. O código é executado pelo navegador da vítima. 4. O computador da vítima injeta código malicioso no seu próprio profile e manda para todos os seus amigos o código malicioso, que vai persistir, agindo agora como computador atacante. DOM – W3C • O Document Object Model é uma interface neutra de plataforma e de linguagem que permite que programas e scripts dinamicamente acessar e atualizar o conteúdo, estrutura e estilo de documentos. • O documento pode ser processado e os resultados desse processamento podem ser incorporados de volta para a página apresentada. Cross-Site Scripting Dom-Based • DOM based XSS • O Document Object Model (DOM) Based XSS é uma forma diferente dos dois tipos de ataques já vistos. • Ambos os ataques se beneficiam de dados que possam ser manipulados e ecoam o resultado no código fonte tornando a página insegura. • O ataque XSS baseado em DOM não tem essa característica. Cross-Site Scripting Dom-Based • XSS DOM-Based segue o seguinte fluxo: 1. O usuário entra em uma página utilizando uma crafted URL. 2. A resposta do Servidor não contém o script malicioso de nenhuma forma. 3. Quando o navegador recebe a resposta, o script é executado. Cross-Site Scripting Dom-Based • Esse ataque é possível se a página atacada usa em seu código parâmetros passados na URL maliciosa, para gerar dinamicamente o conteúdo. • Caso a página possuísse o seguinte trecho de código ela conseguiria gerar mensagens de erros dinamicamente a partir do parâmetro mensagem. Cross-Site Scripting Dom-Based <script> var a = document.URL; a = unescape(a); document.write(a.substring(a.indexOf (“mensagem=”)+8,a.length)); </script> • Então para explorar essa vulnerabilidade bastava o atacante alterar o valor do parâmetro mensagem para um valor malicioso. Fluxo de Ataque com XSS DOM-Based • XSS DOM se baseia na exploração da geração de código dinâmico através de parâmetros passados pelo usuário. • Desse modo, tanto pode existir: - XSS Persistente baseado em DOM, - Não persistente baseado em DOM Fluxo de Ataque com XSS DOM-Based Fluxo de Ataque com XSS DOM-Based • O fluxo de ataque da figura anterior pode ser descrito: 1. Atacante manda SPAMs para diversas vítimas e uma delas clica no link passado, lembrando que essa URL é para a vítima de uma fonte confiável. 2. Ao clicar a Vítima passará será redirecionada para o site, e como resposta receberá a página da “notícia” mais o código malicioso que não estará no código fonte da página, e sim gerado dinamicamente no navegador. 3. O navegador da vítima irá mandar informações para o host do atacante, como o cookie. 4. O atacante furta a sessão da vítima.