Hoje em dia, alguns sites estão mais protegidos contra ataques XSS, fazendo alguns filtros que não permitem o ataque, entretanto, nós podemos evitar estes filtros através de alguns métodos que iremos ver mais abaixo:
- Bypass magic_quotes_gpc (se estiver ligado)
- Bypass com criptografia do html
- Bypass com ofuscação
- Bypass com com uma solução de contorno
Bypass magic_quotes_gpc
Quando o magic_quotes_gpc está ligado no PHP, significa que o servidor não permite a aspa dupla “, a barra / e aspa simples ‘, e para ignorar isto precisamos usar String.fromCharCode(). Nós escrevemos o nosso código dentro dos parênteses convertido em ASCII decimal separados por vírgula. Veja o exemplo de como seria um alert() comum:
<script>alert("XSS!")</script>
Precisamos converter o texto interno para ASCII incluí-lo entre os parênteses do String.fromCharCode() da seguinte forma:
<script>alert(String.fromCharCode("XSS!"))</script>
E usamos ele para o bypass da seguinte forma:
<script>alert(String.fromCharCode(88,83,83,33))</script
Duas observações importantes:
- Remova os zeros da frente dos números ASCII e separe com vírgula, como no exemplo;
- Não precisa utilizar as aspas duplas do alert comum, podendo inserir direto o texto ASCII.
Bypass com criptografia do HTML
Este método é simples e só precisamos codificar nosso código HTML em HTTP. Nosso código de alert normal é:
<script>alert("XSS!")</script>
E ficará assim:
%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%58%53%53%21%22%29%3C%2F%73%63%72%69%70%74%3E
E agora você pode usá-lo para injetar o XSS.
Bypass por ofuscação
Também é muito simples. Este filtro normalmente é utilizado para evitar palavaras-chave, como: script, alert, etc. Neste caso, precisamos alterar um pouco a característica das palavras, como:
- sCriPt
- aLeRt
Ficando com o código da seguinte forma:
<sCriPt>alERt("XSS!")</sCrIpt>
Bypass por outros métodos
Geralmente nos scripts de busca, somente precisamos adicionar um “> no começo para fechar o campo atual, por exemplo:
http://sitealvodopentest.com/search.php?search="><script>alert("XSS!")</script>
E desta forma conseguimos ignorar no filtro.
Alerta no onerror
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>
Veja mais alguns exemplos interessantes sobre como ignorar os filtros XSS no site da OWASP.
E abaixo está uma lista que achei no Github: