XSS - Filter Evasion and WAF Bypassing
Anotações e resumos dos meus estudos pessoais para a eWPTX

Os dois principais cheat sheet para XSS:
https://html5sec.org/ https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html
Bypassing Blacklisting Filters
Injecting Script Code
Bypass no bloqueio da tag <script>
Bypass no bloqueio da tag <script> usando atributos do HTML
Nos dois últimos exemplos, pode-se usar no endereço essa ferramenta:
https://github.com/evilcos/xss.swf
Bypass no bloqueio da tag <script> usando eventos do HTML
Normalmente o evento mais usado é o onerror:
Mas existem vários outros eventos que podem ser usados, uma lista com eles se encontra no link:
http://help.dottoro.com/lhwfcplu.php
Alguns exemplos:
É muito comum, do ponto de vista defensivo, bloquear eventos que comecem com on*, isso pode ser byppassado com:
Algumas regras mais avançadas conseguem bloquear esses payloads, elas podem ser bypassadas com os seguintes exemplos:
Uma lista de caracteres que podem ser usados entre o evento e o sinal de igual, ou antes do nome do evento:
Como os browsers estão em constante mudança, existe uma ferramenta que realiza o fuzzing para descobrir os caracteres que podem ser usados de acordo com a versão do browser
http://shazzer.co.uk/vector/Characters-allowed-after-attribute-name http://shazzer.co.uk/vector/Characters-allowed-brfote-attribute-name
Keyword Based Filters
Character scaping
Imaginando um cenário onde a palavra alert está bloqueada (ignorando alternativas como prompt, confirm, etc...)
Construindo string
Execution Sinks
Lista completa com todos os sinks:
https://code.google.com/archive/p/domxsswiki/wikis/ExecutionSinks.wiki
Pseudo-protocolos
javascript:
javascript: é um URI scheme não oficial, usado para invocar código JavaScript com um link
Além do javascript: também existe o data: e o vbscript: (exclusivo do IE)
data:
Estrutura do data:
vbscript:
Bypassing Sanitization
Removing HTML Tags
Frequentemente os mecanismos de segurança acabam sanitizando potenciais vetores de ataque XSS. O mais comum é o HTML encode que troca alguns caracteres como: < (<) e > (>). Em algumas situações o filtro vai remover a palavra chave como a tag <script>
Uma má configuração comum é remover somente o primeiro encontro da expressão, isso permite, por exemplo, realizar o bypass da seguinte maneira:
Alguns filtros realizam buscas recursivas, porém, normalmente eles são configurados para verificar uma palavra recursivamente e quando a verificação acaba ele vai para a próxima palavra, ao final ele não volta a verificar uma palavra que já passou.
Isso permite que o bypass seja realizado da seguinte forma:
Dependendo do vetor de ataque, também é possível usar algumas técnicas vistas anteriormente
Escaping Quotes
Normalmente quando conseguimos injetar um código JavaScript ele está dentro de aspas, e quando tentamos colocar alguma aspas para terminar a string ela é escapada com o \
Imaginamos o seguinte cenário:
Nosso payload é injetado no lugar de "randomkey". Podemos tentar realizar o bypass enviando também uma "\".
Exemplo:
Um método útil é o String.fromCharCode() que permite gerar strings a partir de uma sequência de valores unicode
Também pode ser usado o método unescape para escapar uma string gerada com o .source, exemplo:
Adicionalmente a esse método existe o decodeURI e o decodeURIComponent. Nesse caso os componentes precisam estar com o formato URL encode
Todos esses métodos retornam uma string, então é necessário usar um sink para executar o código, como por exemplo, o eval
Escaping Parentheses
Uma forma de executar o código sem usar parenteses:
Bypassing Browser Filters
Dentro da Tag HTML
Dentro do atributo da Tag HTML
Dentro da Tag script
Dentro de atributo Event
DOM Basec
Last updated