XSS (Cross Site Scripting)
Last updated
Last updated
Se você está interessado em carreira de hacking e hackear o inhackeável - estamos contratando! (fluência em polonês escrita e falada é necessária).
Verifique se qualquer valor que você controla (parâmetros, caminho, cabeçalhos?, cookies?) está sendo refletido no HTML ou usado pelo código JS.
Encontre o contexto onde está refletido/usado.
Se refletido
Verifique quais símbolos você pode usar e, dependendo disso, prepare o payload:
Em HTML bruto:
Você pode criar novas tags HTML?
Você pode usar eventos ou atributos que suportam o protocolo javascript:
?
Você pode contornar proteções?
O conteúdo HTML está sendo interpretado por algum mecanismo JS do lado do cliente (AngularJS, VueJS, Mavo...), você poderia abusar de uma Injeção de Template do Lado do Cliente.
Se você não pode criar tags HTML que executem código JS, você poderia abusar de uma Injeção de Marcação Pendente - HTML sem script?
Dentro de uma tag HTML:
Você pode sair para o contexto HTML bruto?
Você pode criar novos eventos/atributos para executar código JS?
O atributo onde você está preso suporta execução de JS?
Você pode contornar proteções?
Dentro do código JavaScript:
Você pode escapar da tag <script>
?
Você pode escapar da string e executar código JS diferente?
Sua entrada está em literais de template ``?
Você pode contornar proteções?
Função Javascript sendo executada
Você pode indicar o nome da função a ser executada. ex.: ?callback=alert(1)
Se usado:
Você poderia explorar um DOM XSS, preste atenção em como sua entrada é controlada e se sua entrada controlada é usada por algum sink.
Ao trabalhar em um XSS complexo, pode ser interessante saber sobre:
Debugging Client Side JSPara explorar com sucesso um XSS, a primeira coisa que você precisa encontrar é um valor controlado por você que está sendo refletido na página da web.
Refletido intermediaramente: Se você descobrir que o valor de um parâmetro ou até mesmo o caminho está sendo refletido na página da web, você poderia explorar um XSS Refletido.
Armazenado e refletido: Se você descobrir que um valor controlado por você está salvo no servidor e é refletido toda vez que você acessa uma página, você poderia explorar um XSS Armazenado.
Acessado via JS: Se você descobrir que um valor controlado por você está sendo acessado usando JS, você poderia explorar um DOM XSS.
Ao tentar explorar um XSS, a primeira coisa que você precisa saber é onde sua entrada está sendo refletida. Dependendo do contexto, você poderá executar código JS arbitrário de diferentes maneiras.
Se sua entrada está refletida no HTML bruto da página, você precisará abusar de alguma tag HTML para executar código JS: <img , <iframe , <svg , <script
... estas são apenas algumas das muitas tags HTML possíveis que você poderia usar.
Além disso, tenha em mente a Injeção de Template do Lado do Cliente.
Se sua entrada está refletida dentro do valor do atributo de uma tag, você poderia tentar:
Escapar do atributo e da tag (então você estará no HTML bruto) e criar uma nova tag HTML para abusar: "><img [...]
Se você pode escapar do atributo, mas não da tag (>
está codificado ou excluído), dependendo da tag, você poderia criar um evento que executa código JS: " autofocus onfocus=alert(1) x="
Se você não pode escapar do atributo ("
está sendo codificado ou excluído), então dependendo de qual atributo seu valor está sendo refletido e se você controla todo o valor ou apenas uma parte, você poderá abusar disso. Por exemplo, se você controla um evento como onclick=
, você poderá fazê-lo executar código arbitrário quando for clicado. Outro exemplo interessante é o atributo href
, onde você pode usar o protocolo javascript:
para executar código arbitrário: href="javascript:alert(1)"
Se sua entrada está refletida dentro de "tags não exploráveis", você poderia tentar o truque do accesskey
para abusar da vulnerabilidade (você precisará de algum tipo de engenharia social para explorar isso): " accesskey="x" onclick="alert(1)" x="
Exemplo estranho de Angular executando XSS se você controla um nome de classe:
Neste caso, sua entrada é refletida entre <script> [...] </script>
tags de uma página HTML, dentro de um arquivo .js
ou dentro de um atributo usando o protocolo javascript:
:
Se refletido entre <script> [...] </script>
tags, mesmo que sua entrada esteja dentro de qualquer tipo de aspas, você pode tentar injetar </script>
e escapar desse contexto. Isso funciona porque o navegador primeiro analisará as tags HTML e depois o conteúdo, portanto, não notará que sua tag injetada </script>
está dentro do código HTML.
Se refletido dentro de uma string JS e o último truque não estiver funcionando, você precisaria sair da string, executar seu código e reconstruir o código JS (se houver algum erro, ele não será executado):
'-alert(1)-'
';-alert(1)//
\';alert(1)//
Se refletido dentro de literais de template, você pode incorporar expressões JS usando a sintaxe ${ ... }
: var greetings = `Hello, ${alert(1)}`
Codificação Unicode funciona para escrever código javascript válido:
Javascript Hoisting refere-se à oportunidade de declarar funções, variáveis ou classes após serem usadas, para que você possa abusar de cenários onde um XSS está usando variáveis ou funções não declaradas. Verifique a página a seguir para mais informações: