sql injection

Download SQL Injection

If you can't read please download the document

Upload: jurandi-franca

Post on 15-Jan-2016

6 views

Category:

Documents


1 download

DESCRIPTION

SQL Injection

TRANSCRIPT

AInjeo de SQL, mais conhecida atravs do termo americanoSQL Injection, um tipo de ameaa deseguranaque se aproveita de falhas em sistemas que interagem combases de dadosviaSQL. A injeo de SQL ocorre quando o atacante consegue inserir uma srie deinstruesSQL dentro de uma consulta (query) atravs da manipulao das entradas de dados de uma aplicao.

ndice[esconder]1Funcionamento

2Injeo de SQL Avanado

3Injeo "Cega" de SQL

4Ver tambm

Funcionamento[editar|editar cdigo-fonte]Para exemplificar o funcionamento da injeo de SQL, consideremos uma instruoSQLcomum:SELECT id, nome, sobrenome FROM autores;Essa instruo, que representa umaconsultana 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 daclusula 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" sostrings, 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 dalinguagemSQL, existe um erro desintaxenessa instruo, uma vez que a string passada para o camponome a apenas palavra "jo", pois a adio de apstrofo quebrou a delimitao dos apstrofos originais da consulta. Ointerpretadordo 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 docaractereponto-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 umnmero) por exemplo, nossa query aparecer como abaixo:SELECT id, forename, surname FROM authors WHERE id=1234Nesta situao, o atacante pode simplesmente adicionar uma instruo SQL no fim do 'input' numrico. Verificando osdialetosde SQL, vrios delimitadores podem ser usados noMicrosoftJetDBMSengine, por exemplo, datas podem ser delimitadas com o caractersustenido. 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 deloginemActive 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 connectionvar usernamevar 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 inglsAdvanced 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 comoBlind 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 pginaweb. 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 ferramentaHavij.