(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); thecodest, Autor em The Codest - Página 10 de 13

Cenário de ataque

  1. O atacante localiza a vulnerabilidade XSS num sítio Web utilizado pela vítima, por exemplo, o sítio Web de um banco
  2. A vítima está atualmente ligada a esta página
  3. O atacante envia à vítima um URL criado
  4. A vítima clica no URL
  5. Sobre a vítima banco sítio Web, JavaScript código começa a ser executado para intercetar o dados ou efetuar uma transferência em seu nome para a conta do atacante

É de salientar que as operações efectuadas em nome da vítima podem ser invisíveis para esta, uma vez que podem ocorrer em segundo plano, utilizando o API, ou o atacante pode efectuá-las mais tarde com os dados necessários para a autenticação, tokens, cookies, etc.

Tipos de XSS

1. XSS refletido

É aquele em que o código HTML/JavaScript contido em qualquer parâmetro (por exemplo, GET, POST ou cookie) é apresentado na resposta.

Uma página com uma entrada de texto para procurar algo que coloca o parâmetro ?search=foo no final do URL ao consultar a API. Depois de introduzir qualquer frase, se esta não for encontrada, é colocada uma mensagem de retorno em HTML ex.

<div>Nenhum resultado encontrado para <b>bobo</b></div>

Podemos tentar introduzir o URL ?search=..

2.DOM XSS

Isto acontece quando a sua execução é activada pela utilização de funções perigosas no JavaScript, tais como `eval` ou `innerHtml`. O "exemplo em direto" abaixo mostra um ataque DOM XSS baseado no `innerHtml` função.

3. XSS armazenado

Esta é uma situação em que o código malicioso é escrito no lado do servidor. Por exemplo, podemos enviar um comentário com código malicioso para uma publicação de blogue que é carregada no servidor. A sua tarefa é, por exemplo, aguardar a moderação do administrador e depois roubar os seus dados de sessão, etc.

Métodos de injeção

1. No conteúdo da etiqueta

`onerror=alert('XSS')`em

<img src onerror="alert('XSS')" />

2. No conteúdo do atributo

`" onmouseover=alert('XSS')` em

<div class="" onmouseover="alert('XSS')""></div>

  1. No conteúdo do atributo sem as aspas

x onclick=alert('XSS')em

<div class="x" onclick="alert('XSS')"></div>

  1. No hrefatributo ef

javascript:alert('XSS') em

<a href="javascript:alert('XSS')"></a>

  1. Na cadeia dentro do código JavaScript

";alert('XSS')// em

<script>let username="";alert('XSS')//";</script>
  1. No atributo com o evento JavaScript

');alert('XSS')// onde ' é uma aspa simples, em

<div onclick="change('&#39;);alert('XSS')//')">João</div>

  1. No href atributo dentro do protocolo JavaScript

);alert(1)// onde %27 é uma aspa simples, em

<a href="javascript:change('%27);alert(1)//')">clique</a>


Exemplo em direto

Métodos de defesa

  1. Codificação de dados utilizando funções incorporadas encontradas em muitos linguagens de programação.
  2. Utilizar sistemas de modelos com codificação automática. A maioria das estruturas populares que utilizam tais sistemas protegem nós da injeção de XSS (Django, Modelos, Vue, React etc.).
  3. Não utilize funções como avaliação ou Função com dados de utilizador não confiáveis.
  4. Não utilize funções e propriedades que atribuam código HTML diretamente aos elementos da árvore DOM, por exemplo, innerHTML, exteriorHTML, insertAdjacentHTML, ocument.write. Em vez disso, é possível utilizar funções que atribuem texto diretamente a estes elementos, tais como textContent ou texto interno.
  5. Tenha cuidado ao redirecionar o utilizador para um URL que está sob o seu controlo. Risco de injeção localização = 'javascript('XSS')'.
  6. Filtrar HTML utilizando bibliotecas como DOMPurificar.
  7. Cuidado com o carregamento .html ou .svg ficheiros. Pode criar um domínio separado a partir do qual os ficheiros carregados serão servidos.
  8. Utilizar o Política de segurança de conteúdos mecanismo.
  9. Dê uma vista de olhos aos filtros anti-XSS integrados nos browsers mais populares.

    Se achou este artigo interessante, siga o Lukasz no Github: https://github.com/twistezo

Ler mais:

Estratégias de obtenção de dados no NextJS

API Rails e CORS. Uma pitada de consciência

Porque é que deve (provavelmente) utilizar Typescript?

pt_PTPortuguese