Fala pessoal!!, tudo jóia? 🙂
Estou de volta em mais um artigo na trilha de conhecimento de tópicos abordados na disciplina de Banco de Dados, porém com ênfase nos tópicos e sub tópicos sobre Administração e Segurança de Banco de Dados.
Recomendo a leitura prévia sobre os dois últimos artigos que publiquei sobre conceitos de segurança de banco de dados (Segurança em Banco de Dados: Parte1 e Segurança em Banco de Dados: Parte2). Sem mais delongas, vem comigo! 😉
Antes de adentrar no tópico principal do tema deste artigo (Injeção de SQL), gostaria de comentar sobre outras formas de ataque conhecidas e cobradas em questões de concursos:
- Negação de serviços: Conhecido como DOS – Denial Of Service, tem por objetivo tornar alguns recursos indisponíveis, principalmente por estresse, ocasionado por tentativas sucessivas de acesso, fazendo com os buffers sejam “estourados”, travando equipamentos e derrubando o serviço que estaria on-line.
- Escalada de privilégios não autorizada: O usuário malicioso tenta elevar seu privilégio, através de ataques em pontos que estejam vulneráveis nos SGBDs.
- Abuso de privilégios: Diferente do ataque por escalda de privilégios não autorizada, este ataque é feito por pessoas que possuem privilégios, atacando recursos do SGBD.
- Autenticação fraca: Um usuário malicioso consegue personificar a identidade de um usuário legítimo. Geralmente ocorrem em casos onde o esquema de autenticação de usuário é muito fraco, facilitando a tentativa de personificação.
Bem, vamos agora ao principal assunto do nosso artigo.
O SQL Injection (injeção de SQL)é uma técnica de ataque baseada na manipulação do código SQL, que é a linguagem utilizada para troca de informações entre aplicativos e bancos de dados relacionais.
Nesta forma de ataque, o atacante injeta uma entrada de cadeia de caracteres pela aplicação, que tenta mudar ou manipular a instrução SQL para o proveito do atacante, podendo prejudicar o banco de dados de várias maneiras, como na manipulação não autorizada do banco de dados ou recuperação de dados confidenciais. Pode, inclusive, causar negações de serviço.
Vejamos abaixo uma lista de tipos de ataques possíveis por via de injeção de SQL, segundo Navathe.
- Manipulação de SQL: O comando SQL é modificado na aplicação. Por exemplo, na cláusula WHERE são acrescentada condições, ou acrescentando componentes adicionais na consulta, como operadores de UNION, INTERSECT ou MINUS.
- Injeção de Código: Tenta acrescentar instruções SQL ou comandos adicionais nas instruções SQL já existentes, explorando algum bug na aplicação por tentativa de processamento de dados inválidos. A tentativa é mudar o curso da execução de um programa para invasão e obtenção de dados.
- Injeção de Chamada de Função: Nesse tipo de ataque, uma função do banco de dados ou chamada de função do sistema operacional é inserida em uma instrução SQL vulnerável, para manipular os dados ou fazer uma chamada do sistema privilegiada. Um exemplo, seria explorar uma função relacionada com comunicação de rede.
A proteção contra estes ataques de injeção de SQL pode ser obtida ao se utilizar certas regras de programação a todos os procedimentos e funções acessíveis pela Web. O foco é verificar e validar o que está sendo solicitado em meio as consultas e chamadas, vejamos abaixo algumas destas técnicas de proteção contra a injeção de SQL.
- Variáveis de Ligação:
- Nesta técnica são utilizados comandos parametrizados. Em vez de embutir a entrada do usuário na instrução SQL, ela deverá ser vinculada a um parâmetro. Vejamos um exemplo abaixo:
PreparedStatement stmt = conn.prepareStatement(“SELECT * FROM FUNCIONARIO WHERE FUNCIONARO_ID=? AND SENHA=?”);
stmt.setString(1, funcionario_id);
stmt.setString(2, senha);
Perceba que em vez de embutir a entrada do usuário na instrução, ela deverá ser vinculada a um parâmetro. Neste exemplo, a entrada ‘1’ é atribuída(vinculada) à variável de ligação “funcionário_id” e a entrada “2” à variável de ligação “senha”, em vez de passar os parâmetros de cadeia de caracteres diretamente.
- Nesta técnica são utilizados comandos parametrizados. Em vez de embutir a entrada do usuário na instrução SQL, ela deverá ser vinculada a um parâmetro. Vejamos um exemplo abaixo:
- Filtragem da Entrada:
- Nesta técnica, será feita validação da entrada, removendo caracteres de escape das cadeias de caracteres de entrada ao utilizar a função Replace do SQL. Um exemplo clássico, é substituir o uso de aspas simples (‘’) por aspas duplas (“”). Alguns ataques podem ser impedidos desta forma, pois os caracteres de escape podem ser uados para injetar ataques de manipulação.
- Segurança da Função:
- As funções de banco de dados, tanto padrão quanto personalizadas, devem ser restringidas, pois podem ser exploradas nos ataques de injeção de função SQL.
Questão de Concurso
(CEBRASPE/CESPE/TJCE/ANALISTA JUDICIÁRIO-CIÊNCIA DA COMPUTAÇÃO/2014)
A segurança é uma área importante a ser considerada pelos administradores de bancos de dados das organizações, haja vista que a segurança visa proteger os bancos de dados contra uma série de ameaças, sejam elas advindas de usuários internos ou externos. No que se refere a esse assunto, assinale a opção correta.
a) Uma VIEW é um mecanismo válido para que se restrinja o acesso a certos atributos de uma tabela, embora não seja possível criar restrições para um conjunto de tuplas
b) No controle de acesso, um usuário de banco de dados pode receber um privilégio específico sem que esteja relacionado às tabelas do banco de dados.
c) Um usuário, uma vez que possua o privilégio de INSERT acerca de determinada tabela, não pode receber novamente o referido privilégio para a mesma tabela.
d) Uma técnica eficiente para impedir um ataque de injeção de SQL é a utilização, ao máximo, das funções de banco de dados, em virtude desses objetos não serem alvos de ataques devido à dificuldade de se referenciá-los.
e) Manter um registro das operações realizadas no banco de dados é uma ação suficiente para que os dados sejam protegidos contra acesso não autorizado.
Questão maravilhosa para revisão, vamos por partes !
A letra a) está errada. Que a view é uma possibilidade de exibição de dados customizada, ou seja, inibindo alguns atributos de uma ou mais tabelas, tudo certo, mas, existe sim forma de restringir a visibilidade de linhas(tuplas), basta criar uma view com base em uma consulta que tenha cláusula WHERE com condições que tragam apenas um subconjunto de linhas de uma ou mais tabelas e em seguida atribuir um privilégio de SELECT para algum usuário em relação a esta view, ou seja, ele verá apenas dados que são filtrados ou seja, de algumas tuplas.
A letra b) está correta. Trata-se de privilégios obrigatórios, baseado em papéis.
A letra c) está errada. Poder receber ele pode, mas não vai fazer diferença alguma de forma direta. Ele pode também estar associado a mais de uma ROLE (regra), onde em ambas, possam haver por coincidência a mesma tabela envolvida.
A letra d) está errada. As funções são alvo preferido dos ataques de Injeção de SQL, pois as funções podem ter parâmetros de interesse para invasão, portanto seu uso em banco deve ser mais restrito.
A letra e) está errada, pois isso não garante estes acessos não autorizados, pode no máximo servir de auditoria futura.
Letra b).
É isso, vou ficando por aqui, desejo ótimos estudos para você!
Um forte abraço, e até o próximo artigo! 😉
====================================
Prof. Luis Octavio Lima
Analista em TI do Ministério da Economia e Professor do Gran Cursos Online