Postagens populares

Oh vida "vea" boa

quarta-feira, 23 de junho de 2010

Injeção de SQL

Injeção de SQL é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com base de dados via SQL. O ataque ocorre quando se consegue inserir uma série de instruções SQL dentro de uma consulta através da manipulação das entradas de dados de uma aplicação.
Para entender o funcionamento consideremos a instrução SQL sequinte:

SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS;


Esta instrução retorna todos os registros da tabela usuários de um sistema. A partir desta mesma instrução os registros a serem retornados podem ser restritos através da inclusão da clausula WHERE, por exemplo:

SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = “ADMIN” AND SENHA = “12345”;


Se a aplicação não tratar apropriadamente o conteúdo inserido pelo usuário ela poderá gerar uma entrada indesejada e retornar informações que não deveriam ser expostas. É comum aplicações criadas com PHP que com frequencia tem suas instruções SQL criadas através das variáveis que compõem os parametros recebidos por um script-server-side oferecerem maior vulnerabilidade para este tipo de ataque. O código, em PHP, a seguir ilustra uma possibilidade de ataque:

1. 2. $usuario = $_POST['usuario'];
3. $senha = $_POST['senha'];
4.
5. $query_string = “SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = '{$usuario}'
AND SENHA = '{$senha}';
6. ?>


Com a entrada de dados abaixo é possivél ter como retorno todos os registro da tabela.




Essa entrada faz com que a aplicação gere o sequinte código:

SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = “” AND SENHA = “” or 1 = 1;


Através desse tipo de falha os estragos podem ser muito maiores pois basta inserir no campo senha do formulário de login ; DROP TABLE USUARIOS --, essa instrução irá gerar código a seguir:

SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = “” AND SENHA = “”; DROP TABLE USUARIOS --;


Neste caso as intruções seram executada pelo banco de dados sem nenhum problema pois não possuem erros de sintaxe. O primeiro “;” encerra a primeira instrução e possibilitará a execução da instrução que apaga a tabela de usuários.

Em Java ou qualquer linguagem de programação, ao acessar a base de dados, se as instruções SQL forem concatenadas como a consulta em PHP acima o resultado será o mesmo. Por exemplo:

{
...
conn = pool.getConnection( );
String sql = “SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = '” + usuario + “'
AND SENHA = '” +senha + ”'”;
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
...
}


Como estratégia de defeza, para se prevenir de injeção de SQL, recomenda-se que todas as consultas sejam parametrizadas, nunca deve-se concaternar strings para criar instruções SQL.

{
...
String nome_usuario = request.getParameter("usuario");
String senha_usuario = request.getParameter("senha");
conn = pool.getConnection( );
String sql = “SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = ?
AND SENHA = ?”;
PreparedStatement pstmt = connection.prepareStatement( sql );
pstmt.setString( 1, nome_usuario);
pstmt.setString( 2, senha_usuario);
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
...
}


Essa é uma das estratégias para nos previnirmos deste tipo de ataque, como enunciado no conceito de injeção de sql ela se utiliza de falhas nos sistemas que acessam base da dados. Visto isso o que pode ser feito é criar aplicativos seguindo as especificações de segurança necessárias para evitar esse tipo de ataque.


BIBLIOGRAFIA

http://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_SQL
[11h01 23/06/2010]

http://www.totalsecurity.com.br/article.php?sid=732
[00h23 23/06/2010]

http://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java
[01h56 24/06/2010]