domingo, 12 de dezembro de 2010

Vulnerabilidades - Parte 2: SQL Injection


Olá pessoal,

Agora vou falar de outra vulnerabiliade das Aplicações Web: SQL Injection

O que é?

A Injeção de SQL, mais conhecida através do termo americano SQL Injection, é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com bases de dados via SQL. A injeção de SQL ocorre quando o atacante consegue inserir uma série de instruções SQL dentro de uma consulta (query) através da manipulação das entrada de dados de uma aplicação.

Funcionamento

Para exemplificar o funcionamento da injeção de SQL, consideremos uma instrução SQL comum:

SELECT id, nome, sobrenome FROM autores;

Essa instrução, que representa uma consulta na base de dados, retorna todas os registros das colunas "id", "nome" e "sobrenome" da tabela "autores". A partir desta mesma instrução, os registros a serem retornados podem ser restritos através da inclusão da cláusula WHERE, como é visto no exemplo abaixo:

SELECT id, nome, sobrenome FROM autores WHERE nome = 'josé' AND sobrenome = 'silva';

Com base nesta instrução, é fácil supor que "josé" e "silva" são strings, cujo conteúdo será preenchido pela entrada feita por algum usuário que estiver fazendo uso da aplicação.

Portanto, supondo que a aplicação não faça o tratamento apropriado do conteúdo inserido pelo usuário, o mesmo pode fazer o uso acidental do caractere de aspas simples ou maliciosamente atacar o sistema, veja o exemplo:

- nome = jo'; DROP TABLE autores ; --
- sobrenome = silva

Fazendo com que a aplicação gere o código:

SELECT
id, nome, sobrenome FROM autores WHERE nome = 'jo'; DROP TABLE autores ; --' AND sobrenome = 'silva';

Neste caso, a instrução será executada normalmente, pois não há um erro de sintaxe, no entanto, com a adição do caractere ponto-e-vírgula, a instrução foi dada como finalizada de modo prematuro dando espaço para uma nova instrução. Essa nova instrução, que poderia ser qualquer uma escolhida pelo atacante, pode ser a responsável por retornar dados confidenciais armazenados na base de dados ou de executar instruções que comprometam o sistema, como a remoção de dados e/ou tabelas, como pode ser visto no exemplo apresentado.

Outro exemplo: Logando sem permissão

Entradas do usuário

- nome = louco' OR 1=1 ; --
- sobrenome =

Supondo que este seja o comando que verifica se o usuário existe e se a senha está correta.

Fazendo com que a aplicação gere o código:

SELECT
id, nome, sobrenome FROM autores WHERE nome = 'louco' OR 1=1 ; --' AND sobrenome = '';

a partir de "--" o comando se torna inválido pois estes caracteres são usados para criar comentários, o que interpretador vai executar será o seguinte comando:

SELECT id, nome, sobrenome FROM autores WHERE nome = 'louco' OR 1=1;

como 1 é igual a 1, então o login será autenticado com sucesso.

Uma simples solução:

Aparentemente um método para prevenir esse problema seria a remoção de aspas simples dos campos de inserção da aplicação, ou simplesmente não executando a query nestas situações. Isso é verdade, mas existem várias dificuldades com esse método tanto quanto soluções
.


Então é isso pessoal, muito cuidado com as SQL Injection.

abraços,

Nenhum comentário:

Postar um comentário