Download - 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.


Top Related