Escolar Documentos
Profissional Documentos
Cultura Documentos
ndice
[esconder]
1 Funcionamento
2 Injeo de SQL Avanado
3 Injeo "Cega" de SQL
4 Ver tambm
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.