Вы находитесь на странице: 1из 9

Injeo SQL Detectando vulnerabilidades e protegendo seu website de ataques.

Diogo D. Moreira1
1

Instituto Federal de Educao, Cincia e Tecnologia da Paraba (IFPB) Cajazeiras PB Brazil


diogo.dmoreira@gmail.com

Abstract. This paper makes a review about the vulnerabilities to SQL injection attacks on websites, evaluating the different techniques that are used for attacks and making a case study to demonstrate how these security issues can be avoided in a practical way. Resumo. Este trabalho faz uma anlise acerca das vulnerabilidades a ataques de injeo de SQL em websites, avaliando as diferentes tcnicas que so usadas para os ataques e fazendo um estudo de caso para demonstrar como estas falhas de segurana podem ser evitadas de modo prtico. Palavras-chave: Injeo de SQL, Vulnerabilidade de segurana, Segurana em websites.

1. Introduo
Hoje, a Internet est amplamente acessvel, segundo [1] o nmero de internautas em todo mundo j ultrapassa 2 bilhes, o que significa que quase um a cada trs habitantes tem acesso rede. Uma gama de tecnologias que permitem um mundo de possibilidades, o que eram apenas pginas estticas em tempos de outrora, tornaram-se aplicaes web. As aplicaes web atendem todos os tipos de pblico, disponibilizando variados tipos de servios, como comrcio eletrnico, Internet Banking, redes sociais, compartilhamento de arquivos, etc. Tornando os usurios mais do que apenas consumidores de informaes, mas formadores de contedo que ser consumido por outros consumidores. A medida que a Internet cresce, aumenta o interesse de pessoas malintencionadas e criminosos em explorar possveis falhas de aplicaes web em busca de informaes pessoais como nmeros de cartes de crdito, senha de bancos, dentre outras. Motivados pelo nmero de vtimas em potencial que cresce a cada dia com novos usurios, que provavelmente so inexperientes e tem maiores possibilidades de se permitirem lesar, potencializados ainda pela inexperincia e/ou descuido de desenvolvedores que programam estes sistemas web. Tendo conhecimento do cenrio atual, da importncia e da abrangncia que possuem, este trabalho tem como objetivo demonstrar e alertar quanto aos riscos deste novo panorama, no qual cada vez mais os websites estticos so substitudos por aplicaes web. A segurana vai muito alm do meio fsico, como servidores e infraestrutura de rede que os sistemas tem a disposio, tendo como ponto crtico em muitas vezes a prpria aplicao web. Este trabalho visa auxiliar a identificao de

falhas comumente exploradas por criminosos, tendo como foco a injeo de SQL. Uma vez compreendido o modo como o criminoso realiza o ataque, pode-se corrigir a falha de forma prtica e eficaz.

2. Injeo de cdigo (Injection Flaw)


Um levantamento efetuado pela OWASP [2] listou as dez falhas de segurana mais comuns, dentre elas destacam-se as falhas por injeo de cdigo representadas por XSS e injeo de SQL, que so falhas que no precisam de muitas ferramentas especficas para serem exploradas, na grande maioria das vezes o criminoso necessita apenas um pouco de percia e um computador conectado a Internet. Em um levantamento sobre violao de dados e ataques de rede, os ataques de injeo SQL so a segunda maior ameaa de rede [3]. A Figura 1 mostra um grfico com as principais ameaas de rede.

Figura 1 - Principais ameaas de rede por tipo. [3]

Existem muitos tipos de injeo: SQL, LDAP, XPath, XSLT, HTML, XML, comandos de sistema operacional e outras. Falhas de injeo acontecem quando os dados de entrada de usurio so enviados e fazem parte de um comando ou consulta dinmica. O atacante confunde o interpretador para que o mesmo execute comandos manipulados enviando dados modificados. Vrios fatores podem aumentar o grau de vulnerabilidade dos sistemas, como o suporte a comentrios em comandos SQL por parte do SGBD, execuo de comandos em lotes, possibilidade de recuperao de metadados e acesso a tabelas do sistema. A Figura 2 mostra os diversos tipos de vulnerabilidade que os servidores de bancos de dados esto sujeitos.

Figura 2 - Principais tipos de ataque a bases de dados. [4]

3. Verificando a vulnerabilidade em um sistema web


Em um sistema web seguro, deve-se verificar cada parmetro de cada script da aplicao. Mesmo que uma aplicao tenha sido projetada e implementada por uma mesma pessoa e esta tenha tomado todas as precaues necessrias, no h outra forma de garantir este quesito de segurana se no a verificao de todos os pontos de entradas de dados da aplicao. [7]

3.1. Procedimentos de teste


Segundo [4], para testar a vulnerabilidade de um sistema web, deve-se realizar a substituio de cada parmetro por um apstrofo seguido de uma palavra reservada do SQL, as quais sero apresentadas posteriormente neste trabalho. Cada parmetro necessita ser testado individualmente e, ao realizar cada teste, os demais parmetros devem ser preservados com os valores vlidos para evitar que o fluxo de execuo seja desviado de forma que o parmetro que ser testado pode no chegar a ser utilizado na montagem do comando SQL. Considere a seguinte requisio HTTP vlida para a aplicao: recuperar.php?nomeEmpregado=Diogo&empresa=Recursive Esta requisio com os parmetros mudados retornaria um erro ODBC: recuperar.php?nomeEmpregado=Diogo&empresa=%20OR Enquanto esta... recuperar.php?nomeEmpregado=Invalido&empresa=%20OR

...pode retornar a pgina principal da aplicao (o que uma prtica comum de desenvolvedores, levar at a pgina principal em caso de erro). Ou, talvez quando a aplicao no consiga recuperar o nomeEmpregado vlido, ela ignore o parmetro empresa, fazendo com que o valor seja desconsiderado na montagem do comando SQL. O resultado tambm pode ser diferente destas possibilidades. Tais consideraes reforam a necessidade de preservar todos os parmetros da requisio com valores vlidos, exceto os que esto sendo testados.

3.2. Avaliao de resultados


Segundo [4], caso o servidor retorne mensagem de erro de banco de dados, ento a injeo foi definitivamente bem-sucedida. importante verificar o cdigo fonte da pgina de resultado em busca de palavras que evidenciem o ataque como ODBC, Syntax, SQL, pois muitas vezes cdigos de erro so mostrados na sada para fins de depurao, mas muitos desenvolvedores esquecem de remov-las no momento de subir a aplicao.

3.3. Injeo de SQL


Para entender como a injeo de SQL funciona, interessante abordar os conceitos bsicos de SQL, j que sobre essa linguagem que todas as formas de ataque apresentadas neste trabalho so baseadas. Na linguagem SQL existem quarto comandos bsicos na DML (Linguagem de Manipulao de Dados), o Quadro 1 mostra os comandos e suas respectivas funes.
Quadro 1 - Comandos bsicos da linguagem SQL

Comando SELECT INSERT DELETE UPDATE

Funo Consultar (selecionar) informaes em uma base de dados. Inserir informaes em uma base de dados. Remover informaes em uma base de dados Atualizar informaes em uma base de dados.

A linguagem SQL foi concebida para ser padronizada entre os SGBDs, de modo que uma aplicao possa migrar sua base de dados sem grandes alteraes de cdigo [5]. Embora cada fabricante acabe por embutir recursos adicionais em seus SGBDs para agregar valor a seus produtos, as bases da linguagem so as mesmas. O que por um lado traz vrios benefcios aos desenvolvedores de sistema, por outro lado cria novas possibilidades para ataques, assim como responsabilidades maiores sobre o quesito segurana. Na Injeo de SQL, o atacante se utiliza de entradas de dados do usurio, tais como formulrios ou passagem de parmetros por mtodo GET com a finalidade de modificar a consulta SQL que foi planejada para a aplicao, confundindo o

interpretador de comandos e fazendo com que a aplicao execute uma funo diferente da que deveria executar. Segundo [4], os ataques de injeo de SQL podem ser categorizados em ataques de primeira e segunda ordem. Os ataques de primeira ordem so aqueles onde o resultado gerado imediatamente, por meio da interface do usurio, e-mails ou arquivos. Para exemplificar um ataque de injeo de SQL de primeira ordem, considere uma consulta (SELECT) que recebe valores de forma dinmica e as utiliza para autenticar um usurio em um sistema qualquer. A Figura 3 mostra a consulta SQL usada como exemplo para o ataque. SELECT * FROM usuario u WHERE u.login = + inputLogin + AND u.senha = + inputSenha +
Figura 3 - Consulta SQL utilizada para o ataque

Considere os valores inputLogin e inputSenha como os parmetros vindos de um formulrio em uma pgina que so preenchidos pelos usurios. Assim, se no houver nenhum tipo de validao entre a camada de apresentao e a camada de lgica, o usurio pode inserir qualquer informao. A Figura 4 mostra um exemplo de entrada de dados que iro alterar a funcionalidade da consulta.

Figura 4 - Exemplo de entrada de dados em um formulrio

Com a concatenao de strings feita pela consulta, caso ela no passe por nenhuma validao entre a camada de apresentao e camada de lgica de aplicao, o resultado da consulta ser vlido, pois ela ir instruir que o sistema selecione todos os usurios (SELECT * FROM usuario u) onde o atributo login ou senha seja igual a um texto vazio ou onde o texto vazio seja igual ao mesmo texto vazio (WHERE u.login = OR =). Desse modo, todas as linhas da tabela vo responder a esses critrios, o resultado retornado seria o esperado pelo atacante, desse modo caracterizando um ataque de primeira ordem. Os ataques de segunda ordem so caracterizados por ter seu efeito adiado, na maioria das vezes h uma insero de dados na base que esto associados a eventos posteriores da aplicao. considerado uma melhor alternativa de injeo SQL, pois o atacante fica menos evidente e os prejuzos a base de dados podem ser potencializados quando utiliza-se aes futuras.

Quando falamos em de injeo de SQL, vrias tecnologias que implementam conceitos da web esto vulnerveis a estes tipos de ataque, tais como: Java, PHP, ASP, Javascript e demais tecnologias que utilizam-se de ODBC (Open Data Base Connectivity) para acessar uma base de dados.

4. Ferramentas automatizadas para injeo de SQL


Para os fins deste trabalho, foi utilizada a ferramenta automatizada Havij, que uma ferramenta automatizada de injeo SQL que ajuda os invasores a encontrar e explorar as vulnerabilidades em uma pgina web. A GUI do Havij e suas configuraes automticas de deteco torna-o fcil de utilizar mesmo por amadores [8]. Alm do Havij, existem outras ferramentas automatizadas como o Safe3SI para ambientes Windows e o SqlMap, que construda em Python e pode ser compilada tanto pra ambientes Linux quanto para Windows. [9]

5. Injeo SQL na prtica


Para a prtica de injeo de SQL realizada neste trabalho, foi utilizado a ferramenta Havij, como citada anteriormente e tendo como alvo o website da Distribuidora de Bebidas Pau Brasil (http://www.distribuidorapaubrasil.com.br)

5.1. Verificando vulnerabilidades no alvo


Para identificar a vulnerabilidade do website, foram utilizadas as tcnicas bsicas de injeo por meio de mudanas de parmetros e em seguida a utilizao da ferramenta automatizada. No primeiro cenrio temos a pgina web com todos os parmetros vlidos e exibindo-a normalmente. A Figura 5 demonstra o primeiro cenrio.

Figura 5 - Primeiro cenrio do ataque

Em um segundo cenrio, temos a mudana do segundo parmetro (id) com a adio de apstrofo e a palavra reservada OR para verificar a vulnerabilidade. A pgina respondeu com uma pgina indicando erros da linguagem PHP, o que indica que o ataque foi bem sucedido. A Figura 6 mostra o segundo cenrio do ataque, onde podemos j garantir que o tipo de banco de dados uma implementao do MySQL.

Figura 6 - Segundo cenrio do ataque

5.2. Injeo SQL com o Havij


A partir deste ponto, foi utilizada a ferramenta automatizada Havij para tentar encontrar as demais vulnerabilidades no website. Ao final da anlise, constatou-se a vulnerabilidade de Injeo SQL no site alvo. O nome do banco de dados foi encontrado, se tratando de distribu_gfotos; o servidor utilizado (Apache); a tecnologia utilizada no desenvolvimento da pgina (PHP); o SGBD utilizado (MySQL); e outros demais dados relevantes para aplicao. A Figura 7 mostra alguns dados recuperados e expostos no log do Havij.

Figura 7 - Log do Havij

O Havij utilizou a injeo com um nmero do tipo inteiro, a partir das informaes do nome do banco e do tipo de injeo, foi possvel recuperar as demais informaes da aplicao como tabelas e colunas. A Figura 8 mostra algumas das tabelas e colunas que foram obtidas com a injeo de SQL.

Figura 8 Tabelas e colunas do banco obtidas pelo Havij

Tambm possvel recuperar os dados inseridos nas tabelas. Informaes como usurio e senha de acesso a painis de controle em CMS (Content Management Systems, ou Sistemas de gerenciamento de contedo) podem ser facilmente recuperadas a partir da ferramenta Havij, mesmo que elas estejam guardadas utilizando funes de hash

como MD5, pois a ferramenta dispe de funcionalidades para decriptografar tais funes.

6. Preveno de ataques
H modos simples de evitar ataques de injeo de SQL, primeiramente deve-se validar todos os dados de entrada da aplicao, vericando tipos e comprimento dos parmetros. Porm, mesmo com validaes complexas utilizando expresses regulares, a segurana no garantida [10]. A tcnica de Prepared Statements (ou consultas pr-prontas) a tcnica mais eficaz para evitar ataques, uma vez que ela troca as variveis antes usadas com a concatenao de strings por placeholders (marcadores de lugar), de forma que o formato da consulta no pode ser alterado, apenas os parmetros. Uma consulta utilizando esta tcnica segue o padro SELECT * FROM usuario u WHERE u.login = ? AND u.senha = ?.No momento da consulta, ser informado apenas o que ficar no lugar do ? e, desta forma, a consulta estar protegida. A figura mostra um exemplo de uma consulta feita com a tcnica Prepared Statement. As linguagens para web mais comuns como Java e PHP oferecem APIs que implementam os conceitos de Prepared Statement.

7. Concluses
Durante a execuo deste trabalho, a vulnerabilidade de vrios websites foram testadas e em vrias ocasies, a injeo de SQL foi bem sucedida. Isso acontece por vrios motivos, tais como: empresas/sistemas que no tomam a segurana como uma de suas prioridades ou falta de conhecimento dos desenvolvedores. Vulnerabilidades a ataques de injeo so erros primrios de um desenvolvimento de qualquer aplicao e podem ser evitados de forma prtica adotando tcnicas como a utilizao de Prepared Statements.

Referncias
[1] Nmero de internautas j passa de 2 bilhes, afirma ONU Disponvel em <http://oglobo.globo.com/tecnologia/mat/2011/01/26/numero-de-internautas-japassa-de-2-bilhoes-afirma-onu-923610235.asp>. Acesso em 11 de maro de 2012. [2] OWASP TOP 10 As 10 vulnerabilidades mais crticas em segurana web Disponvel em <https://www.owasp.org/images/4/42/OWASP_TOP_10_2007_PTBR.pdf>. Acesso em 10 de maro de 2012. [3] Relatrio da McAfee sobre ameaas: quarto trimestre de 2011 Disponvel em <http://www.mcafee.com/br/resources/reports/rp-quarterly-threat-q4-2011.pdf>. Acesso em 11 de maro de 2012. [4] FARIAS, Marcelo Bukowski de. Injeo de SQL em Aplicaes Web Causas e preveno. Universidade Federal do Rio Grande do Sul. Porto Alegre. 2009.

[5] COSTA, Rogrio Lus de C. SQL: guia prtico. Rio de Janeiro: Brasport, 2006. [6] SQL Injetion Avanado. Disponvel em <http://pt.scribd.com/doc/56966435/SQLInjection>. Acesso em 30 de junho de 2011. [7] MEEK, B.L.; HEATH, P. Guide to Good Programming Practice. 1 ed. [S.l.]: Ellis Horwood Ltd, 1980. [8] SQL Injection using Havij Disponvel <http://www.lodge4hacker.com/2012/02/sql-injection-using-havij.html>. em 12 de maro de 2012. em Acesso

[9] Sqlmap, automatic SQL injection and database takeover tool Disponvel em <http://sqlmap.sourceforge.net/>. Acesso em 12 de maro de 2012. [10] Evite SQL Injection usando Prepared Statements no PHP Disponvel em <http://codigofonte.uol.com.br/artigo/php/evite-sql-injection-usando-preparedstatements-no-php>. Acesso em 13 de maro de 2012.