Injeção SQL

Fazer download em doc, pdf ou txt
Fazer download em doc, pdf ou txt
Você está na página 1de 6

Previna-se contra a Injeo SQL

A SQL - Structured Query Language - largamente usada para interagir com banco de dados relacionais. Se voc considerar que 90% das aplicaes utilizam banco de dados com suporte a SQL vai concluir que o uso da SQL quase uma unanimidade por ser prtica , fcil e porttil. Em se falando de aplicaes Web temos uma grande utilizao de banco de dados para armazenar as mais diversas informaes : endereos e documentos pessoais , contas e valores financeiros , nmeros de cartes de crdito , dados empresariais , etc. Ao colocar sua aplicao na Web voc a esta expondo a um acesso mais amplo e indiscriminado. Afinal qualquer um que tenha acesso a url do site ter acesso a sua aplicao e aos dados que ela disponibiliza. Pensando na segurana de suas informaes as empresas investem pesado em firewalls , certificao digital e outros recursos , com o objetivo de se proteger de invasores. Para que o controlar o acesso as informaes normalmente restringe-se o acesso aos usurios cadastrados usando um nome e senha para identificao ; estes dados so colhidos atravs de um formulrio de login e so ento verificados com as informaes armazenadas em um banco de dados dos usurios cadastrados; se estiverem corretas o acesso permitido caso contrrio o acesso negado. assim que funciona o home banking na internet e uma infinidade de outras aplicaes web na qual o acesso restrito. Voc pode ter o aparato mais moderno em termos de tecnologia de segurana protegendo o seu site de um ataque hacker e nem se dar conta de que a vulnerabilidade da sua aplicao esta ali naquele formulrio de login. Ele pode ser a porta de entrada para ataques maliciosos atravs da injeo de SQL. A injeo SQL ocorre quando um invasor consegue inserir comandos SQL na instruo SQL que voc usa no seu script de modo a burlar a restrio e ter acesso ou danificar as informaes armazenadas no seu banco de dados. Neste artigo eu vou mostrar como a injeo de SQL ocorre e falar sobre algumas das medidas que voc pode tomar para evit-la. Embora as informaes sejam focadas em pginas ASP e banco de dados SQL Server /Access elas se aplicam a qualquer script e banco de dados que usam um dialeto SQL.

Como ocorre a injeo SQL


Abaixo temos um tpico formulrio de login :

form name="frmLogin" action="login.asp" method="post"> Nome : <input type="text" name="nomeUsuario"> Senha: <input type="text" name="senhaUsuario"> <input type="Enviar"> </form> Geralmente quando o usurio clicar no boto - Enviar - o script login.asp ser executado para efetuar a validao dos dados informados. Abaixo temos um script tpico para um arquivo de validao de informaes: <% dim nomeUsuario, senhaUsuario, consulta dim conn, rS nomeUsuario = Request.Form("nomeUsuario") senhaUsuario = Request.Form("senhaUsuario") set conn = server.createObject("ADODB.Connection") set rs = server.createObject("ADODB.Recordset") consulta = "select count(*) from usuarios where nomeUsuario='" & nomeUsuario & "' and senhaUsuario='" & senhaUsuario & "'" conn.Open "Provider=SQLOLEDB; Data Source=(local); Initial Catalog=myDB; User Id=sa; senhaUsuario=" rs.activeConnection = conn rs.open consulta if not rs.eof then response.write "Acesso Concedido" else response.write "Acesso Negado" end if %> Vamos analisar o que ocorre quando um usurio tenta se autenticar. Vamos supor que ele usurio cadastrado com nome Macoratti e senha 123456 (s suposio). Ao informar o nome e a senha e clicar no boto Enviar o script do arquivo login.asp ser executado. Vamos ver como ficou a instruo SQL montada neste caso :

select count(*) from usuarios where nomeUsuario='macoratti' and senhaUsuario='123456'


Neste caso o usurio macoratti, senha 123456 ser autenticado e ter acesso ao sistema. Tubo bem ? No , se voc usa este tipo de instruo SQL nada esta bem pois o texto final da consulta SQL depende inteiramente do contedo das variveis , e , se o contedo

destas variveis no for validado e tratado o texto final concatenado poder ser um SQL adulterado atravs de uma injeo SQL. Quer ver ? Vou comear pegando leve. Vamos supor que um hacker decidiu invadir sua pgina. Uma das primeiras coisas que ele pode fazer tentar uma injeo SQL , e, vai comear verificando se voc esta tratando o apstrofe (aspa simples: '). Se voc no sabe a presena de um caractere de apstrofe (') no contedo de uma varivel concatenada no SQL usada para delimitar strings de texto. Ento suponha que ele digite os seguintes dados nos campos nome e senha: nome = tes'te senha = Se voc no tratar o apstrofe vai ocorrer um erro de SQL (incorrect Sintax) ,e , vendo isto o hacker vai ficar mais animado... Agora vou pegar pesado. Suponha ento que a seguir ele digite os seguintes dados nome = ' ; drop table users-senha = Este comando ir excluir a tabela users (se ela existir). E se voc pensa que muito difcil o hacker adivinhar o nome da sua tabela vou mostrar mais abaixo que ele pode fazer isto de uma maneira simples. Isto possvel pois o caractere (;) indica o fim de uma consulta e o comeo de outra em T-SQL , e , o caractere (--) no final da linha faz com que o scrpt ASP seja executada sem erro. Continuando o ataque , ele pode tambm informar o seguinte : nome = admin senha = ' or 1=1-veja como vai ficar a consulta SQL montada:

select count(*) from usuarios where nomeUsuario='admin' and senhaUsuario='' or 1=1--'


Aqui a consulta ir verificar se o nome do usurio admin e se senha vazio ou 1 for igual a 1 ( o que verdade) ; bingo, se existir um usurio admin ele entrou no seu sistema. Ele pode tambm tentar o seguinte : nome = ' or 1=1-senha = a consulta SQL montada ser :

select count(*) from usuarios where nomeUsuario='' or 1=1 --' and senhaUsuario=''
e bingo , ele burlou o seu sistema.

O hacker pode tambm tentar o seguinte : nome = ' OR "=' senha = ' OR "=' e a consulta SQL montada ser :

select count(*) from usuarios where nomeUsuario='' OR "=" AND senhaUsuario='' OR "="
a consulta agora esta fazendo a comparao : OR "=" Bingo ele entrou no seu site. que sempre verdadeira.

Para saber o nome das tabelas e campos o hacker pode fazer o seguinte : nome = ' having 1=1-senha = isto pode causar o seguinte erro: Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft] [ODBC SQL Server Driver] [SQL Server] Column 'usuarios.codigo' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /login.asp , line 28 e bingo , o hacker agora sabe que o nome da tabela usuarios e o nome do campo relacionado no formulrio como nome codigo. E ento , o que voc acha que ele vai fazer ? Fazer a mesma coisa para o campo senha e ento ele vai saber o nome da tabela e dos campos relacionados ao formulrio. Imagine o estrago que ele no ser capaz de fazer agora... Pensa que ele pode ficar somente nisto. J conhecendo o nome da tabela e das colunas se o hacker quiser saber o tipo de dados do campo ele pode fazer o seguinte : nome = ' UNION SELECT SUM(nomeUsuario) FROM usuarios-senha = como o SQL Server vai tentar aplicar a clusula SUM antes de determinar se o nmero dos campos nas duas colunas igual. Ao tentar fazer um SUM em um campo texto o sistema pode emitir a seguinte mensagem de erro: Microsoft OLE DB Provider for ODBC Drivers error '80040e7' [Microsoft] [ODBC SQL Server Driver] [SQL Server] The Sum or average aggregate operation cannot take a varchar data type as na argument. /login.asp , line 109

e bingo de novo , ele agora sabe o tipo de dado do campo nomeUsuario. Agora sabe o que ele vai fazer ? Vai inserir um usurio com nome senha para se logar , assim : nome = ' ; INSERT INTO usuarios VALUES('hacker','111111')-senha = e bingo , ele vai se logar como hacker e senha 111111. Acho que com estes exemplos j deu para voc perceber que voc tem que cuidar com muito mais cuidado das suas instrues SQL .Tenha certeza de uma coisa : as possibilidades do hacker so muitas.

Como evitar uma ataque de injeo SQL


A seguir algumas orientaes de como voc pode evitar um ataque de injeo SQL : 1- Estabelea uma poltica de segurana rgida e criteriosa limitando o acesso dos seus usurios. Isto quer dizer que voc deve dar somente os poderes necessrios aos seus usurios. No de acesso de escrita a tabelas e d somente acesso as tabelas que o usurio vai precisar. 2- Faa a validao da entrada de dados no formulrio e no permita os caracteres invlidos como : (') , (--) e (;) nem de palavras maliciosas como insert , drop , delete, xp_ . Abaixo algumas funes que voc pode usar: - Substituindo o apstrofe(') pelo duplo apstrofe ('') <% Function ExpurgaApostrofe(texto) ExpurgaApostrofe = replace( texto , "'" , "''") End function %> - Substituindo os caracteres e palavras maliciosas por vazio(""). <% Function LimpaLixo( input ) dim lixo dim textoOK lixo = array ( "select" , "drop" , ";" , "--" , "insert" , "delete" , "xp_") textoOK = input for i = 0 to uBound(lixo) textoOK = replace( textoOK , lixo(i) , "") next

LimpaLixo = textoOK end Function %> - Rejeitando os dados maliciosos: <% Function ValidaDados( input ) lixo = array ( "select" , "insert" , "update" , "delete" , "drop" , "--" , "'") ValidaDados = true for i = lBound (lixo) to ubound(llixo) if ( instr(1 , input , lixo(i) , vbtextcompare ) <> 0 ) then ValidaDados = False exit function} end if next end function %> 3- Limite a entrada de texto para o usurio no formulrio de entrada de dados. Se o campo nome deve ter somente 10 caracteres restrinja a isto a entrada de dados no formulrio. O mesmo vale para a senha. 4- Faa o tratamento adequado de erros no permitindo que mensagens de erros exponham informaes sobre a estrutura dos seus dados. 5- Faa um log para auditoria dos erros ocorridos e das operaes mais importantes da aplicao. Segurana coisa sria e vale a pena tomar todas as precaues a nosso alcance para preservar nossos dados e nossos empregos..... At breve...

Jos Carlos Macoratti

Você também pode gostar