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.

 
Anterior
Anterior

Scrumban - por detrás do conceito

Próximo
Próximo

Mocks - como utilizar?