SQL Injection, entenda o que é, aprenda a evitá-lo

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