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.

