Injeção de SQL
Visão Geral
Um ataque de injeção SQL consiste na inserção ou "injeção" de uma consulta SQL
através dos dados de entrada do cliente para a aplicação. Um exploit de injeção SQL
de sucesso pode ler dados sensíveis do banco de dados, modificar os dados do banco
de dados (Insert / Update / Delete), executar operações de administração do banco
de dados (como desligar o DBMS), recuperar o conteúdo de um determinado arquivo
presente no arquivo DBMS do sistema e, em alguns casos emitir comandos para o
sistema operativo. Ataques de injeção de SQL são um tipo de ataque de injeção, no
qual comandos SQL são injetados na entrada do plano de dados, a fim de efetuar a
execução de comandos SQL predefinidas.
Modelagem de Ameaças
- Ataques de injeção SQL permitem que os atacantes de identidade falsifiquem,
adulterem dados existentes, causando problemas de repúdio, como anular transações
ou alterar os saldos, permitindo a divulgação completa de todos os dados no
sistema, destruir os dados ou torná-lo disponível, e tornar-se administradores do
servidor de banco de dados.
- Injeção de SQL é muito comum com aplicações PHP e ASP, devido à prevalência de
interfaces funcionais mais velhos. Devido à natureza de interfaces de programação
disponíveis, aplicações J2EE e [Link] são menos propensos a ter facilmente
exploração a injeções de SQL.
- A gravidade dos ataques de injeção de SQL é limitado pela habilidade do atacante
e imaginação, e, em menor medida, a defesa em profundidade contramedidas, como
baixas conexões de privilégio para o servidor de banco de dados e assim por diante.
Em geral, consideram SQL Injection a gravidade de alto impacto.
Erros de injeção SQL ocorrem quando:
Dados entram em um programa de uma fonte não confiável.
Os dados utilizados para construir dinamicamente uma consulta SQL
As principais conseqüências são:
Confidencialidade: Uma vez que os bancos de dados SQL, geralmente armazenam dados
sensíveis, perda de confidencialidade é um problema freqüente com as
vulnerabilidades de injeção SQL.
Autenticação: Se os comandos SQL pobres são usados para verificar nomes de usuário
e senhas, é possível se conectar a um sistema como outro usuário sem conhecimento
prévio da senha.
Autorização: Se as informações de autorização é realizada em um banco de dados SQL,
pode ser possível alterar essas informações por meio da exploração bem sucedida de
uma vulnerabilidade de injeção SQL.
Integridade: Assim como é possível ler informações sensíveis, também é possível
fazer alterações ou mesmo excluir essas informações com um ataque de injeção SQL.
Exemplos
Exemplo 1 ~
Em SQL:
select id, firstname, lastname from authors
Se a pessoa, desde que:
Firstname: evil'ex
Lastname: Newman
a cadeia de consulta vira:
select id, firstname, lastname from authors where forename = 'evil'ex' and surname
='newman'
que o banco de dados tenta executar como:
Incorrect syntax near il' as the database tried to execute evil.
A versão segura da instrução SQL acima poderia ser codificado em Java como:
String firstname = [Link]("firstname");
String lastname = [Link]("lastname");
// FIXME: do your own validation to detect attacks
String query = "SELECT id, firstname, lastname FROM authors WHERE forename = ? and
surname = ?";
PreparedStatement pstmt = [Link]( query );
[Link]( 1, firstname );
[Link]( 2, lastname );
try
{
ResultSet results = [Link]( );
}