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: < (&lt;) e > (&gt;). 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