Segurança das aplicações Web - vulnerabilidade XSS
Lukasz Kolko
Os ataques XSS permitem aos atacantes injetar scripts do lado do cliente em páginas Web visualizadas por outros utilizadores. Os principais efeitos desta vulnerabilidade são a possibilidade de execução de quaisquer acções no contexto do utilizador com sessão iniciada e a leitura de quaisquer dados no contexto do utilizador com sessão iniciada.
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, JavaScriptcódigo começa a ser executado para intercetar os dados do utilizador ou executar 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 a API do banco, ou o atacante pode efectuá-las posteriormente 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.
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ção ou Função com 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 como textContent ou texto 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 .html ou .svg ficheiros. 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údos mecanismo.
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