Download - Artigo SQL Injection

Transcript

SQL Injection: Uma Injecao de Informacao Daniel S. Camargo1 , Andr Nunes1 , Mateus D. Tonelli1 e1

Departamento de Ci ncia da Computacao Universidade do Estado de Santa Catarina (UDESC) e Joinville SC [email protected], [email protected], [email protected]

Resumo. Atualmente, com a necessidade da internet, estamos cada vez mais propensos a ataques maliciosos oriundos de tentativas hackers. Para nos pro` tegermos um pouco mais, conheceremos neste artigo uma t cnica conhecida e como SQL Injection, e n o obstante tamb m veremos uma forma simples de se a e precaver destes ataques.

1. Introducao Atualmente e comum termos notcias de novas t cnicas de hackear um site na internet, e principalmente os que possuem servicos que seja seja pago. Generalizando, basta um site exigir algum cadastro, que se torna alvo. Mas dentre tantas novas t cnicas, ainda existe e uma velha conhecida ameaca: o SQL Injection. Alguns programadores ainda teimam em ignorar sua potencialidade, possibilitando que novas aplicacoes possam ser facilmente invadidas, colocando em risco n o a somente a seguranca de um sistema, mas tamb m a integridade de seus usu rios. e a

2. O que e SQL Injection? SQL Injection e um tipo de ameaca de seguranca que se aproveita de falhas em sistemas que interagem com bases de dados via Linguagem de Consulta Estruturada (SQL) na web. Os alvos dessa injecao s o aplicativos normalmente escritos em linguagem PHP, a ASP, JSP, CGI, dentre outras linguagens utilizadas para programar aplicacoes de internet, que rodam em seu navegador.[Securiteam 2002]

3. Como ocorre a invas o? aA injecao de SQL ocorre quando o atacante consegue inserir uma s rie de instrucoes e SQL dentro de uma consulta (query) atrav s da manipulacao das entrada de dados de uma e aplicacao, confundindo, assim, com o c digo nativo do programa. o E uma pr tica comum os sites pedirem um cadastro, e criar-lhe um login, dando a acesso a areas restritas e especiais. Quando esse site tem uma area restrita, logo necessita de um login e senha para o usu rio de administrador. O mais comum e ter uma tabela a chamada Users com Usu rio, Senha, Nome e Admin (os nomes dos campos podem mua dar, mas suas funcoes s o as mesmas). Sendo o Admin um ag indicando se o Usu rio a a tem o direito de acesso a cliques extras, tipo incluir/editar/deletar. Com isso, cria-se duas areas de digitacao sendo uma para Login e outra para Senha; esses campos s o enviados para um script .asp, que validar ou n o o login ina a a formado. Dependendo ele ir dar o direito de Administrador. [Wikipedia 2010] a

4. Vendo um pouco do c digo oO Script l da seguinte maneira: e Pega o usu rio e senha informados no formul rio cUser = trim(request(usuario)) a a cSenha = trim(request(senha)) Verica no banco de dados se o usu rio e senha conferem (supondo que o banco a j esteja aberto com o nome de objConn): SQLOpen = select usuario, senha, nome, a admin from Users where usuario= & cUser & and senha= & cSenha & objRS.Open SQLOpen, objConn Verica se achou um usu rio com o login e senha informados if not objRS.bof then a response.write Bem vindo & objRS.elds(nome) & ! else response.write Login inv lido. a end if [Netpoint 2008] Desta maneira o banco funcionar normalmente, abrindo apenas quando o nome e a a senha se coincidirem e dando os privil gios apenas para as contas Admin demonstrando e que n o h seguranca nenhuma nesse banco de dados. a a Para concatenarmos uma string dentro de outra, devemos usar aspa simples, inv s e de aspa dupla, pois a aspa dupla e para a string mestra, e a aspa simples e para a string interna. select usuario, senha, nome, admin from Users where usuario= & cUser & and senha= & cSenha & Ap s o preenchimento caria do seguinte modo: select usuario, senha, nome, o admin from Users where usuario=Andre and senha=123456 E trocado as vari veis pelo login e senha digitados, dentro das aspas simples que a signica onde comeca e onde termina o nome e a senha. Se for digitado da seguinte maneira: andre o banco vai computar o nome da primeira aspa at a pr xima, como foi digitado no nome ele vai usar a parte do nome at e o e onde se localiza a aspa, logo o resto ser c digo SQL. a o Analisando, vemos que quando formos comparar o campo usu rio, abrimos uma a aspa simples, colocamos o conte do and e fechamos a aspa simples. Para o SQL, a u comparacao terminou a, o que vem depois, deveria ser comandos. Mas n o era. Era a a continuacao do username, a palavra re e mais uma aspa simples, que deveria estar fechando a primeira, mas na realidade est abrindo uma nova string no SQL, e como n o a a e comparado com nada, o SQL retorna erro de programacao. Mas poderamos nos aproveitar desse m todo da seguinte maneira: e select usuario, senha, nome, admin from Users where usuario= or 1 and senha=123456 Lendo o comando, seria a mesma coisa que falar pro SQL: me retorne o usu rio a que seja igual a vazio OU 1. Lembrando que 1 em inform tica e a mesma coisa que a True (verdadeiro). Lendo novamente: Me retorne o usu rio que seja igual a vazio (n o a a existe nenhum) OU verdadeiro (verdadeiro e verdadeiro, ent o encontramos). Nisso, a a ` tabela pega todos os usu rios, pois todos d o verdadeiro. N o s o iguais a vazio, mas o 1 a a a a garante que todos sejam v lidos. a

Com este m todo acessamos o primeiro usu rio do banco, que quase sempre e o e a usu rio que criou o banco e que tem direitos de Administrador. a Utilizando esse m todo no campo da senha podemos ter acesso a qualquer usu rio e a tendo apenas o Login., Pois a senha ele ver como verdadeiro. a Para ter apenas acesso a algum banco de dados mesmo n o necessitando ser Ada min, basta colocar no campo Login usando o mesmo m todo e no campo Senha coloe camos uma senha que seja comum, como exemplo 123456 onde ele ir procurar um a usu rio at que essa senha seja aceita e vai acessar com este usu rio. a e a Caso o banco utilize no local do Login o e-mail, este m todo n o funciona, pois e a ele necessita de uma validacao no formato de e-mail. A string que passa pelos e-mails e: [email protected]=.11 Dessa forma, caso veriquem se existe @, esta string passar pois tem 1 @ s . Se vericarem se tem ala o a guma coisa antes da @ ela e v lida e tamb m passa. Se vericarem de tr s pra frente e a na string procurando por uma TLD v lida (com um ponto na terceira ou quarta casa, de a tr s pra frente), encontrar o o ponto (.) na terceira casa, que signica uma TLD brasileira a a (.br) ou de outros pases. E se ainda vericarem mais pra tr s, por domnios, encon a trar o outros dois pontos, o que torna esse e-mail pertencente a um domnio com suba domnio.[Gomes 2004]

5. Estamos todos vulner veis? a Infelizmente a resposta e sim, mas para evitar essa falha no c digo foi desenvolvida uma o funcao de validacao dos dados digitados nos formul rios que retira caracteres e palavras a ` equivalentes a comandos SQL: [Goalti 2006] function validacampo($campo){ $campo =addslashes(fgetss(trim(preg replace(sql regcase(from select|insert|delete|update| where|drop all|drop table|index|alter|create|references|reload|shutdown|process|le|.. | |# ||)/,, $campo)))); return $campo } Por m durante alguns testes para impedir a injecao SQL observou-se que o probe lema estava nos ap strofos. Remov -los projudicaria nomes de usu rios que os cono e a tivessem, assim como seria possvel remover alguma palavra importante caso coincidisse com alguns dos comandos citados na funcao

6. Conclus o aMesmo com todos os patches, Service Packs e correcoes existentes, os nossos sistemas s o falhos porque foram desenvolvidos sem levar em consideracao a seguranca, anal, e a muito mais f cil plantar arvores do que fazer enxertos. a

ReferencesGoalti, L. E. (2006). Artigo: Disponibilizacao da ferramenta de teste Poke-Tool como aplicac ao Web. Universidade Metodista de Piracicaba, 1th edition.

Gomes, M. R. (2004). Revista H4CK3R. Editora Digerati, 4th edition. Netpoint (2008). SQL Injection. http://www.netpoint.com.br/ajuda/index.php?title=sql injection edition. Securiteam (2002). SQL Injection Walkthrough. http://www.securiteam.com/securityreviews/5dp0n1p76e.html edition. Wikipedia (2010). Injecao de SQL. http://pt.wikipedia.org/wiki/sql injection edition.