Ataques por injecção de instruções de SQL
SQL Injection é uma técnica de ataque, em que um invasor insere (ou "injeta") código SQL malicioso num campo de escrita livre de uma aplicação (online ou instalável no computador), com o objetivo de manipular ou comprometer a base de dados subjacente.
Este tipo de ataque pode resultar em diversas consequências (que podem ser graves!), como o acesso não autorizado a dados, a alteração de dados, a exclusão de dados ou até mesmo comprometimento total do servidor de base de dados.
O Papel do QA na Prevenção de SQL Injections
Como QA, é fundamental termos uma compreensão profunda sobre as vulnerabilidades das SQL Injections e como podem ser exploradas. Além dos métodos de teste e prevenção mencionados abaixo, como QA deves estar atento(a) às tendências e às novas técnicas de ataque que surgem constantemente. Ou seja, mantém-te informado(a).
Mas atenção: a prevenção eficaz das SQL Injections não é uma tarefa única, mas sim um processo contínuo que envolve a colaboração com toda a equipa de desenvolvimento.
Algumas acções que um QA pode executar são:
Testes de inserção de dados
Validação: garantir que todos os campos de inserção de dados realizam a devida validação e sanitização das entradas.
Injeção de código: testar os campos de inserção de dados com códigos de SQL maliciosos comuns, para verificar se a aplicação está vulnerável.
Revisão do código fonte
Analisar o código: realizar uma análise estática ao código para identificar práticas inseguras, como a concatenação de strings SQL.
Parâmetros preparados: verificar se a aplicação usa parâmetros preparados (prepared statements) para consultas SQL.
Testes Automatizados
Ferramentas de teste de segurança: utilizar ferramentas automatizadas que simulam os ataques de SQL Injections e verificar as vulnerabilidades da aplicação.
Cenários de teste: desenvolver scripts automatizados que realizam testes de injeção em diferentes pontos da aplicação.
Medidas de Segurança para Prevenir SQL Injections
1 - Utilização de Parâmetros Preparados
Usa parâmetros preparados e consultas parametrizadas em vez de concatenar strings SQL, a fim de garantir que os dados de entrada são tratados como dados e não como código SQL.
Exemplo em Python
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
2 - Validação e sanitização
Valida e sanitiza todas as entradas do utilizador, com recurso a bibliotecas de sanitização e frameworks que oferecem proteção contra as SQL Injection.
Exemplo em PHP
$username = mysqli_real_escape_string($connection, $_POST['username']);
3 - Políticas de acesso restritivas
Implementa (ou garante a implementação de) políticas de acesso restritivas à base de dados, garantindo assim que cada aplicação ou utilizador tem apenas as permissões necessárias para a utilização que lhe é devida.
Exemplo: Cria contas na base de dados com privilégios/acessos mínimos.
4 - Utilização de ORMs
Utiliza Object-Relational Mappers (ORMs) que gerem a construção de consultas SQL de forma segura.
Exemplo em Django (Python)
user = User.objects.get(username=username)
Exemplos de Testes para SQL Injections
T1 - Teste manual com Injeção de Código
Cenário: Formulário de login.
Entrada Maliciosa (SQL)
' OR '1'='1
Objetivo: Verificar se a aplicação permite o login sem credenciais válidas.
T2 - Teste Automatizado com Ferramentas de Segurança
Ferramentas: SQLMap, OWASP ZAP.
Exemplo com SQLMap (BASH)
sqlmap -u "http://example.com/login.php?username=test&password=test" --batch
T3 - Teste de Sanitização
Cenário: Campo de pesquisa.
Entrada Maliciosa (SQL):
'; DROP TABLE users; --
Objetivo: Verificar se a aplicação sanitiza a entrada e impede a execução de comandos SQL maliciosos.
T4 - Teste de Parâmetros Preparados
Cenário: Pesquisa de produtos por ID.
Teste (PYTHON)
cursor.execute("SELECT * FROM products WHERE id = ?", (product_id,))
Objetivo: Confirmar que a aplicação usa parâmetros preparados para consultas.
Como Estudar Mais sobre SQL Injections
Recursos Online:
OWASP (Open Web Application Security Project): Um dos melhores recursos para aprender sobre segurança web, incluindo as SQL Injection. O OWASP oferece guias, tutoriais e exemplos práticos.
PortSwigger Web Security Academy: Tem laboratórios interactivos para praticar a exploração e a defesa contra as SQL Injections.
Livros:
"SQL Injection Attacks and Defense" por Justin Clarke
Um guia abrangente sobre as SQL Injection, que aborda desde conceitos básicos até técnicas avançadas.
Cursos Online:
Udemy: Cursos como "Web Application Security: SQL Injection Defense" que aborda os fundamentos e técnicas avançadas de SQL Injection.
Coursera e edX: Estas plataformas que oferecem cursos sobre segurança de software e desenvolvimento seguro.
Pluralsight: Tem vários cursos sobre segurança web e SQL Injection especificamente.
Certificações
Certified Ethical Hacker (CEH):
A certificação CEH, oferecida pelo EC-Council, inclui módulos específicos sobre ataques com SQL Injection e as respectivas defesas.
GIAC Web Application Penetration Tester (GWAPT):
Esta certificação da SANS Institute foca-se em segurança de aplicações web, incluindo as SQL Injection.
OWASP Certified Secure Developer:
Embora não seja focada exclusivamente nas SQL Injection, esta certificação cobre práticas de codificação segura para prevenir várias vulnerabilidades, incluindo as SQL Injection.
Como propôr melhorias à equipa de desenvolvimento
Workshops e Treinos Internos
Organizar sessões de treino regulares para a equipa de desenvolvimento, sobre as práticas de codificação segura e prevenção das SQL Injection.
Convidar especialistas externos para guiar esses workshops especializados.
Implementação de ferramentas de Segurança
Propor a integração de ferramentas de análise estática e dinâmica na pipeline de CI/CD, para detectar possíveis SQL Injections e outras vulnerabilidades, de forma rápida e automática.
Ferramentas Recomendadas:
SonarQube: Para análise estática de código.
OWASP ZAP: Para testes de penetração dinâmica.
Revisão de código focada em Segurança
Propôr revisões de código específicas para segurança, onde um QA especializado em segurança - ou um programador com conhecimento em segurança - analisa o código para identificar potenciais vulnerabilidades.
Políticas de desenvolvimento seguro
Definir e implementar políticas de desenvolvimento seguro, que incluam diretrizes claras sobre o uso de parâmetros preparados, sanitização de entradas e práticas recomendadas para garantia de segurança.
Estabelecer checklists de segurança, que devem ser seguidas antes da disponibilização de qualquer nova funcionalidade.
Feedback contínuo e comunicação
Estabelecer canais de comunicação abertos, para que a equipa de QA possa dar feedback contínuo sobre possíveis vulnerabilidades e áreas de melhoria.
Utilizar ferramentas de mapeamento e acompanhamento de bugs, para documentar e acompanhar as vulnerabilidades de segurança identificadas.
Exemplos de testes e melhorias que podem ser executados e propostas
Teste de Injeção Manual
Tentar injectar código SQL em todos os campos de inserção, incluindo aqueles que podem parecer menos críticos, como campos de pesquisa, formulários de contacto, etc.
Teste Automatizado com SQLMap
Configurar o SQLMap para executar testes automatizados regularmente em ambientes de staging.
Análise de relatórios de vulnerabilidade
Utilizar relatórios de ferramentas como OWASP ZAP para identificar e corrigir vulnerabilidades identificadas.
Exemplo de Comando SQLMap:
sqlmap -u "http://example.com/login.php?username=test&password=test" --batch
Para ser eficaz na prevenção e detecção de SQL Injections, um QA deve ser e estar bem informado e deve ser pro-activo.
O que envolve estudar de forma contínua, obter certificações relevantes, participar em cursos e workshops, e colaborar com a equipa de desenvolvimento a fim de implementar práticas de segurança robustas e confiáveis.
A integração de ferramentas de segurança, revisões de código focadas em segurança e treinos regulares são fundamentais para manter a aplicação segura contra ataques através de SQL Injection.