Você está na página 1de 4

A Injeo de SQL, mais conhecida atravs do termo americano SQL Injection, um tipo

de ameaa de segurana que se aproveita de falhas em sistemas que interagem


combases de dados via SQL. A injeo de SQL ocorre quando o atacante consegue inserir
uma srie de instrues SQL dentro de uma consulta (query) atravs da manipulao das
entradas de dados de uma aplicao.

ndice
[esconder]

1 Funcionamento
2 Injeo de SQL Avanado
3 Injeo "Cega" de SQL
4 Ver tambm

Funcionamento[editar | editar cdigo-fonte]


Para exemplificar o funcionamento da injeo de SQL, consideremos uma
instruo SQL comum:
SELECT id, nome, sobrenome FROM autores;
Essa instruo, que representa uma consulta na base de dados, retorna todos os registros
das colunas "id", "nome" e "sobrenome" da tabela "autores". A partir desta mesma
instruo, os registros a serem retornados podem ser restritos atravs da incluso
da clusula WHERE, como visto no exemplo abaixo:
SELECT id, nome, sobrenome FROM autores WHERE nome = 'jos' AND sobrenome =
'silva';
Com base nesta instruo, fcil supor que "jos" e "silva" so strings, cujo contedo ser
preenchido pela entrada feita por algum usurio que estiver fazendo uso da aplicao.
Portanto, supondo que a aplicao no faa o tratamento apropriado do contedo inserido
pelo usurio, o mesmo pode fazer o uso acidental do caractere apstrofo. Gerando a
entrada:
nome = jo's
sobrenome = silva
E fazendo com que a aplicao gere o cdigo:
SELECT id, nome, sobrenome FROM autores WHERE nome = 'jo's' AND sobrenome =
'silva';
De acordo com a especificao da linguagem SQL, existe um erro de sintaxe nessa
instruo, uma vez que a string passada para o campo nome a apenas palavra "jo", pois
a adio de apstrofo quebrou a delimitao dos apstrofos originais da consulta.
O interpretador do SQL espera que o restante da instruo seja outros comandos SQL
vlidos que complementem a instruo principal. No entanto, como "s" no um
identificador vlido, essa instruo no ser executada e retornar um erro.

Com base neste problema, um possvel atacante pode manipular os dados de entrada a
fim de gerar um comportamento no esperado na base de dados.
Para exemplificar este conceito, consideremos na mesma consulta apresentada, a entrada
dos seguintes dados pela aplicao:
nome = jo'; DROP TABLE autores ; -sobrenome = silva
Fazendo com que a aplicao gere o cdigo:
SELECT id, nome, sobrenome FROM autores WHERE nome = 'jo'; DROP TABLE
autores ; --' AND sobrenome = 'silva';
Neste caso, a instruo ser executada normalmente, pois no h um erro de sintaxe, no
entanto, com a adio do caractere ponto-e-vrgula, a instruo foi dada como finalizada
de modo prematuro dando espao para uma nova instruo. Essa nova instruo, que
poderia ser qualquer uma escolhida pelo atacante, pode ser a responsvel por retornar
dados confidenciais armazenados na base de dados ou de executar instrues que
comprometam o sistema, como a remoo de dados e/ou tabelas, como pode ser visto no
exemplo apresentado.
Aparentemente um mtodo para prevenir esse problema seria a remoo de apstrofos
dos campos de insero da aplicao, ou simplesmente no executando a query nestas
situaes. Isso verdade, mas existem vrias dificuldades com esse mtodo tanto quanto
solues. Primeiro, nem todos os usurios inserem dados em forma de strings. Se o
usurio puder selecionar um autor pelo 'id' (presumivelmente um nmero) por exemplo,
nossa query aparecer como abaixo:
SELECT id, forename, surname FROM authors WHERE id=1234
Nesta situao, o atacante pode simplesmente adicionar uma instruo SQL no fim do
'input' numrico. Verificando os dialetos de SQL, vrios delimitadores podem ser usados
no Microsoft Jet DBMS engine, por exemplo, datas podem ser delimitadas com o
caracter sustenido. Portanto, escapando da execuo da adio de apstrofos, no
necessariamente uma soluo como demonstrado anteriormente.
Pode-se ilustrar esse ponto usando um exemplo de pgina de login em Active Server
Pages (ASP), que acessa um servidor de banco de dados SQL e tenta autenticar o acesso
em uma aplicao fictcia.
Abaixo est um pedao de cdigo de uma pgina de formulrio, em que um usurio insere
o username e o password para autenticao:
(...)
function Login( cn )
{
var username;
var password;
username = Request.form("username");
password = Request.form("password");
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and
password = '" + password + "'";
trace( "query: " + sql );

rso.open( sql, cn );
if (rso.EOF) {
rso.close();
}
}
function Main()
{
//Set up connection
var username
var cn = Server.createobject( "ADODB.Connection" );
cn.connectiontimeout = 20;
cn.open( "localserver", "sa", "password" );
username = new String( Request.form("username") );
if( username.length > 0) {
Login( cn );
}
cn.close();
}
A parte critica a parte do 'process_login.ascp' que cria uma 'query string':
var sql = "SELECT * FROM users WHERE username = '" + username + "' AND
password = '" + password + "'";
Se o usurio inserir os seguintes dados:
* Username: '; drop table users-* Password:
... a tabela 'users' ser apagada, negando o acesso para todos os usurios. A seqncia de
caracteres '--' o comentrio de uma linha de SQL, a o ';' denota o fim de uma query e o
comeo de outra. O '--' no fim do campo username requerido para que a query em
questo seja executada sem erros.
O atacante pode logar como qualquer usurio, se souber o nome do usurio, usando o
input abaixo:
Username: admin'-O atacante pode logar como o primeiro usurio da tabelas 'users', com a insero abaixo:
Username: ' or 1=1-O atacante pode ainda logar como um usurio completamente fictcio com o input abaixo:
Username: ' union select 1, 'fictional_user', 'some_password', 1-A razo para que isso funcione que a aplicao acredita que a linha 'constante' que o
atacante especificou parte do 'recordset' recuperado da base de dados.

Injeo de SQL Avanado[editar | editar cdigo-fonte]


Do ingls Advanced Sql Injection, esse mtodo consiste em explorar a injeo de
instrues SQL atravs do mtodo GET da pgina.
Atravs do mesmo, o invasor pode conseguir por exemplo, os dados de usurio e senha do
painel administrativo do site.

Injeo "Cega" de SQL[editar | editar cdigo-fonte]


Conhecido como Blind Sql Injection, esse mtodo assemelha-se ao anterior, a diferena
que nesse caso a pgina possui uma certa segurana e o invasor no visualiza os dados do
base de dados atravs da pgina web. O invasor descobre os dados desejados de 1 em 1
caractere, utilizando a funo SUBSTRING do SQL em conjunto com uma verificao
booleana.
Por exemplo, supondo que o usurio do sistema seja JOAO, o invasor vai ter um retorno
falso com a seguinte tentativa injetada na clusula WHERE:
... AND SELECT 1 FROM USUARIO WHERE SUBSTRING(USUARIO,1,1) = 'A'
No entanto, vai receber um retorno verdadeiro quando chegar na letra J:
... AND SELECT 1 FROM USUARIO WHERE SUBSTRING(USUARIO,1,1) = 'J'
Sabe-se que um retorno verdadeiro porque a pgina carregada normalmente, ao
contrrio de quando o retorno falso.
Muitos invasores conseguem dados de usurio e senha sem ao menos ter conhecimento
da teoria do mtodo, mas apenas por utilizar a ferramenta Havij.

Você também pode gostar