Cenário de ataque
- O atacante localiza a vulnerabilidade XSS num sítio Web utilizado pela vítima, por exemplo, o sítio Web de um banco
- A vítima está atualmente ligada a esta página
- O atacante envia à vítima um URL criado
- A vítima clica no URL
- 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>
- No conteúdo do atributo sem as aspas
x onclick=alert('XSS')em
<div class="x" onclick="alert('XSS')"></div>
- No
hrefatributo ef
javascript:alert('XSS') em
<a href="javascript:alert('XSS')"></a>
- Na cadeia dentro do código JavaScript
";alert('XSS')// em
<script>let username="";alert('XSS')//";</script>
- No atributo com o evento JavaScript
');alert('XSS')// onde ' é uma aspa simples, em
<div onclick="change('');alert('XSS')//')">João</div>
- No
hrefatributo 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
- Codificação de dados utilizando funções incorporadas encontradas em muitos linguagens de programação.
- 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.).
- Não utilize funções como
avaliaçãoouFunçãocom dados de utilizador não confiáveis. - 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 comotextContentoutexto interno. - Tenha cuidado ao redirecionar o utilizador para um URL que está sob o seu controlo. Risco de injeção
localização = 'javascript('XSS')'. - Filtrar HTML utilizando bibliotecas como
DOMPurificar. - Cuidado com o carregamento
.htmlou.svgficheiros. Pode criar um domínio separado a partir do qual os ficheiros carregados serão servidos. - Utilizar o
Política de segurança de conteúdosmecanismo. - 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