Você está na página 1de 4

6/8/2014

SuperASP do Brasil

Previna-se contra a Injeo SQL


Publicado em 20/06/2006
A SQL - Structure d Q ue ry Language - largam e nte usada para inte ragir com banco de dados re lacionais. Se voc
conside rar que 90% das aplicae s utilizam banco de dados com suporte a SQ L vai concluir que o uso da SQ L
quase um a unanim idade por se r prtica , fcil e porttil.
Em se falando de aplicae s W e b te m os um a grande utilizao de banco de dados para arm aze nar as m ais dive rsas
inform ae s : e nde re os e docum e ntos pe ssoais , contas e valore s finance iros , nm e ros de carte s de cr dito ,
dados e m pre sariais , e tc.
Ao colocar sua aplicao na W e b voc a e sta e x pondo a um ace sso m ais am plo e indiscrim inado. Afinal qualque r um
que te nha ace sso a url do site te r ace sso a sua aplicao e aos dados que e la disponibiliza. Pe nsando na
se gurana de suas inform ae s as e m pre sas inve ste m pe sado e m fire walls , ce rtificao digital e outros re cursos ,
com o obje tivo de se prote ge r de invasore s.
Para que o controlar o ace sso as inform ae s norm alm e nte re stringe -se o ace sso aos usurios cadastrados usando
um nom e e se nha para ide ntificao ; e ste s dados so colhidos atrav s de um form ulrio de login e so e nto
ve rificados com as inform ae s arm aze nadas e m um banco de dados dos usurios cadastrados; se e stive re m
corre tas o ace sso pe rm itido caso contrrio o ace sso ne gado.
assim que funciona o hom e bank ing na inte rne t e um a infinidade de outras aplicae s we b na qual o ace sso
re strito.
Voc pode te r o aparato m ais m ode rno e m te rm os de te cnologia de se gurana prote ge ndo o se u site de um ataque
hack e r e ne m se dar conta de que a vulne rabilidade da sua aplicao e sta ali naque le form ulrio de login. Ele pode
se r a porta de e ntrada para ataque s m aliciosos atrav s da inje o de SQ L.
A inje o SQ L ocorre quando um invasor conse gue inse rir com andos SQ L na instruo SQ L que voc usa no se u
script de m odo a burlar a re strio e te r ace sso ou danificar as inform ae s arm aze nadas no se u banco de dados.
Ne ste artigo e u vou m ostrar com o a inje o de SQ L ocorre e falar sobre algum as das m e didas que voc pode tom ar
para e vit-la. Em bora as inform ae s se jam focadas e m pginas ASP e banco de dados SQ L Se rve r /Acce ss e las se
aplicam a qualque r script e banco de dados que usam um diale to SQ L.
Como ocorre a injeo SQL
Abaix o te m os um tpico form ulrio de login :

form nam e ="frm Login" action="login.asp" m e thod="post">


Nom e : <input type ="te x t" nam e ="nom e Usuario">
Se nha: <input type ="te x t" nam e ="se nhaUsuario">
<input type ="Enviar">
</form >

Ge ralm e nte quando o usurio clicar no boto - Enviar - o script login.asp se r e x e cutado para e fe tuar a validao
dos dados inform ados. Abaix o te m os um script tpico para um arquivo de validao de inform ae s:
<%
dim nom e Usuario, se nhaUsuario, consulta
dim conn, rS
nom e Usuario = R e que st.Form ("nom e Usuario")
se nhaUsuario = R e que st.Form ("se nhaUsuario")
se t conn = se rve r.cre ate O bje ct("ADO DB.C onne ction")
se t rs = se rve r.cre ate O bje ct("ADO DB.R e cordse t")
consulta = "se le ct count(*) from usuarios whe re nom e Usuario='" & nom e Usuario & "' and se nhaUsuario='" &
se nhaUsuario & "'"
conn.O pe n "Provide r=SQ LO LEDB; Data Source =(local);
Initial C atalog=m yDB; Use r Id=sa; se nhaUsuario="
rs.active C onne ction = conn
rs.ope n consulta
if not rs.e of the n
re sponse .write "Ace sso C once dido"
e lse
re sponse .write "Ace sso Ne gado"
e nd if
http://www.superasp.com.br/paginas_exibir_detalhes.asp?dep=2,47&id=328

1/4

6/8/2014

SuperASP do Brasil

%>
Vam os analisar o que ocorre quando um usurio te nta se aute nticar. Vam os supor que e le usurio cadastrado com
nom e Macoratti e se nha 123456 (s suposio). Ao inform ar o nom e e a se nha e clicar no boto Enviar o script do
arquivo login.asp se r e x e cutado. Vam os ve r com o ficou a instruo SQ L m ontada ne ste caso :
se le ct count(*) from usuarios whe re nom e Usuario='m acoratti' and se nhaUsuario='123456'
Ne ste caso o usurio m acoratti, se nha 123456 se r aute nticado e te r ace sso ao siste m a. Tubo be m ?
No , se voc usa e ste tipo de instruo SQ L nada e sta be m pois o te x to final da consulta SQ L de pe nde
inte iram e nte do conte do das varive is , e , se o conte do de stas varive is no for validado e tratado o te x to final
concate nado pode r se r um SQ L adulte rado atrav s de um a inje o SQ L.
Q ue r ve r ? Vou com e ar pe gando le ve . Vam os supor que um hack e r de cidiu invadir sua pgina. Um a das prim e iras
coisas que e le pode faze r te ntar um a inje o SQ L , e , vai com e ar ve rificando se voc e sta tratando o apstrofe
(aspa sim ple s: '). Se voc no sabe a pre se na de um caracte re de apstrofe (') no conte do de um a varive l
concate nada no SQ L usada para de lim itar strings de te x to. Ento suponha que e le digite os se guinte s dados nos
cam pos nom e e se nha:
nome = tes'te
senha =
Se voc no tratar o apstrofe vai ocorre r um e rro de SQ L (incorre ct Sintax ) ,e , ve ndo isto o hack e r vai ficar m ais
anim ado...
Agora vou pe gar pe sado. Suponha e nto que a se guir e le digite os se guinte s dados
nome = ' ; drop table users-senha =
Este com ando ir e x cluir a tabe la users (se e la e x istir). E se voc pe nsa que m uito difcil o hack e r adivinhar o
nom e da sua tabe la vou m ostrar m ais abaix o que e le pode faze r isto de um a m ane ira sim ple s. Isto possve l pois
o caracte re (;) indica o fim de um a consulta e o com e o de outra e m T-SQ L , e , o caracte re (--) no final da linha faz
com que o scrpt ASP se ja e x e cutada se m e rro.
C ontinuando o ataque , e le pode tam b m inform ar o se guinte :
nome = admin
senha = ' or 1=1-ve ja com o vai ficar a consulta SQ L m ontada:
se le ct count(*) from usuarios whe re nom e Usuario='adm in' and se nhaUsuario='' or 1=1--'
Aqui a consulta ir ve rificar se o nom e do usurio adm in e se se nha vazio ou 1 for igual a 1 ( o que ve rdade ) ;
bingo, se e x istir um usurio adm in e le e ntrou no se u siste m a.
Ele pode tam b m te ntar o se guinte :
nome = ' or 1=1-senha =
a consulta SQ L m ontada se r :
se le ct count(*) from usuarios whe re nom e Usuario='' or 1=1 --' and se nhaUsuario=''
e bingo , e le burlou o se u siste m a.
O hack e r pode tam b m te ntar o se guinte :
nome = ' OR "='
senha = ' OR "='
e a consulta SQ L m ontada se r :
se le ct count(*) from usuarios whe re nom e Usuario='' O R "=" AND se nhaUsuario='' O R "="
a consulta agora e sta faze ndo a com parao : OR "=" que se m pre ve rdade ira. Bingo e le e ntrou no se u site .
Para sabe r o nom e das tabe las e cam pos o hack e r pode faze r o se guinte :
nome = ' having 1=1-senha =
isto pode causar o se guinte e rro:
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
http://www.superasp.com.br/paginas_exibir_detalhes.asp?dep=2,47&id=328

2/4

6/8/2014

SuperASP do Brasil

e bingo , o hack e r agora sabe que o nom e da tabe la usuarios e o nom e do cam po re lacionado no form ulrio
com o nom e codigo.
E e nto , o que voc acha que e le vai faze r ? Faze r a m e sm a coisa para o cam po se nha e e nto e le vai sabe r o
nom e da tabe la e dos cam pos re lacionados ao form ulrio. Im agine o e strago que e le no se r capaz de faze r
agora...
Pe nsa que e le pode ficar som e nte nisto. J conhe ce ndo o nom e da tabe la e das colunas se o hack e r quise r sabe r o
tipo de dados do cam po e le pode faze r o se guinte :
nome = ' UNION SELECT SUM(nomeUsuario) FROM usuarios-senha =
com o o SQ L Se rve r vai te ntar aplicar a clusula SUM ante s de de te rm inar se o nm e ro dos cam pos nas duas colunas
igual. Ao te ntar faze r um SUM e m um cam po te x to o siste m a pode e m itir a se guinte m e nsage m de e rro:
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 , e le agora sabe o tipo de dado do cam po nom e Usuario.
Agora sabe o que e le vai faze r ? Vai inse rir um usurio com nom e se nha para se logar , assim :
nome = ' ; INSERT INTO usuarios VA LUES('hacker','111111')-senha =
e bingo , e le vai se logar com o hack e r e se nha 111111.
Acho que com e ste s e x e m plos j de u para voc pe rce be r que voc te m que cuidar com m uito m ais cuidado das suas
instrue s SQ L .Te nha ce rte za de um a coisa : as possibilidade s do hack e r so m uitas.
Como evitar uma ataque de injeo SQL
A se guir algum as orie ntae s de com o voc pode e vitar um ataque de inje o SQ L :
1- Estabe le a um a poltica de se gurana rgida e crite riosa lim itando o ace sso dos se us usurios. Isto que r dize r que
voc de ve dar som e nte os pode re s ne ce ssrios aos se us usurios. No de ace sso de e scrita a tabe las e d som e nte
ace sso as tabe las que o usurio vai pre cisar.
2- Faa a validao da e ntrada de dados no form ulrio e no pe rm ita os caracte re s invlidos com o : (') , (--) e (;)
ne m de palavras m aliciosas com o insert , drop , delete, xp_ . Abaix o algum as fune s que voc pode usar:
- Substituindo o apstrofe(') pelo duplo apstrofe ('')
<%
Function Ex purgaApostrofe (te x to)
Ex purgaApostrofe = re place ( te x to , "'" , "''")
End function
%>
- Substituindo os caracteres e palavras maliciosas por vazio("").
<%
Function Lim paLix o( input )
dim lix o
dim te x toO K
lix o = array ( "se le ct" , "drop" , ";" , "--" , "inse rt" , "de le te " , "x p_")
te x toO K = input
for i = 0 to uBound(lix o)
te x toO K = re place ( te x toO K , lix o(i) , "")
ne x t
Lim paLix o = te x toO K
e nd Function
%>
- Rejeitando os dados maliciosos:
<%
Function ValidaDados( input )
lix o = array ( "se le ct" , "inse rt" , "update " , "de le te " , "drop" , "--" , "'")
http://www.superasp.com.br/paginas_exibir_detalhes.asp?dep=2,47&id=328

3/4

6/8/2014

SuperASP do Brasil

ValidaDados = true
for i = lBound (lix o) to ubound(llix o)
if ( instr(1 , input , lix o(i) , vbte x tcom pare ) <> 0 ) the n
ValidaDados = False
e x it function}
e nd if
ne x t
e nd function
%>
3- Lim ite a e ntrada de te x to para o usurio no form ulrio de e ntrada de dados. Se o cam po nom e de ve te r som e nte
10 caracte re s re strinja a isto a e ntrada de dados no form ulrio. O m e sm o vale para a se nha.
4- Faa o tratam e nto ade quado de e rros no pe rm itindo que m e nsage ns de e rros e x ponham inform ae s sobre a
e strutura dos se us dados.
5- Faa um log para auditoria dos e rros ocorridos e das ope rae s m ais im portante s da aplicao.
Se gurana coisa s ria e vale a pe na tom ar todas as pre caue s a nosso alcance para pre se rvar nossos dados e
nossos e m pre gos..... At bre ve ...

http://www.superasp.com.br/paginas_exibir_detalhes.asp?dep=2,47&id=328

4/4

Você também pode gostar