Revista Eletrônica da Faculdade Metodista Granbery http://re.granbery.edu.br ‐ ISSN 1981 0377 Curso de Sistemas de Informação ‐ N. 9, JUL/DEZ 2010 SQL Injection, entenda o que é, aprenda a evitá-lo Heitor Magaldi Linhares1, Patrícia Lima Quintão1, André Luiz Bernardo1, Rodrigo Henrique Cesar de Almeida1, Rogério dos Santos Lima1 1 Pós Graduação em Segurança da Informação Faculdade Metodista Granbery – FMG Rua Batista de Oliveira, 1145 – Centro CEP: 36.010-532 - Juiz de Fora – MG – Brazil [email protected], [email protected],[email protected],[email protected], [email protected] RESUMO Na tentativa de eliminar os ataques através de SQL Injection ferramentas vêm auxiliando desenvolvedores na identificação de vulnerabilidades. Nesse contexto, esse artigo tem como objetivo apresentar o que é o SQL Injection, forma de ataque e precauções adotadas para evitar este problema. PALAVRAS-CHAVE: SQL Injection, ferramentas, vulnerabilidade. ABSTRACT In an attempt to eliminate attacks via SQL Injection tools have been aiding developers in identifying vulnerabilities. In this context, this article aims to present what SQL Injection is, how it attacks and precautions taken to avoid this problem. KEY-WORDS: SQL Injection, tools, vulnerabilities. 1 1. INTRODUÇÃO Em um mundo globalizado no qual vivemos hoje, com tecnologias cada vez mais acessíveis, tornando a informação à moeda de maior valor na economia, a mobilidade e flexibilidade de acesso aos sistemas se tornaram fator indispensável nas aplicações, o que até então era executado localmente em desktops passa a ser migrado pouco a pouco para web. Atualmente é comum observar pequenas empresas possuindo clientes em vários estados, realizando vendas por todo o país, utilizando de sistemas que conseguem executar tanto em um handheld como em um desktop, com os mesmos recursos só sendo alterada a interface de saída. A Internet, de fato, trouxe muitos pontos positivos e novas preocupações aos desenvolvedores. Com a migração das aplicações para web, o que até então funcionava na rede local passa a funcionar em servidores fora dos domínios físicos das empresas como habitual, trafegando informações sigilosas por uma rede nada segura, a Internet. Aplicações passam agora a serem acessadas remotamente em servidores, que passaram a se tornar alvos de atacantes em busca de informações sigilosas ou de satisfação pessoal, denominados de hackers. Atualmente a maioria absoluta dos sites é dinâmica, existindo uma troca constante de informações com o banco de dados, comunicação feita através da linguagem SQL - Structured Query Language, utilizada por 90% das aplicações, por se tratar de forma simples de acesso aos dados (MACORATTI, 2010). A troca de informações entre a aplicação e o banco de dados, esteja ele local ou não, se possuir falhas, poderá ser explorada por um software malicioso, inserindo códigos, permitindo acesso a informações por pessoas não autorizadas, técnica conhecida como SQL Injection. Segundo Fisher (2010), o SQL Injection tornou-se talvez a técnica mais utilizada para comprometer os aplicativos da Web, graças à sua simplicidade relativa e elevada taxa de sucesso. Na “Era da Informação”, em que o bem mais valioso é intangível, a pergunta é: como os desenvolvedores estão lidando com esta imensa responsabilidade? O desafio é desenvolver sites cada vez mais inovadores, aliados a mecanismos que venham prover segurança aos usuários. 2 A proposta deste artigo é apresentar o que é SQL Injection, como as aplicações são exploradas e maneiras para prevenção; permitindo ao desenvolvedor confeccionar um sistema mais robusto. Para isso, encontra-se dividido em 5 seções, além dessa introdução. A Seção 2 destaca o conceito de SQL Injection. A Seção 3 apresenta ferramentas de identificação de vulnerabilidades nas plataformas Windows e Linux. A Seção 4 traz soluções para uma comunicação segura entre “Aplicação – Base de Dados”. Por fim, têm-se as considerações finais do trabalho, bem como as referências bibliográficas utilizadas. 2. O QUE É UM SQL INJECTION? SQL Injection é um conhecido método utilizado em ataques a banco de dados através de formulários que contenham campos de entradas de dados do tipo texto (NETPOINT, 2008). Este método utiliza da vulnerabilidade do código implementado na aplicação para alterar a string de conexão ao banco de dados, comprometendo toda troca de informações entre “Aplicação – Base de Dados”. O impacto causado pela alteração poderá ser apenas de um acesso indevido a uma área restrita, sendo imperceptível aos olhos de um desenvolvedor inexperiente, como também poderá permitir a exclusão de uma tabela, comprometendo toda a aplicação, dentre outros. Aplicações diariamente estão sendo disponibilizadas na Web, sendo, a maioria dessas aplicações, dinâmicas, em que o acesso aos dados se torna necessário; a falta de informação da parte do desenvolvedor da aplicação a torna um alvo fácil de ataques. Exemplo de uma string simples de conexão via SQL entre a aplicação e base de dados. SELECT id, senha FROM usuarios WHERE id = ‘Bruno’ and senha = ‘1234’; Ilustração 1. String de conexão via SQL. A string definida na Ilustração 1 retorna a confirmação se o usuário Bruno possui a senha ‘1234’. Caso esta informação seja verdadeira, irá localizar na tabela as informações e retornar a coleção de dados. 3 Porém a distração do desenvolvedor no tratamento da entrada de texto permitiu a digitação de caracteres especiais, permitindo assim que o usuário entrasse com id de ‘Bru’no’. Com esta entrada, a aplicação não irá conseguir interpretar o comando requisitado, retornando com um erro. Assim como a entrada foi inválida, esta poderia ser válida, e a execução causar um transtorno enorme como exemplo na Ilustração 2: SELECT id, senha FROM usuarios WHERE id = ‘’ or 2 = 2 and senha = ‘1234’; Ilustração 2. String de conexão alterada por atacante. A aplicação permitiu que a entrada de texto pudesse conter o caractere ‘Aspas’, vulnerabilidade explorada pelo atacante para ter acesso às informações contidas na base, permitindo assim ações como inserir, editar, apagar etc. O SQL Injection é uma das práticas mais utilizadas na Internet. Apesar de sua defesa ser bem simples, poucos desenvolvedores se atentam a isto. Segundo Fisher(2010), em junho deste ano iniciou-se o ataque mais recente, tendo como alvo servidores web que utilizam o software Microsoft IIS. A estimativa de páginas infectadas ultrapassa a marca de 100.000. Este ataque direcionava os visitantes para uma segunda página, onde era instalado um malware. De acordo com McMillan(2010), o ataque não explorar qualquer vulnerabilidade no IIS, mas é um ataque contra aplicativos Web de terceiros. 3. IDENTIFICAÇÕES DE VULNERABILIDADES NAS PLATAFORMAS WINDOWS E LINUX A identificação de uma vulnerabilidade poderá ser feita por um desenvolvedor treinado, quando ele irá percorrer todas as fontes nos quais ocorram troca de informações entre Aplicação – Base de Dados com intervenção do usuário. Em um mercado no qual a produtividade é primordial e os requisitos se alteram constantemente, a citação acima não funcionaria devido ao longo período de análise para a identificação das vulnerabilidades, sendo assim, existe no mercado um número expressivo de ferramentas que nos auxiliam neste processo de identificação, ferramentas que atuam em servidores Linux, Windows e em ambos. 4 Foram selecionadas quatro ferramentas para identificação de vulnerabilidades de SQL Injections em aplicações web que são: Acunetix, Netsparker, SQL Inject-Me, Websecurify. A escolha das aplicações ocorreu devido ao fato de possuírem versões gratuitas e estarem sendo referenciadas em vários sites relacionados à segurança da informação. Os aspectos analisados serão: profundidade da varredura, clareza nas informações apresentadas, tempo de varredura, interface homem máquina. 3.1. Acunetix O Acunetix é uma ferramenta paga, porém existem versões livres que possuem restrição em determinadas ações. Ferramenta disponível para download em www.acunetix.com. Realiza uma varredura muito completa em servidores Windows, pois verifica vulnerabilidades na aplicação hospedada e no servidor, como portas abertas que não estão sendo utilizadas, versão do sistema, etc. Porém, por seu processo de varredura ser muito extenso, demanda um tempo de 23 minutos, este tempo irá variar de acordo com o tamanho da aplicação hospedada. Na parte gerencial é muito eficiente, armazenando as varreduras em uma base de dados, disponível sempre que requisitada. Através de seu gerador de relatórios denominado de Acunetix Report, é possível ter acesso a todas as análises realizadas, confeccionando relatórios bem detalhados das vulnerabilidades encontradas. O Acunetix possui uma interface muito amigável, permitindo boa interação com usuário, tornando a sua utilização muito intuitiva. 5 Ilustração 3. Tela principal do Acunetix 3.2. Netsparker O Netsparker é uma ferramenta paga, porém existem versões livres que não possuem a parte de relatórios. Ferramenta disponível para download em www.mavitunasecurity.com/communityedition/. Ferramenta muito ágil e precisa, ideal para desenvolvedores que atuam em servidores Linux, Possui uma varredura que abrange servidor e aplicação, informando sobre os pontos vulneráveis encontrados A interação no momento da varredura permite ao usuário navegar sobre os pontos analisados, apresentando as vulnerabilidades encontradas, impactos e soluções passiveis de serem adotadas para correção do problema. O que se destacou no Netsparker foi à riqueza de informações em um curto período de tempo gasto na varredura, cerca de 6 minutos. O ponto negativo desta ferramenta foi que a versão testada, a community, é bem limitada e não possui recursos de relatórios. 6 Ilustração 4. Tela Principal do Netsparker 3.3. SQL Inject-Me Apesar de ser apenas um plugin do Browser Mozila Firefox, o SQL InjectMe se apresenta bem útil em verificações em páginas quem contenham campos de entrada de texto. Este plugin é livre e disponível para download em addons.mozilla.org/en-US/firefox/addon/7597 O SQL Inject-Me apresenta-se bem ágil na identificação dos componentes existentes na tela, tanto em plataformas Windows como em Linux. Iniciando o ataque, que dura poucos minutos, variando de acordo com o tamanho do arquivo testado, a ferramenta apresenta as vulnerabilidades existentes em cada componente visível na tela, botões, campos de entradas de texto etc. A agilidade é algo que se destaca nesta ferramenta, porém é limitada se comparada às ferramentas anteriormente testadas, pois somente identifica vulnerabilidades relacionadas à SQL Injection. 7 Esta ferramenta é indicada a desenvolvedores de aplicações mais simples, que contenham poucas entradas de informações, pois esta ferramenta depende do acesso a cada tela a ser testada, se tornando improdutiva, dependendo do tamanho da aplicação. Ilustração 5 – Tela SQL Inject Me 3.4. Websecurify O Websecurify é uma ferramenta livre, disponível para download em www.websecurify.com. É uma aplicação que consegue atuar em plataforma Windows e Linux, mas possuindo um desempenho três vezes melhor na plataforma Windows. Possui uma interface sem muitos recursos à interação do usuário. Realiza uma verificação superficial, realizando testes de requisições, apontando ações ativadas, versão atual do servidor, identificando assim vulnerabilidades existentes. O Websecurify dentre as ferramentas testadas, é a que oferece menos recursos, uma interface de varredura péssima, onde o usuário nunca sabe quando irá finalizar, devido ao limite ser incrementado no processo de execução, possuindo muito pontos negativos. 8 Ilustração 6 – Tela Websecurify. 3.5. Comparativo entre as Ferramentas A seguir tem-se um quadro comparativo entre as ferramentas analisadas. Ferramenta Varredura Clareza Tempo Interface Acunetix 3 3 1 3 Netsparker 3 3 3 3 SQL Inject-Me 2 2 3 1 Websecurify 1 3 1 1 Legenda 1 – Ruim 2 – Médio 3 - Bom 4. MELHORES PRÁTICAS PARA SE EVITAR ATAQUES DE SQL INJECTION Os ataques ocorrem devido a descuidos ou falta de conhecimento dos desenvolvedores. Assim, tendo-se em vista o alto índice de sucesso, estes ataques são 9 bem comuns e podem ser evitados com práticas bem simples, conforme os tópicos listados a seguir: 4.1. Validações de entradas É importante validar todas as entradas de texto que serão utilizadas no SQL, não permitindo a escrita de caracteres especiais e palavras chaves do SQL, como INSERT, DELETE, UPDATE, HAVING, JOIN etc, conforme visto nas Ilustrações 7 e 8. Ilustração 7 – Implementação em PHP Ilustração 8 – Implementação em ASP 4.2 – Tamanho das entradas de texto 10 Defina um tamanho máximo de caracteres para senhas e usuários (10 é o tamanho indicado); 4.3 – Tratamentos de erros Efetue um tratamento adequado aos erros, para que as mensagens não exponham ao atacante informações sobre a estrutura de dados. 4.4 – Utilizações de acesso limitado Limite o acesso de todos os usuários, permitindo assim somente ações básicas, não permitindo a utilização do acesso mestre de dentro da aplicação. 4.5 – Utilizações de log Crie um LOG com os erros ocorridos e as ações mais importantes executadas, para ser auditado periodicamente. 5. CONSIDERAÇÕES FINAIS Este artigo teve como principal objetivo abordar de forma clara o que é o SQL Injection, pois, conhecendo a ameaça, o combate se torna mais fácil. A apresentação das aplicações veio demonstrar como a combinação destas ferramentas é positiva no combate ao SQL Injection. Não qual é melhor ou pior, e sim os pontos positivos e negativos, permitindo proporcionar ao desenvolvedor definir qual ferramenta utilizar, dependendo do ambiente a ser testado. O perfil do desenvolvedor nos últimos anos tem sido modificado, a preocupação com a segurança deixa de estar em segundo plano e passa a se tornar requisito de projeto. Mesmo com todas estas mudanças, existem desenvolvedores que ainda vivem na zona de falsa sensação de segurança, pensando que suas aplicações nunca serão alvo de atacantes, por isso o alto número de sites vulneráveis. 11 O combate ao SQL Injection é simples e não demanda tempo extra de desenvolvimento. A Falta de conhecimento do desenvolvedor se torna o ponto mais crítico no combate a esta forma de ataque. O desenvolvedor de sistemas deve se manter sempre atualizado sobre novas formas de ataque, pois a cada dia surgem novidades neste sentido, na tentativa de burlar os controles existentes. A dica deste artigo é que “Segurança nunca é demais!”. 6. REFERÊNCIAS BIBLIOGRÁFICAS DANCHEV, Dancho. SQL injection attacks and malware led to most data breaches, 9 fev 2010. Disponível em : http://www.m86security.com/labs/i/Anotherround-of-Asprox-SQL-injection-attacks,trace.1366~.asp>. Acesso em: 30 jun 2010. FILHO, Clóvis Luiz de Amorim; CAVALCANTI,Paulo Diego de Oliveira Bezerra; FILHO, Marcello Benigno de Barros Borges. SQL Injection em ambientes Web. Disponível em: http://www.devmedia.com.br/articles/post-9733-SQL-Injection-emambientes-Web.html>. Acesso em: 8 jun 2010. FISHER, Dennis. Por dentro de um ataque de injeção de SQL, 25 fev 2010. Disponível em : < http://threatpost.com/pt_br/blogs/por-dentro-de-um-ataque-deinjecao-sql-022510 >. Acesso em: 9 jun 2010. ______. Mass SQL Injection Attack Hits Sites Running IIS, 10 jun 2010. Disponível em : < http://threatpost.com/en_us/blogs/mass-sql-injection-attack-hits-sites-runningiis-061010>. Acesso em: 30 jun 2010. GIROTO, Alex. Segurança em PHP evitando o mysql_injection , 15 abr 2010. Disponível em:< http://www.nfx.com.br/forum/index.php?/topic/4183-seguranca-emphp/>. Acesso em: 9 jun 2010. MACORATTI,José Carlos. Previna-se contra a injeção SQL. Disponível em : <http://www.macoratti.net/sql_inj.htm>. Acesso em: 9 jun 2010. MONTEIRO, Mario. Injeção de SQL. Disponível <http://www.htmlstaff.org/ver.php?id=20553>. Acesso em: 9 jun 2010. em: NETPOINT. Sql Injection. Disponível em: <http://www.netpoint.com.br/ajuda/index.php?title=Sql_Injection>. Acesso em: 9 jun 2010. UOL. Previna-se contra injeção SQL, 23 dez 2008. Disponível em: <http://codigofonte.uol.com.br/artigo/asp/previna-se-contra-a-injecao-sql>. Acesso em: 9 jun 2010. 12