57
Unisal Wanderson Geraldo Ferreira de Paulo Um estudo de segurança da informação: Injeção de SQL Lorena 2009

SQL Injection TCC Wanderson

  • Upload
    pqnoppp

  • View
    290

  • Download
    1

Embed Size (px)

DESCRIPTION

Trabalho sobre segurança de sites, utilizado a técnica de SQL Injection para demostrar falhas e correções no código.

Citation preview

Page 1: SQL Injection TCC Wanderson

Unisal

Wanderson Geraldo Ferreira de Paulo

Um estudo de segurança da informação:

Injeção de SQL

Lorena 2009

Page 2: SQL Injection TCC Wanderson

Unisal

Wanderson Geraldo Ferreira de Paulo

Um estudo de segurança da informação:

Injeção de SQL

Lorena 2009

Trabalho de Conclusão de Curso apresentado como exigência parcial para obtenção do grau de Bacharel em 2009 no Centro Universitário Salesiano sob a orientação do Prof. Ms. José Walmir G. Duque.

Page 3: SQL Injection TCC Wanderson
Page 4: SQL Injection TCC Wanderson

Dedico à minha mãe pelo apoio e incentivo me ajudando a alcançar esse

objetivo em minha vida, superando os momentos mais difíceis.

Aos professores que nesses anos sempre me instruíram.

A todos os amigos conquistados que de alguma forma contribuíram para a

conclusão de mais esta etapa.

Page 5: SQL Injection TCC Wanderson

AGRADECIMENTOS

Agradeço, primeiramente, a Deus que me permitiu realizar este trabalho.

Aos familiares por sempre estarem presentes em minha vida e fizeram parte

desse importante passo.

Ao meu orientador Prof. Ms. José Walmir G. Duque que decisivamente

contribuiu com seu conhecimento e experiência na evolução e conclusão desse

trabalho.

A todos os professores que nesses anos me ensinaram e contribuíram muito

para o meu crescimento.

Aos amigos que me possibilitaram grandes momentos em minha vida que

serão inesquecíveis.

Enfim, a todos que, direta ou indiretamente, me ajudaram a concluir o curso.

Page 6: SQL Injection TCC Wanderson

RESUMO

A informação é o ativo mais valioso em qualquer segmento. O grande aumento

no uso de aplicações web, um enorme volume de dados se disponibilizou na

rede mundial, não tardando para que vários riscos contra a segurança da

informação atingissem a integridade, confidencialidade e disponibilidade das

informações. Este trabalho apresenta uma técnica chamada Injeção de SQL

(SQL Injection), que dentre as várias ameaças se destaca pela facilidade de

uso e poder de domínio, usada cada vez mais por crackers que procuram

vulnerabilidades para atacar bancos de dados de sistemas que não adotaram

uma metodologia de desenvolvimento segura. A pesquisa apresenta um estudo

de caso em um sistema comercial demonstrando as suas principais falhas e

como criar barreiras para impedir o sucesso desses ataques. Concluiu-se,

primeiro, que existem muitos sistemas vulneráveis, com falhas que qualquer

usuário com conhecimento em SQL poderá invadir, pois realizando algumas

consultas foi possível descobrir informações importantes que permitiu ter

acesso privilegiado e, em segundo, entendendo como funciona o ataque pode-

se criar meios de prevenção, tanto na aplicação como no banco de dados, que

anulam o ataque dificultando a invasão e preservando a informação.

Palavras Chaves:

Injeção SQL. Segurança da Informação. Banco de Dados. Internet. Aplicação

Web.

Page 7: SQL Injection TCC Wanderson

ABSTRACT

Information is the most valuable asset in any segment. The increasing use of

web applications, a huge amount of data is available on the World, and soon so

many risks to the security of information reaching the integrity, confidentiality

and availability of information. This paper presents a technique called SQL

Injection (SQL Injection), which among the various threats stands out for ease

of use and power of domination, increasingly used by criminals who seek to

attack vulnerabilities database systems that have not adopted a safe

development methodology. The research presents a case study in a

commercial system showing major faults and how to create barriers to prevent

the success of these attacks. It is concluded, first, that exists many systems

vulnerable, with flaws that any User with knowledge of SQL can invade,

because doing some queries could find important information that allowed

privileged access, and second, understanding how works the attack can to

create means of prevention, both in the application as the database, which

suppress the attack difficulting to invasion and preserving information.

Key-words:

SQL Injection. Information Security. Database. Internet. Web Application.

Page 8: SQL Injection TCC Wanderson

LISTA DE FIGURAS

Figura 1.1 – Diagrama de sistema de armazenamento de dados.....................21 Figura 2.1 – Tela de Autenticação ....................................................................30 Figura 2.2 – Script em PHP para verificação do usuário ..................................30 Figura 2.3 – Exemplo URL................................................................................31 Figura 2.4 – Script em PHP para consulta de produto......................................31 Figura 2.5 – Tentativa de ataque pela URL ......................................................32 Figura 2.6 – Script em PHP concatenado com UNION.....................................32 Figura 2.7 – Script em PHP concatenado com DROP......................................32 Figura 2.8 – Script PHP concatenado com aspas simples ...............................33 Figura 2.9 – Código SQL para consulta de produto..........................................34 Figura 2.10 – Erro causado com uso da aspas simples ...................................34 Figura 2.11 – Versão do banco de dados .........................................................34 Figura 2.12 – Union com a tabela information_schema....................................35 Figura 2.13 – Gráfico de exploração da vulnerabilidade de Injeção de SQL ....36 Figura 3.1 – Utilizando parâmetro pela URL em PHP.......................................37 Figura 3.2 – Erro mostrando que há vulnerabilidade ........................................38 Figura 3.3 – Erro mostrando que não existe coluna 25 ....................................38 Figura 3.4 – Versão do banco de dados ...........................................................39 Figura 3.5 – Descobrindo as tabelas e colunas ................................................40 Figura 3.6 – Campo Id da tabela de Usuários ..................................................40 Figura 3.7 – Campo Nome da tabela de Usuários ............................................41 Figura 3.8 – Campo Senha da tabela de Usuários ...........................................41 Figura 3.9 – Usuário e senha válida .................................................................41 Figura 3.10 – Tela de Login do sistema............................................................42 Figura 3.11 – Tela principal com usuário Identificado.......................................43 Figura 3.12 – Tela de Login com Código SQL..................................................44 Figura 3.13 – Código PHP com a função addslashes.......................................46 Figura 3.14 – Código PHP com a função strtr...................................................47 Figura 3.15 – Código PHP com a função mysql_real_escape_string ...............48 Figura 3.16 – Verificação do tipo da variável em PHP......................................48 Figura 3.17 – Função em PHP para validar String............................................49

Page 9: SQL Injection TCC Wanderson

LISTA DE TABELAS

Tabela 1.1 – Surgimento e evolução da SQL................................................... 15

Tabela 1.2 – Evolução dos Bancos de Dados.................................................. 19

Tabela 2.1 – Alguns caracteres utilizados no ataque....................................... 28

Page 10: SQL Injection TCC Wanderson

SUMÁRIO

INTRODUÇÃO..................................................................................................12

1 FUNDAMENTOS DE BANCO DE DADOS E LINGUAGEM DE CONS ULTA..........................................................................................................................14

1.1 – HISTÓRIA DO SQL ..................................................................................14 1.2 – APLICABILIDADES DA LINGUAGEM SQL..............................................15 1.2.1 – DIVISÕES DO SQL ...............................................................................16 1.2.1.1 – DDL – LINGUAGEM DE DEFINIÇÃO DE DADOS ............................16 1.2.1.2 – DML – LINGUAGEM DE MANIPULAÇÃO DE DADOS .....................16 1.2.1.3 – DCL – LINGUAGEM DE CONTROLE DE DADOS............................17 1.3 – SGBD E BANCO DE DADOS ...................................................................18 1.3.1 - HISTÓRIA DO BANCO DE DADOS .......................................................18 1.3.2 - O QUE É BANCO DE DADOS................................................................20 1.3.3 - O QUE É SGBD......................................................................................20 1.3.4 – POR QUE USAR BANCO DE DADOS...................................................21 1.3.5 – SGBD NOS DIAS ATUAIS.....................................................................21 1.4 – SEGURANÇAS DOS DADOS ..................................................................22 1.4.1 – POSSÍVEIS DANOS..............................................................................23 1.4.2 – ATITUDES A SEREM TOMADAS..........................................................23

2 APLICAÇÕES WEB E INJEÇÃO DE SQL.................................. ..................25

2.1 – APLICAÇÕES WEB..................................................................................25 2.1.1 – DESENVOLVIMENTO WEB..................................................................26 2.1.2 – CONEXÃO COM BANCO DE DADOS...................................................26 2.1.3 – DESENVOLVIMENTO SEGURO ..........................................................26 2.2 – SQL INJECTION ......................................................................................27 2.2.1 – CARACTERES ESPECIAIS ..................................................................28 2.2.2 – O ATAQUE............................................................................................29 2.2.3 – ADVANCED SQL INJECTION...............................................................33 2.2.4 – OBTENDO INFORMAÇÕES .................................................................33 2.2.5 – ESTATÍSTICA .......................................................................................35

3 UM ESTUDO DE CASO DE SEGURANÇA DA INFORMAÇÃO ..... .............37

3.1 – ATAQUE PELA URL.................................................................................37 3.2 – ATAQUE PELO FORMULÁRIO DE LOGIN ..............................................43 3.3 – DEFESA DO SISTEMA ............................................................................44 3.3.1 – ENTENDENDO O ATAQUE ..................................................................45 3.3.2 – TÉCNICAS DE DEFESA NA APLICAÇÃO ............................................45 3.3.2.1 – TRATANDO OS DADOS DE ENTRADA ...........................................45 3.3.2.2 – TRATANDO OS DADOS DE SAÍDA..................................................50 3.3.3 – TÉCNICA DE DEFESA NO BANCO DE DADOS...................................51

Page 11: SQL Injection TCC Wanderson

4 CONSIDERAÇÕES FINAIS............................. ..............................................54

GLOSSÁRIO .......................................... ..........................................................56

REFERÊNCIAS ................................................................................................57

Page 12: SQL Injection TCC Wanderson

12

INTRODUÇÃO

Essa pesquisa tem como tema a Prevenção à Injeção de Código SQL e

se insere na área de segurança da informação, destinado para sistemas que

utilizam conexão com banco de dados.

Este trabalho tem por objetivo realizar um estudo de caso de Injeção de

SQL, um ataque que cada vez mais se destaca principalmente pela sua

facilidade de execução e pelo alto poder de domínio, apresentando algumas

estratégias de defesa em uma aplicação web.

A informação de qualquer empresa é o bem mais precioso que ela

possui, podendo ser levada à falência caso perca tais informações. Assim um

usuário mal intencionado pode, através das técnicas desse ataque, invadir os

sistemas desprotegidos e roubar, alterar, inserir ou excluir qualquer informação.

Para a execução do ataque é necessário apenas um navegador e

conhecimento da linguagem SQL, sendo através da URL (Uniform Resource

Locator) ou de algum campo login ou senha, que é inserido o código

inesperado pelo desenvolvedor.

Ao final desse trabalho será possível compreender melhor essa técnica

e incluir junto ao desenvolvimento de novos sistemas uma metodologia mais

segura dificultando as tentativas de invasões. Para elaboração do presente

foram pesquisados vários autores como Oliveira, Date, Albuquerque entre

outros.

Pretende-se, para tal objetivo, primeiramente realizar um estudo sobre

banco de dados e a Linguagem SQL (Structured Query Language) do ponto de

vista de segurança. Logo em seguida, serão estudadas as técnicas mais

usadas em ataques a bancos de dados bem como sua demonstração. Para

isso serão feitos testes em aplicativos com códigos desprotegidos que

possibilitarão ter controle do sistema ou, mesmo sem ter acesso com

permissão de administrador, poder executar ações diretamente no banco de

dados. Pretende-se também, por implementação, demonstrar as técnicas para

anular os ataques.

O trabalho está divido em três capítulos. O primeiro descreve um pouco

do histórico dos Bancos de Dados e da linguagem SQL, como surgiu, a

evolução e os motivos que os fizeram ter a importância de hoje, assim como

Page 13: SQL Injection TCC Wanderson

13

são relatados alguns conceitos de segurança. O segundo capítulo é dividido

em duas partes, onde a primeira aborda desenvolvimento web como as

tecnologias, práticas de desenvolvimento e a conexão com o banco de dados e

na segunda parte o SQL Injection como suas características, funcionamento e

alguns exemplos. E por fim, no terceiro e último capítulo, é abordado

especificamente o ataque, é demonstrada a técnica em funcionamento

explorando o que é possível fazer na base de dados e logo em seguida as

atitudes que deverão ser tomadas, via programação, para anular o ataque.

Page 14: SQL Injection TCC Wanderson

14

1 FUNDAMENTOS DE BANCO DE DADOS E LINGUAGEM DE CONSULTA

Neste primeiro capítulo será abordada a história dos bancos de dados e

da linguagem utilizada por eles, o SQL. O objetivo é demonstrar alguns

aspectos históricos, desde o surgimento até os dias atuais, sua utilização,

importância e principalmente a ligação existente entre ambos que os fazem

serem tão poderosos e indispensáveis no dias atuais.

1.1 – HISTÓRIA DO SQL

A origem da linguagem que hoje é denominada SQL (Structured Query

Language ou Linguagem de Consulta Estruturada), se deu com um estudo

sobre banco de dados relacionais, onde o objetivo era permitir que usuários

armazenassem e recuperassem grande quantidade de informações. Sendo

publicado em um artigo intitulado “A Relational Model of Data for Large Shared

Data Banks” (Um Modelo Relacional de Dados para Grandes Bancos de Dados

Compartilhados), no jornal Association of Computer Machinery, por Edgar

Frank Codd em 1970, membro do Laboratório de Pesquisa da IBM, em San

Jose, Califórnia.

A primeira versão da linguagem foi criada pela IBM e muitas de suas

características usam os conceitos da álgebra relacional de Codd, durante o

desenvolvimento do sistema R, surgindo assim o SEQUEL (Structured English

Query Language). Com a evolução da SEQUEL veio o surgimento do SQL. Em

1979, a Relational Software Inc., hoje Oracle Corporation, lançou a primeira

versão comercial da linguagem.

Hoje a SQL é largamente usada para a manipulação dos dados em um

banco de dados, desta maneira, as organizações ANSI (American National

Standards Institute) e ISO (International Standards Organization), especificou a

linguagem como padrão dos bancos de dados relacional (Date, 2004), onde o

primeiro padrão foi definido em 1986, o SQL-86, baseado no SQL da IBM. Em

1989 uma nova padronização foi publicada pela ISO incluindo recursos como

integridade de referência e os valores NULL e DEFAULT. A linguagem passou

Page 15: SQL Injection TCC Wanderson

15

por aperfeiçoamentos e, em 1992 foi publicada a terceira versão do padrão

SQL, o SQL-92 ou SQL2. Um novo padrão, chamado de SQL-99, conhecido

também como SQL3, foi lançado em 1999 com novas características, sendo a

mais importante a adição de orientação a objetos. E a mais nova versão do

padrão da linguagem SQL é a SQL2003, sendo adicionado o tratamento de

XML (Costa, 2006).

A Tabela 1.1 abaixo mostra o surgimento e a evolução da SQL.

SEQUEL (1970) Publicação do artigo de Codd pela IBM

SQL (1979) 1ª Versão comercial – ORACLE

SQL-86 (1986) 1º Padrão especificado pela ANSI e ISO

SQL-89 (1989) 2ª Versão com novos recursos especificados pela

IBM, ANSI e ISO.

SQL-92 ou SQL-2 (1992) Publicada a 3ª versão especificada pela ANSI e

ISO

SQL-99 ou SQL-3 (1999) Novo padrão com orientação a objetos

SQL:2003 (2003) 4º Versão com tratamento de XML

Tabela 1.1 – Surgimento e evolução da SQL

Fonte: Próprio Autor

1.2 – APLICABILIDADES DA LINGUAGEM SQL

A SQL é a linguagem padrão de sistemas de banco de dados que serve

tanto para manipulação quanto para a definição de dados, sendo bem diferente

das linguagens de programação, principalmente por não ser possível criar

programas executáveis, mas sua simplicidade, facilidade e suficiência no trato

com banco de dados, fez com que as melhores e mais recentes linguagens de

programação suportassem esses recursos em todas suas funções. Em SQL

não se especifica como ou em que ordem serão executadas os comandos que

irão fornecer os resultados esperados, e sim, informamos o que se quer e o

sistema de banco de dados é o responsável por escolher adequadamente os

procedimentos a serem executados, de forma que os resultados sejam obtidos

com a maior eficiência possível.

Page 16: SQL Injection TCC Wanderson

16

1.2.1 – DIVISÕES DO SQL

SQL é dividido em grupos, ou sub-linguagens, para melhor definir a

linguagem. Cada grupo tem sua função específica responsável por partes

distintas na linguagem.

1.2.1.1 – DDL – LINGUAGEM DE DEFINIÇÃO DE DADOS

O grupo DDL (Data Definition Language ou Linguagem de Definição de

Dados) possibilita ao usuário criar, alterar ou excluir componentes. A maioria

dos sistemas de banco de dados aceita os comandos DDL.

• CREATE – cria um objeto na base de dados.

Sintaxe: CREATE [objeto] [nome_objeto];

Exemplo: CRETAE table aluno;

• ALTER – altera um objeto na base de dados.

Sintaxe: ALTER TABLE (ação) [nome_tabela] (parâmetros);

Exemplo: ALTER TABLE add column aluno varchar(50);

• DROP – exclui um objeto na base de dados.

Sintaxe: DROP [objeto] [nome_objeto];

Exemplo: DROP TABLE aluno;

1.2.1.2 – DML – LINGUAGEM DE MANIPULAÇÃO DE DADOS

O grupo DML (Data Manipulation Language ou Linguagem de

Manipulação de Dados), como o próprio nome diz, possibilita a manipulação, o

que compreende as operações de selecionar, inserir, apagar ou atualizar os

dados nos bancos de dados.

“A SQL DML abrange uma linguagem de consulta baseada tanto na

álgebra relacional quanto no cálculo relacional de tuplas.” (Silberschatz, Korth,

Sudarshan, 1999, p.110).

• SELECT – seleciona uma ou várias linhas de registros, formando as

conhecidas query (consultas) de resultado. Este é o comando mais

utilizado em conjunto com as cláusulas de condições.

Page 17: SQL Injection TCC Wanderson

17

Sintaxe: SELECT [campos] FROM [tabela] WHERE [condição]

[parâmetros]

Exemplo: SELECT id_aluno, nome FROM aluno

WHERE idade_aluno > 16 ORDER BY nome ASC

• INSERT – insere novos registros nas tabelas do banco de dados,

permitindo inserir vários dados em uma única execução do comando.

Sintaxe: INSERT INTO [tabela] [campos] VALUES [valores]

Exemplo:

INSERT INTO aluno (id_aluno, nome, idade_aluno)

VALUES (‘01’, ‘aluno A’, ‘17’);

• UPDATE – atualiza os registros existentes nas bases de dados.

Combinado com as cláusulas de condições, permite fazer alterações em

vários registros com uma única execução.

Sintaxe: UPDATE [table] SET [campo] = [valor] WHERE [condição]

Exemplo: UPDATE aluno SET idade_aluno = ‘aluno B’

WHERE id_aluno = ‘01’

• DELETE – remove linhas de registros de uma tabela do banco de dados,

usando as cláusulas de condições para definir quais as linhas serão

afetadas ou não.

Sintaxe: DELETE FROM [tabela] WHERE [condição]

Exemplo: DELETE FROM aluno WHERE id_aluno = ‘01’

1.2.1.3 – DCL – LINGUAGEM DE CONTROLE DE DADOS

O grupo DCL (Data Control Language ou Linguagem de Controle de

Dados) controla a segurança interna da base de dados, sendo as permissões

destinadas aos usuários para controlar quem tem acesso para visualizar ou

manipular os dados.

• GRANT – permite ao usuário executar operações.

Sintaxe: GRANT [parâmetro] [tabela] [parâmetro] [grupo/usuário]

Exemplo: GRANT SELECT ON aluno TO GROUP professores

• REVOKE – anula privilégios do usuário, é o contrário ao GRANT.

Page 18: SQL Injection TCC Wanderson

18

Sintaxe: REVOKE [parâmetro] [tabela] [parâmetro] [grupo/usuário]

Exemplo: REVOKE ALL ON aluno TO usuário

1.3 – SGBD E BANCO DE DADOS

Algumas pessoas fazem confusão na distinção entre banco de dados e

SGBD. Na verdade ambos trabalham juntos, mas, a seguir apresentam-se o

detalhamento e a função de cada um.

1.3.1 - HISTÓRIA DO BANCO DE DADOS

Entre as décadas de 50 e 60, o armazenamento e acesso aos dados

eram feitos através de arquivos de texto, de maneira bem simples com os

campos de tamanho fixo e o acesso era apenas através de leitura de arquivos.

Enquanto isso, iniciativas de projetos mais avançados estavam em andamento

por grupos restritos de pessoas em busca de melhorar essa situação,

percebendo que o modo usado até então não era eficiente e nem, tampouco,

seguro.

Em 1963 os Estados Unidos da América formaram a conferência

"Development and Management of a Computer-Centered Data Base"

("Desenvolvimento e Gerenciamento de um Banco de Dados para

Computadores") onde o termo base de dados foi definido como “Um conjunto

de arquivos (tabelas), onde um arquivo é uma coleção ordenada de registros

(linhas), e um registro consiste em uma ou mais chaves e dados”.

Segundo Date (2004) um banco de dados “é um conjunto de dados

constantes utilizados por aplicações”.

O grupo formado nos EUA no ano de 1971 descreveu o Modelo de

Dados em Rede, onde o banco de dados é uma coleção de registros

conectados uns ao outros por meio de links, modelo que definiu muitos

conceitos importantes para a definição de outros bancos de dados, inclusive o

Modelo Relacional, muito utilizado nos dias atuais.

Page 19: SQL Injection TCC Wanderson

19

No mesmo período, as empresas IBM, North American Rockwell e a

Caterpillar Tractor se uniram para o desenvolvimento do ICS – Information

Control System (Sistema de Controle de Informações) que seria o banco de

dados responsável pelo armazenamento e recuperação dos dados, e da DL/I –

Data Language/I (Linguagem de Dados/I) que era a linguagem de consulta

necessária para acessar os dados. Ambos, o ICS e a DL/I, iriam auxiliar em um

projeto de construção de uma espaçonave que estava acontecendo.

O Modelo de Dados em Rede e o DL/I da IBM foram um marco

fundamental, definindo um modo pelo qual, separavam os dados e o código da

aplicação esboçando o banco de dados.

No ano de 1976, pelo Dr. Peter Chen, foi criado o Modelo de Entidade-

Relacionamento (MER) com a finalidade de representar as estruturas de dados

de uma forma mais natural e mais próxima do mundo real dos negócios.

Na década de 80 o System R (Sistema R), foi o primeiro banco de dados

relacional da IBM, que depois deu lugar ao chamado SQL/DS que foi

disponibilizado comercialmente e de acordo com Silberschatz, Korth e

Sudarshan (1999) este foi o primeiro modelo de dados incorporado para

aplicações comerciais. Nos anos seguintes a evolução continuou surgindo

novas alternativas reconhecidas até hoje, por exemplo, o Microsoft SQL Server,

MySQL, PostgreSQL e Oracle.

A Tabela 1.2 a seguir mostra a evolução dos Bancos de Dados.

Década de 50 e 60 Armazenamento de dados em arquivo texto.

Conferência nos EUA

(1963)

Definido o termo Base de Dados.

Modelo de Dados em

Rede, ICS e DL/I (1971)

EUA e IBM tiveram um marco fundamental no

esboço do banco de dados.

MER (1976) Peter Chen cria o Modelo de Entidade-

Relacionamento.

Sistema R (1980) Primeiro banco de dados da IBM.

SQL Server (1988) Primeira versão do SQL Server da Microsoft.

MySQL (1995) Primeira versão do MySQL.

Tabela 1.2 – Evolução dos Bancos de Dados

Fonte: Próprio Autor

Page 20: SQL Injection TCC Wanderson

20

1.3.2 - O QUE É BANCO DE DADOS

“Banco de dados é o conjunto de dados integrados que tem por objetivo

atender a uma comunidade de usuários.” (Heuser, 2001, p. 3).

Primeiramente, deve-se compreender a noção de dado.

Um dado é uma parte da informação que, sem estar em conjunto com

outros dados, não tem utilidade. Assim, um conjunto de dados forma uma

informação que, se estiver bem estruturada, possibilita ao usuário tomar

decisões importantes.

Basicamente, um dado é um conjunto alfanumérico, ou de imagem, que não está agregado a nenhum conhecimento específico, tornando-o inutilizável para quem não souber em qual contexto está contido e o que exatamente representa, não podendo interpretá-lo. (Milani, 2008, p.312).

1.3.3 - O QUE É SGBD

Os SGBD, acrônimo de Sistemas Gerenciadores de Banco de Dados

são basicamente sistemas computadorizados de manutenção de registros, com

finalidade de armazenar informações e permitir que os usuários busquem e

atualizem essas informações quando for necessário, ou seja, o principal

objetivo de um SGBD é prover um ambiente que seja adequado e eficiente

para recuperar e armazenar informações do banco de dados.

SGBD foram projetados para gerenciar grandes grupos de informações,

armazenando de forma lógica e organizada os dados juntamente com a

linguagem SQL, o SGBD se tornou uma ferramenta muito poderosa capaz de

arquivar enormes quantidades de dados, permitindo com facilidade e agilidade

consultar a informação que for necessária ao usuário, sendo assim, gerir os

mais variados tipos de dados e tamanhos.

Um Sistema Gerenciador de Banco de Dados (SGBD) é constituído por um conjunto de dados associados a um conjunto de programas para acesso a esses dados. O conjunto de dados, comumente chamado de banco de dados, contém informações sobre uma empresa em particular (Silberschatz, Korth, Sudarshan, 1999, p.1).

Page 21: SQL Injection TCC Wanderson

21

A Figura 1.1 a seguir é um diagrama de um sistema completo para

armazenamento de dados com a base de dados, SGBD e aplicativo para uso

do usuário.

Figura 1.1 – Diagrama de sistema de armazenamento d e dados

Fonte: http://acdtecnologia.files.wordpress.com/200 8/04/banco-de-dados.jpg

1.3.4 – POR QUE USAR BANCO DE DADOS

Os bancos de dados foram desenvolvidos para guardar dados de forma

lógica e organizada e facilitar o acesso aos mesmos a qualquer momento que

seja requisitado pelos usuários.

Um SGBD pode possibilitar para as pessoas, muitas vezes com pouco

conhecimento na linguagem SQL, usufruir dos dados fazendo as consultas,

alterações, inclusões ou exclusões.

1.3.5 – SGBD NOS DIAS ATUAIS

Houve muita evolução dos Sistemas Gerenciadores de Banco de Dados

desde o seu surgimento até os dias atuais, passando por várias modificações

Page 22: SQL Injection TCC Wanderson

22

que agregaram mais valor aos sistemas, novos recursos e melhorias que os

tornaram nos dias de hoje uma ferramenta indispensável para o uso nas

organizações, pois a preservação e organização dos dados são fundamentais

para o funcionamento de qualquer empresa.

Há empresas que utilizam apenas um sistema de banco de dados, mas

há também aquelas que preferem vários sistemas independentes, por exemplo,

um sistema para cada setor.

Existem vários meios de se utilizar os bancos de dados, o mais usado é

o modo cliente/servidor, onde o banco é instalado no servidor da empresa e as

máquinas clientes fazem o acesso, podendo executar as operações de acordo

com as permissões definidas pelas regras de segurança.

1.4 – SEGURANÇAS DOS DADOS

Uma das maiores preocupações na área da informática e em toda a

empresa, inclusive da alta administração, é a questão de segurança. As

medidas adotadas nas organizações tendem a evitar catástrofes físicas como

incêndios ou desabamentos, isto porque o prejuízo em equipamentos é

altíssimo, mas tanto quanto ou mais importante que os equipamentos são as

informações. Portanto, não são somente os desastres físicos que colocam em

risco a vida da empresa, é preciso prevenir também outros agentes não físicos,

internos e externos, que são tão perigosos como os demais.

O risco de crimes virtuais através de computadores está cada vez mais

constante ameaçando o “tesouro das empresas”.

O único sistema totalmente seguro é aquele que não possui nenhuma forma de acesso externo, está trancado em uma sala totalmente lacrada da qual uma única pessoa possui a chave. E esta pessoa morreu ano passado (Oliveira, 2001, p.11).

Com o avanço da internet, cresceu muito o uso de sistemas web,

tornando esses sistemas, de modo geral públicos, ao qual qualquer pessoa no

mundo consegue ter acesso, o que, conseqüentemente, também os deixa

vulneráveis a ataques mal intencionados.

Page 23: SQL Injection TCC Wanderson

23

A segurança em banco de dados diz respeito à proteção do banco de

dados, protegendo as informações nele contidas contra ataques intencionais ou

não, utilizando-se de meios computacionais e não computacionais para

preservá-los.

Partindo do princípio definido pelo autor Edson Luiz Riccio (1981) em

sua dissertação de mestrado “Segurança e Processamento de Dados” ao dizer:

“Qualquer que seja o controle adotado, as chances de serem ineficazes são

bastante grandes e, portanto o risco estará sempre presente”.

1.4.1 – POSSÍVEIS DANOS

Muitos são os resultados negativos após ter o sistema invadido por

pessoas maliciosas. Dados podem ser apagados ou alterados levando

empresas a desordem total, ficando perdidas no meio de informações

inconsistentes, sem saber o que de fato é real. Vários podem ser os efeitos

dessas invasões, que podem ultrapassar os limites da empresa e afetar seus

clientes, fornecedores e parceiros.

Imaginar um acesso malicioso aos dados pessoais dos clientes que são

sigilosos, como todos os dados da empresa, é desastroso pois, são dados que

não são somente relacionados a organização, mas principalmente dizem

respeito a vida particular desses clientes.

Ou seja, isso pode sair muito caro fazendo as empresas gastarem muito

dinheiro para tentar reverter essa situação ou mesmo a levar para a falência

forçando seu fechamento como já ocorreu com várias organizações, provando

que por falta de atitudes dos responsáveis toda essa queda poderia ter sido

evitada. (Oliveira, 2001).

1.4.2 – ATITUDES A SEREM TOMADAS

Todos os administradores de sistemas realizam, ou deveriam realizar,

cópias de segurança de todo o sistema. Fazer a cópia da base de dados em

meios que estejam fora do prédio da empresa é uma maneira de se poder

Page 24: SQL Injection TCC Wanderson

24

recuperar os dados caso alguma tragédia aconteça. Essa tarefa é algo que

deve entrar para a rotina do setor responsável, normalmente o departamento

de Teconologia da Informação, pois se for perdida a base de dados por

qualquer motivo que seja, para a empresa voltar aos trâmites normais com

certeza vai ser necessário restaurar os dados, e mesmo assim é bem possível

que seja perdida alguma informação por causa do intervalo de tempo que há

entre uma execução da cópias de segurança e outra.

Criar um programa de segurança é uma tarefa dinâmica que envolve diversas etapas. O seu ponto de partida é formular uma situação de conectividade à internet na qual os objetivos dessa conexão são claramente articulados. (Bernstein; et al, 1997, 59p).

Existem inúmeras maneiras de ajudar na prevenção. Métodos como

antivírus, proxy e firewall também são muito importantes para manter a

consistência do sistema, mas, para dificultar mais ainda o sucesso de crackers

na tentativa de invasão, os administradores de banco de dados têm a total

liberdade de limitar o acesso dos usuários aos dados, permitindo somente o

direito de leitura para os que necessitam apenas consultar as informações, e a

permissão de modificar dados somente para os que realmente necessitam.

Essas formas computacionais, nas quais através de meios informatizados é

aumentada a barreira de proteção da base de dados, que além de dificultar o

acesso indevido a pessoas não autorizadas, também ajuda a prevenir

acidentes involuntários, causados, por exemplo, por pessoas leigas no assunto

que, mesmo sem a intenção de prejudicar, acaba excluindo ou alterando algum

registro.

Em síntese, durante o passar do tempo, nos últimos anos, a área de

tecnologia da informação vem evoluindo muito e, como na informática o leque

de opções é imenso, não haveria como todos os seus segmentos não terem se

expandido, como pôde ser visto na linguagem SQL e Banco de Dados, bem

como histórico, uso e segurança de dados.

Page 25: SQL Injection TCC Wanderson

25

2 APLICAÇÕES WEB E INJEÇÃO DE SQL

O ataque pode ser utilizado em diversos sistemas independente de

plataforma, mas os atacantes preferem a plataforma web por ser possível ter o

acesso de qualquer lugar do mundo que haja uma conexão com a internet, com

esse propósito este capítulo trata dois itens de grande relevância no trabalho,

as aplicações web e a injeção de SQL.

2.1 – APLICAÇÕES WEB

As aplicações podem ser web ou arquitetura cliente-servidor. Nas

aplicações com a arquitetura cliente-servidor, a instalação da aplicação é feita

em todas as máquinas clientes (interface para o usuário), acarretando uma

perda de tempo cada vez que havia uma atualização, pois, para manter os

clientes atualizados era necessária que em todas as máquinas fosse atualizada

a versão do sistema. Após o surgimento da internet, uma rede constituída de

várias redes de proporção mundial, as aplicações web ficaram mais acessíveis

dispensando a instalação micro a micro, com essa nova arquitetura, se pode

acessar uma aplicação web através de algum navegador e, quando há

atualizações, as alterações são apenas no servidor, sem a percepção dos

usuários, pois a aplicação não fica instalada em sua máquina.

Com o passar do tempo, surgiu a necessidade da construção de aplicações com a função de reconhecer novos tipos de informações vindas dos usuários, comunicar-se com outros sistemas, como um banco de dados, além de manter inúmeras páginas da Web site rapidamente atualizadas. (Aquino, 2006, p.31)

O mundo da internet evoluiu muito desde o seu surgimento, passando

por várias etapas, da web estática à web dinâmica onde começou a ter funções

interessantes que interagem com o usuário tendo maiores atrativos. Entre

essas funções está a comunicação com banco de dados, guardando

informações para todos os fins como cadastro básico até dados corporativos de

empresas que possuem todos os seus registros na web.

Page 26: SQL Injection TCC Wanderson

26

2.1.1 – DESENVOLVIMENTO WEB

As aplicações web tiveram uma crescente evolução devido à

portabilidade que é oferecida aos usuários, pois a preferência é bem maior em

poder acessar um sistema web site de qualquer computador ou até mesmo de

dispositivos portáteis como celulares do que acessar um sistema desktop que

está instalado em um computador específico.

Existem várias maneiras de se criar páginas web, várias linguagens de

programação podem ser usadas; dentre as mais conhecidas estão JSP, PHP e

ASP. Essas são todas linguagens de alto nível usadas por muitos

desenvolvedores, praticamente cada uma faz tudo que outra faz, cada qual

com sua particularidade dependendo muito de qual o desenvolvedor se adapta

melhor.

2.1.2 – CONEXÃO COM BANCO DE DADOS

Todas as linguagens fornecem meios para criar uma conexão com

banco de dados, com essa conexão pode-se criar uma ponte de comunicação

direta com a base de dados tendo através dela a possibilidade de executar

qualquer ação no banco.

A conexão exige uma autenticação com nome de usuário e senha, para

garantir maior segurança do sistema é muito importante que essa autenticação

tenha o mínimo de permissão, ou seja, deverá ser liberada somente a ação que

realmente necessita para o bom funcionamento do sistema. A permissão

máxima que permite realizar qualquer ação na base de dados deve ficar

somente com os administradores do banco de dados, isso impossibilita que

seja realizada qualquer alteração na estrutura da base pelo sistema.

2.1.3 – DESENVOLVIMENTO SEGURO

O desenvolvimento web encontra problemas na engenharia de seus

projetos; alguns são a falta experiência dos desenvolvedores, inexistência da

Page 27: SQL Injection TCC Wanderson

27

documentação do projeto, layout inadequado para portadores de deficiência

visual, falta de tratamento na entrada das informações e principalmente a não

utilização de uma metodologia que inclui o espaço de segurança necessário

para garantir proteção aos dados (Conallen, 2003).

Ao se falar em aplicações web aparece a grande preocupação em

relação à integridade dos dados, a dúvida se os dados realmente estão

seguros permanece. Mesmo investindo grande capital em equipamentos de

prevenção de ataques e softwares para monitoramento de rede não é o

suficiente para tornar um projeto completamente seguro, pois muitas vezes não

existe no momento do desenvolvimento dos projetos um tratamento específico

para aumentar a segurança.

O desenvolvimento de sistemas é um dos pontos mais críticos para garantia de segurança da informação de uma empresa. Procedimentos, treinamento, política de segurança, dentre outros são aspectos importantes a serem considerados. (Albuquerque; Ribeiro, 2002, p.106).

É muito importante dar atenção para a criação do código seguro e

também a segurança do código, evitar o roubo, alteração ou perda do código

fonte. É impossível desenvolver uma aplicação com alguma segurança em um

ambiente inseguro (Albuquerque; Ribeiro, 2002).

2.2 – SQL INJECTION

SQL Injection ou, português, Injeção de SQL é a inserção de código

SQL concatenando o script com o que já existe nas aplicações buscando ter

um resultado que possibilite ao usuário mal intencionado realizar uma ação

indevida.

Mesmo aparentando ser simples implementar meios de proteção contra

esse ataque, há uma grande quantidade de sistemas ativos conectados na

internet com total desproteção ainda sendo totalmente vulneráveis correndo o

risco de serem invadidos (Scambray; Shema, 2003).

O princípio básico dessa técnica é obter vantagem em cima de código

inseguro de algum sistema conectado na internet explorando vulnerabilidades

Page 28: SQL Injection TCC Wanderson

28

nas aplicações causando mensagens de erros até que o atacante consiga

interpretar a estrutura do sistema e assim adaptar a consulta SQL e executar a

injeção. Ao injetar código SQL, pode-se conseguir informações sigilosas ou

invadir o sistema sem ser autenticado. Com a entrada permitida, o usuário com

direitos de administrador tem acesso total ao sistema, podendo realizar

qualquer operação causando danos indesejáveis a qualquer desenvolvedor.

2.2.1 – CARACTERES ESPECIAIS

Para execução do ataque são muito utilizados caracteres especiais que

fazem parte da gramática da linguagem SQL. Esses caracteres são

compreendidos pelo banco de dados como parte da query (consulta) enviada

pela aplicação e assim o executam normalmente.

Importante conhecer esses caracteres especiais para poder utilizá-los da

melhor forma possível, pois possuem funções úteis e de grande siginificado

para a linguagem.

Encontrar os caracteres maliciosos diminui os riscos dificultando o

sucesso do ataque pela Injeção SQL (Torres, 2003).

A seguir segue a Tabela 2.1 com alguns dos caracteres mais usados

nos ataques.

CARACTER FUNÇÃO

‘ ou “ Caractere indicador de textos (encerra string de texto)

-- ou # Comenta uma linha

/* ... */ Comenta várias linhas

+ Adiciona ou concatena

% Insere um atributo (caractere coringa)

@@variável Variável global

Tabela 2.1 – Alguns caracteres utilizados no ataque

Fonte: Próprio Autor

Page 29: SQL Injection TCC Wanderson

29

2.2.2 – O ATAQUE

O ataque de Injeção de código SQL é um dos mais usados pelos

crackers. A quantidade de sistemas web desprotegidos é imensa e qualquer

sistema que receba parâmetros para algum banco de dados pode estar

vulnerável. Portanto, em um cenário onde existe informação armazenada em

banco de dados e que possam ser acessadas via web, tem-se a possibilidade

desse ataque, e, para isso, é necessário apenas um navegador web,

conhecimento em linguagem SQL e imaginação para montar a nova query de

consulta ao banco de dados.

O SQL Injection é um tipo de ataque muito simples, porém muito

perigoso. Fundado em cima de comandos SQL, tanto DML (Data Manipulation

Language) que são os comandos de manipulação SELECT, INSERT, UPDATE

e DELETE, como DDL (Data Definition Language) que são os comandos de

definição de dados CREATE, DROP e ALTER.

O modo mais comum de utilizar o ataque é através da manipulação de

comandos SQL já existentes na aplicação, explorando a vulnerabilidade

através dos formulários para identificação do usuário, ou seja, os campos

destinados para o usuário digitar seu login e senha. Esta manipulação ocorre

pela alteração que sofre a cláusula WHERE ou acrescentando ao comando

SQL o operador UNION mudando o sentido da consulta que por falha da

aplicação acaba resultando em acesso indevido ao banco de dados ou na

própria aplicação.

As linguagens dinâmicas, como PHP, ASP ou JSP, fornecem a

possibilidade de conexão com banco de dados, que são normalmente

utilizadas nas aplicações. Como exemplo, em um sistema para verificar se um

usuário está devidamente cadastro é apresentada uma tela de autenticação.

Para o cracker que pretende invadir esse sistema, essa tela é uma porta de

entrada pois nela serão inseridos valores que serão concatenados no código

SQL existente, como mostra a Figura 2.1.

Page 30: SQL Injection TCC Wanderson

30

Figura 2.1 – Tela de Autenticação

Fonte: Próprio Autor

Por trás dessa tela, na programação, quando o usuário clicar no botão

Entrar será executada a ação interna que verificará a autenticidade do usuário.

Para isso, no PHP, é usado um script que monta uma consulta com os

parâmetros passados pelo usuário, como mostrado na Figura 2.2 a seguir.

Figura 2.2 – Script em PHP para verificação do usuá rio

Fonte: Próprio Autor

Esse script recebe os parâmetros usuário e senha que serão guardados

nas variáveis $usuario e $senha, respectivamente, é montado na variável

$query_string a consulta que verificará o usuário. Normalmente seriam

informados os dados de um usuário, mas foi passada parte de código SQL no

campo reservado para a senha, como mostrado na Figura 2.1, seguindo o

procedimento normal da aplicação a string ficará deste modo:

SELECT * FROM usuarios WHERE codigo = '123' AND sen ha = ' ' OR '1' = '1 '

Após essa linha de consulta ser processada pelo banco, o retorno será

verdadeiro, pois o comando passado no campo senha (‘ OR ‘1’ = ‘1) sempre

retornará algum registro.

Page 31: SQL Injection TCC Wanderson

31

Outra maneira de tentativa de invasão sem usar os formulários de

autenticação é usando os recursos da URL, por ser uma forma rápida e de fácil

utilização, pois as aplicações utilizam muito a estratégia de passar dados pela

URL para outras páginas como mostra a Figura 2.3 a seguir.

Figura 2.3 – Exemplo URL

Fonte: Próprio autor

Por essa URL o desenvolvedor está passando informações entre

páginas, onde a página remetente invoca a página destinatária, nesse caso

produtos.php, junto com essa informação também é passado o identificador

(ID) do item.

A Figura 2.4 a seguir mostra como a página destinatária receberá a

informação.

Figura 2.4 – Script em PHP para consulta de produto

Fonte: Próprio Autor

Nesse script o código do produto é recebido via GET e guardado na

variável $idProduto, logo em seguida é criada a variável $sql_query que

realizará a consulta no banco de dados.

Para colocar esse ataque em funcionamento o usuário mal intencionado

adiciona junto com a condição já existente na URL a condição que lhe permitirá

ter favorecimento no sistema. A Figura 2.5 a seguir mostra a tentativa de

ataque pela URL.

Page 32: SQL Injection TCC Wanderson

32

Figura 2.5 – Tentativa de ataque pela URL

Fonte: Próprio Autor

Nessa tentativa o atacante injeta junto com o parâmetro da página uma

parte de código SQL com a condição “OR 1 = 1”. Essa condição fará com que

a consulta sempre seja verdadeira retornando todos os registros cadastrados.

O usuário mal intencionado usando esse princípio de concatenar código

SQL na URL da página, usando a imaginação e o conhecimento em

programação, pode alterar o sentido da expressão para consultar outras

informações, como mostra a Figura 2.6 a seguir:

Figura 2.6 – Script em PHP concatenado com UNION

Fonte: Próprio Autor

Dessa forma foi incluído o operador UNION que tem por finalidade,

como o próprio nome diz, unir duas consultas. Como no exemplo serão

retornados os campos usuario e senha deste modo, com esses dados

apropriados pelo atacante, se torna muito mais fácil a realização do acesso.

A Figura 2.7 a seguir apresenta outro tipo de ataque usando o DROP:

Figura 2.7 – Script em PHP concatenado com DROP

Fonte: Próprio Autor

A Figura 2.7 mostra um ataque ainda pior para a aplicação, pois nesse

exemplo foi passado junto com o parâmetro da página o caractere ponto-e-

vírgula (;) que na sintaxe da linguagem SQL tem a função de finalizar uma

query para início de outra, o comando “DROP TABLE usuarios ” para executar

Page 33: SQL Injection TCC Wanderson

33

a deleção da tabela usuarios e os caracteres – informa ao banco que o que vier

na mesma linha após eles são comentários.

2.2.3 – ADVANCED SQL INJECTION

Essa variação da Injeção de SQL explora erros da aplicação,

especificamente, provocando o aplicativo a gerar erros para assim o invasor

levantar as informações necessárias que até o momento são desconhecidas.

Com essas informações é possível conhecer a estrutura da base de dados

para assim formatar uma melhor combinação de código SQL e receber os

resultados esperados.

2.2.4 – OBTENDO INFORMAÇÕES

O ataque avançado de injeção de código SQL procura sites vulneráveis

que permitam o acesso. Uma maneira muito simples de saber se o site é

vulnerável é acrescentando ao final da URL a aspas simples (‘), ao tentar

realizar a consulta ao banco de dados será retornada uma mensagem de erro,

pois a sintaxe da linguagem SQL está incorreta. A Figura 2.8 a seguir mostra o

uso da aspas.

Figura 2.8 – Script PHP concatenado com aspas simpl es

Fonte: Próprio Autor

Após ser processado esse trecho do script, internamente é montada

uma query em SQL executando uma consulta na base de dados, a Figura 2.9 a

seguir mostra como esse código ficará.

Page 34: SQL Injection TCC Wanderson

34

Figura 2.9 – Código SQL para consulta de produto

Fonte: Próprio Autor

O SGBD encontrará a aspas simples, ferindo a sintaxe do SQL,

retornando um erro para a aplicação que, por não haver nenhum tratamento

aos erros, será exibido na tela para o usuário como mostra a Figura 2.10 a

seguir.

Figura 2.10 – Erro causado com uso da aspas simples

Fonte: Próprio Autor

Com esse erro sendo mostrado na tela para o usuário demonstra que o

sistema possui alguma vulnerabilidade onde o atacante pode explorar e

conseguir as informações necessárias, além de também mostrar qual banco de

dados está sendo usado, nesse caso o MySQL. Usando mais um pouco da

técnica, o atacante também consegue descobrir qual a versão usada como

mostra a Figura 2.11.

Figura 2.11 – Versão do banco de dados

Fonte: Próprio Autor

Sabendo qual banco e versão está sendo usado é mais fácil de saber

aonde buscar as informações, pois há diferença entre as versões. Nessa

versão do MySql, a versão 5.0, existe a tabela information_schema que guarda

várias informações importantes como dados das tabelas e colunas. Usando a

criatividade, o atacante desenvolve uma linha lógica em cima do que foi criado

Page 35: SQL Injection TCC Wanderson

35

pelo desenvolvedor do sistema e com paciência pode conseguir a estrutura de

toda a base de dados.

Usar o operador union nesse momento é a melhor maneira para

encontrar as tabelas estratégicas, junto com o limit é possível descobrir, por

exemplo, a tabela de cadastro dos usuários como mostra a Figura 2.12.

Figura 2.12 – Union com a tabela information_schema

Fonte: Próprio Autor

Alterando o parâmetro da condição LIMIT, o banco vai alterando a

resposta, assim é só substituir por outros valores e ir receber todas as

informações. Sabendo qual o campo e tabela quer consultar o atacante altera a

sequência do operador union colocando a tabela e campo descobertos, como

os campos login e senha da tabela usuário, desse modo o banco retornará os

dados cadastrados.

2.2.5 – ESTATÍSTICA

O site National Vulnerability Database (NVD) é um repositório de dados

sobre vulnerabilidades do governo norte americano, contém informações de

várias ameaças que colocam em risco a integridade de sistemas. A Figura 2.13

a seguir, extraída do NVD, mostra um gráfico de ataque da técnica de Injeção

de SQL nos últimos anos.

Page 36: SQL Injection TCC Wanderson

36

Figura 2.13 – Gráfico de exploração da vulnerabilid ade de Injeção de SQL

Fonte: http://nvd.nist.gov (acesso em 10/10/2009)

A Figura 2.13 representa a porcentagem da exploração da técnica

ocorrido nos últimos anos, pode-se perceber que em 2008 teve um alto

crescimento comparado com os outros anos e em 2009, até o momento da

geração desse gráfico, a exploração está pouco abaixo do ano anterior com

possibilidade de ultrapassar até o término do ano. O gráfico comprova que a

técnica está em constante utilização onde muitos sistemas estão

desprotegidos.

Em síntese, os sistemas ainda permanecem muito vulneráveis. Os da

plataforma web podem ser acessados de qualquer lugar do mundo, sendo

alvos propícios para o ataque. Estes ataques demonstrados nesse capítulo são

apenas exemplos de como a injeção SQL funciona, existe ainda uma lista de

comandos que possibilitam explorar as deficiências existentes nas aplicações.

Muitas vezes o potencial desse ataque é possível pelo desconhecimento da

programação segura que os programadores possuem.

Page 37: SQL Injection TCC Wanderson

37

3 UM ESTUDO DE CASO DE SEGURANÇA DA INFORMAÇÃO

Nos capítulos anteriores foram apresentados os aspectos teóricos que

fundamentam a Linguagem de Consulta SQL, Bancos de Dados e, em

especial, o ataque por Injeção de SQL, mostrando alguns exemplos de seu

funcionamento. Neste capítulo, pretende-se aplicar as técnicas de Injeção de

SQL apresentadas em um sistema existente, explorando as vulnerabilidades

deste sistema bem como meios de evitá-las.

Para que permaneça anônima a identidade do site objeto de estudo

deste trabalho, optou-se por deixar em branco seu endereço, por razões óbvias

do ponto de vista ético e de segurança da informação.

3.1 – ATAQUE PELA URL

Para atingir o objetivo de entrar no sistema sem ter um cadastro válido,

será necessário descobrir um registro válido – isso é possível através de

técnicas de Injeção de SQL. Primeiramente, será utilizada a técnica de

visualização da URL com a linguagem PHP (como exemplo), mas essa técnica

pode ser utilizada em qualquer linguagem de programação.

Para encontrar uma aplicação vulnerável é simples, basta procurar

alguma página de um site que tenha na URL o símbolo de interrogação (?), no

caso do PHP, seguido de alguma palavra recebendo algum valor, como mostra

em destaque na Figura 3.1 a seguir:

Figura 3.1 – Utilizando parâmetro pela URL em PHP

Fonte: Próprio Autor

A Figura 3.1 anterior demonstra que a página atual está enviando uma

requisição para a página detalhes.php, ou seja, existe um valor sendo enviado

como parâmetro de uma página para outra. Após encontrar a página, para

descobrir se é vulnerável, utiliza-se uma aspas simples (‘) no final da URL.

Page 38: SQL Injection TCC Wanderson

38

Com essa prática, um sistema mal protegido retornará uma mensagem de erro

como mostra a Figura 3.2 a seguir:

Figura 3.2 – Erro mostrando que há vulnerabilidade

Fonte: Próprio Autor

O erro apresentado na Figura 3.2 anterior mostra que a sintaxe de

consulta SQL está incorreta e pede para verificar o manual correspondente da

versão do MySQL. Isso confirma que o sistema é vulnerável, pois não fez

nenhum tratamento antes de executar a consulta no banco de dados.

Além de ter descoberto um sistema propício para invasão, também foi

possível descobrir qual SGBD está sendo usado. Desta maneira, um passo

seguinte interessante na técnica é descobrir qual a versão do SGBD para

assim saber quais suas particularidades e a melhor forma de construir as

consultas. Para isso é preciso utilizar o comando UNION para concatenar uma

nova consulta na consulta existente, no entanto, primeiro é preciso saber

quantas colunas a consulta original está retornando. A Figura 3.3 a seguir

mostra como fazer isso.

Figura 3.3 – Erro mostrando que não existe coluna 2 5

Fonte: Próprio Autor

Neste momento começa a fase de tentativa e erro, pois não é conhecida

a estrutura do banco de dados, então, a única opção, é tentar e verificar os

erros, como mostra na Figura 3.3. Foi utilizado o ORDER BY para ordenar

primeiramente o resultado da coluna 21, depois pela coluna 22, 23, 24 e por fim

a coluna 25, mas como a tabela possui menos de 25 colunas o banco retorna a

Page 39: SQL Injection TCC Wanderson

39

mensagem de erro dizendo que o argumento não é um resultado válido do

MySQL. Dependendo da versão do SGBD, pode ocorrer outras mensagens

como a coluna 25 é inválida. Então é alterado no final da URL ficando dessa

maneira:

http://www.exemplo.com.br/detalhes.php?id=3 ORDER B Y 21,22,23,24

Após a alteração na URL o sistema não retorna mais o erro, significando

que existem vinte e quatro colunas na tabela da consulta principal; agora é

possível descobrir a versão usando a variável global @@version como

mostrado na Figura 3.4 a seguir:

Figura 3.4 – Versão do banco de dados

Fonte: Próprio Autor

A versão do banco de dados MySQL é 5.0.81. Facilitando o ataque, a

partir da versão 5 do MySQL existe a tabela information_schema que guarda

informações de todas as tabelas e colunas do banco, assim através da tabela

tables é possível saber as tabelas e através da tabela columns saber as

colunas.

A próxima etapa do ataque é descobrir qual tabela atacar, portanto

continuando na tática de tentativa e erro trocando a variável global @@version

por concat(table_name, char(58), column_name), a função concat concatena

dois ou mais dados, como nesse caso a coluna table_name, o char(58) na

tabela ASCII representa o caractere dois pontos (:) e a coluna column_name.

No final da URL, continua com “FROM INFORMATION_SCHEMA.COLUMNS

LIMIT 1,1”.

A Figura 3.5 a seguir mostra a aplicação da técnica e o seu resultado:

Page 40: SQL Injection TCC Wanderson

40

Figura 3.5 – Descobrindo as tabelas e colunas

Fonte: Próprio Autor

O comando LIMIT é o responsável por conseguir navegar entre os

registros e recebe dois parâmetros: um número inicial e um final, onde o

primeiro é o registro que se deseja e o segundo é quantos serão exibidos. Os

registros referentes a esse intervalo, dentre os registros resultantes do

SELECT executado, tem sua primeira posição numerada como 0, a segunda

como 1 e assim por diante. Conforme for desejado, basta indicar qual a posição

inicial e quantos registros a partir dela. Por exemplo, se usar LIMIT 3,7 retorna

do 4º registro mais 7 posições, ou seja, do 4º registro ao 10º registro.

Na Figura 3.5 foi retornada a tabela CHARACTER_SETS e a coluna

DEFAULT_COLLATE_NAME que, para o objetivo do trabalho, não tem

utilidade. Portanto, será alterado o primeiro parâmetro do comando LIMIT até

ser encontrada a tabela que guarde informações dos usuários. A Figura 3.6 a

seguir mostra a expressão com um parâmetro importante:

Figura 3.6 – Campo Id da tabela de Usuários

Fonte: Próprio Autor

A Figura 3.6 mostra que existe a tabela que guarda informações dos

usuários como o campo ID. É nesta tabela que estão armazenados os registros

dos usuários cadastrados, portanto a exploração dessa tabela é fundamental

para descobrir algum nome de usuário e senha válidos. Continuando com o

processo, alterando o primeiro parâmetro do LIMIT com números sequenciais

serão descobertos os outros campos da tabela usuários.

As Figuras 3.7 e 3.8 mostram os campos necessários para continuação

do objetivo.

Page 41: SQL Injection TCC Wanderson

41

Figura 3.7 – Campo Nome da tabela de Usuários

Fonte: Próprio Autor

Figura 3.8 – Campo Senha da tabela de Usuários

Fonte: Próprio Autor

Com o LIMIT na posição 407,1 foi retornado o campo nome e na posição

408,1 foi retornado o campo senha, portanto foi atingida a primeira parte do

objetivo: o nome da tabela e os nomes dos dois campos mais importantes!

Agora será descoberta a segunda parte que é algum registro válido e,

para isso, será alterada a URL da consulta, direcionando para a tabela e os

nomes dos campos descobertos. A Figura 3.9 a seguir mostra a aplicação da

técnica e o seu resultado:

Figura 3.9 – Usuário e senha válida

Fonte: Próprio Autor

Após ter conseguido descobrir um usuário e senha válidos, resta usá-los

para acessar ao site e assim ter acesso liberado, como é mostrado nas Figuras

3.10 e 3.11 a seguir:

Page 42: SQL Injection TCC Wanderson

42

Figura 3.10 – Tela de Login do sistema

Fonte: Próprio Autor

Informando nos campos Usuário e Senha os dados descobertos, o

sistema verifica a existência e comprova que são verdadeiros, aprovando desta

maneira o acesso ao painel de controle.

Page 43: SQL Injection TCC Wanderson

43

Figura 3.11 – Tela principal com usuário Identifica do

Fonte: Próprio Autor

O sistema aceitou a entrada e o usuário mal intencionado obteve com

sucesso total acesso ao sistema, podendo executar qualquer ação como

administrador.

3.2 – ATAQUE PELO FORMULÁRIO DE LOGIN

Outra forma utilizada para a Injeção de SQL é pelos campos dos

formulários que existem nos sistemas web. Esses formulários representam

uma porta de entrada do sistema, pois a função deles é capturar as

informações digitadas pelo usuário e levá-las para o banco, dessa forma, o

código malicioso entrará por esses campos. A Figura 3.12 mostra como ficará

um simples formulário de login com um trecho código SQL.

Page 44: SQL Injection TCC Wanderson

44

Figura 3.12 – Tela de Login com Código SQL

Fonte: Próprio Autor

Após informar ‘ or ‘1’ = ‘1 no campo Usuário e Senha o sistema envia

esses dados para a verificação do usuário, a consulta em SQL, concatenada

com o texto entrado nos campos, ficará dessa maneira:

SELECT id FROM usuarios

WHERE usuario = ‘ ’ or ‘1’ = ‘1 ’

AND senha = ‘ ’ or ‘1’ = ‘1 ’

Na sintaxe do SQL, essa consulta retornará algum valor se for

verdadeiro ou nulo se for falsa, ou seja, se existir algum registro com as

condições usadas será retornado o seu ID e se não existir será retornado o

valor nulo. Mas como o parâmetro usado ‘1’ = ‘1 utiliza a condição OR (OU)

sempre será retornado verdadeiro. Portanto, o sistema aceita o usuário e

permite o acesso à página restrita.

3.3 – DEFESA DO SISTEMA

Nas seções 3.1 e 3.2 anteriores foram apresentadas uma visão do

atacante de como encontrar um sistema vulnerável, descobrir qual banco de

dados utilizado e sua versão, a estrutura da base de dados e os dados

armazenados. Mas ao invés de realizar apenas consultas, poderiam ter sido

executadas modificações no banco de dados, ou até mesmo exclusões. Nessa

seção serão mostradas algumas técnicas para anular os ataques mencionados

anteriormente.

Page 45: SQL Injection TCC Wanderson

45

3.3.1 – ENTENDENDO O ATAQUE

Tanto no caso do ataque ser realizado pela URL e por um formulário, ou

seja, independente da forma de entrada do código SQL, o potencial do ataque

é o mesmo. Para explorar a injeção de código SQL é necessário que o

atacante execute inúmeras tentativas de acesso, para que, através de tentativa

e erro o sistema possibilite conhecer toda a estrutura do banco de dados.

Portanto, o sucesso do ataque somente foi possível por duas falhas básicas na

aplicação:

� Não ter sido feito o devido tratamento da entrada da informação, pois

chegou ao banco de dados sem nenhuma barreira.

� Não terem sido filtradas corretamente as informações vindas do banco

de dados para o cliente.

Dois motivos simples que geralmente passam despercebidos por muitos

desenvolvedores e acabam possibilitando a aplicação das referidas técnicas de

ataque.

3.3.2 – TÉCNICAS DE DEFESA NA APLICAÇÃO

Para realizar a defesa na aplicação, é necessário verificar toda

informação inserida no sistema através do usuário e toda informação retornada

ao usuário pelo sistema. Isso causa a criação de várias validações de

segurança que consequentemente deixará o código maior e fará com que ele

precise de mais tempo de processamento.

3.3.2.1 – TRATANDO OS DADOS DE ENTRADA

Cada linguagem de programação possui suas características e suas

técnicas de defesa, nesse trabalho foi definida a linguagem PHP para a

demonstração dos códigos por ser uma linguagem muito utilizada entre os

desenvolvedores web.

Page 46: SQL Injection TCC Wanderson

46

No início deste capítulo foi mostrado que o primeiro passo do usuário

mal intencionado foi encontrar uma vulnerabilidade no sistema e para isso

utilizou a aspas simples (‘), mostrado na Figura 3.2, no qual o sistema retornou

uma mensagem de erro. O erro foi originado por causa das aspas simples

interferirem na sintaxe do comando SQL, portanto, uma prática de

programação segura deve antes de executar a ação com o banco de dados

verificar o que está sendo executado.

A linguagem PHP possui várias funções que verificam a entrada de

informações e dentre elas destacam-se:

• addslashes

Sintaxe: string addslashes (string $str)

Descrição: Recebe uma string e a retorna com barras invertidas (\) antes

dos caracteres que precisam ser escapados¹ para serem enviados em query

em banco de dados. Alguns dos caracteres que devem ser “escapados” são

aspas simples (‘), aspas duplas (“) e barra invertida (\). A Figura 3.13 a

seguir apresenta como é o uso dessa função:

Figura 3.13 – Código PHP com a função addslashes

Fonte: Próprio Autor

A Figura 3.13 mostra um trecho de código PHP utilizando a função

addslashes que recebe as variáveis “usuario” e “senha” e as retorna

“escapadas” para em seguida montar a query de consulta.

Ex: Utilizando a variável “’ or ‘1’ = ‘1” com a função addslashes será

retornado: “\’ or \‘1\’ = \‘1”, mas para o banco de dados será como “’ or ‘1’ = ‘1”.

¹ Caractere Escapado é um caractere precedido de uma barra invertida (\), anulando algum significado ou efeito especial.

Page 47: SQL Injection TCC Wanderson

47

• strtr

Sintaxe: string strtr (string $str, string $de, string $para)

Descrição: Recebe uma variável string, um parâmetro de entrada e um

parâmetro de saída. Se houver na variável string o parâmetro de entrada,

esse será substituído pelo parâmetro de saída e retorna a nova string. A

Figura 3.14 a seguir apresenta como é o uso dessa função:

Figura 3.14 – Código PHP com a função strtr

Fonte: Próprio Autor

A Figura 3.14 mostra um trecho de código PHP utilizando a função strtr

que recebe as variáveis “usuario” e “senha” e as retorna após trocar a aspas

simples pela letra A para em seguida montar a query de consulta.

Ex: Se for utilizado a string “’ or ‘1’ = ‘1” a função ficará da seguinte

maneira: strtr(“’ or ‘1’ = ‘1”, “’”, “A”) será substituído a aspas simples pela letra A

retornado a nova string: A or A1A = A1 que para o banco é um texto simples.

• mysql_real_escape_string

Sintaxe: string mysql_real_escape_string (string $str)

Descrição: Recebe uma string e escapa os caracteres especiais para serem

usados em um comando SQL, sendo igual à função addslashes. Essa é

uma função para o banco de dados MySQL, mas existe a mesma função

para outros bancos. A Figura 3.15 a seguir apresenta como é o uso dessa

função:

Page 48: SQL Injection TCC Wanderson

48

Figura 3.15 – Código PHP com a função mysql_real_es cape_string

Fonte: Próprio Autor

A Figura 3.15 mostra um trecho de código PHP utilizando a função

mysql_real_escape_string que recebe as variáveis “usuario” e “senha” e em

seguida monta a query de consulta.

Ex: Se for utilizado a string “’ or ‘1’ = ‘1” como parâmetros a função ficará

da seguinte maneira: mysql_real_escape_string(“’ or ‘1’ = ‘1”); percebe-se que

será adicionada a barra invertida antes dos caracteres especiais para, com

isso, ser retornada a nova string \’ or \‘1\’ = \‘1 que, para o banco de dados, é

um texto simples que não irá interferir na sintaxe da SQL.

Usando alguma dessas funções, ou outras semelhantes, poderão ser

evitadas as aspas simples que fazem parte da sintaxe de comandos da SQL.

Ao evitar aspas simples dos textos de entrada, as tentativas de provocar erro

pela URL ou por algum formulário de login com o texto ‘ or ‘1’ = ‘1 estarão

anuladas.

Outra maneira de restringir os dados inseridos pelo usuário, além das

funções de cada linguagem, é verificar se o dado recebido é do tipo esperado.

Como visto nas técnicas de ataque apresentadas, o sistema passa um ID para

outra página e essa página deve primeiro verificar se o parâmetro recebido é

um número. A Figura 3.16 a seguir verifica se o valor da variável é um int:

Figura 3.16 – Verificação do tipo da variável em PH P

Fonte: Próprio Autor

Page 49: SQL Injection TCC Wanderson

49

A Figura 3.16 mostra como ficará um trecho de código após receber a

variável via método GET, responsável por receber parâmetros pela URL. É

usada a função is_int do PHP dentro do laço IF que verifica se o tipo da

variável é um inteiro, caso sim, monta a sentença SQL.

Esse caso permite interferir na tentativa de alguma injeção realizada

pelo usuário não permitindo que chegue à base de dados, pois, qualquer

entrada diferente de um número será barrada no IF e, no caso de ser uma

string, terá mais verificações como mostra a Figura 3.17 a seguir:

Figura 3.17 – Função em PHP para validar String

Fonte: Próprio Autor

A Figura 3.17 mostra a função validar($string) que verifica se o

parâmetro possui alguma tentativa de injeção de código comparando tudo que

foi recebido pela URL com várias palavras reservadas da linguagem SQL. Para

iniciar a verificação, primeiro a variável é passada pela função do PHP

mysql_real_escape_string, mostrada na Figura 3.15 anterior e, após a primeira

verificação, é chamada a função validar($string) que executa os seguintes

procedimentos:

Page 50: SQL Injection TCC Wanderson

50

� Aplica-se strtoupper, que retorna uma string ($valor) com todos os

caracteres de uma variável convertidos em maiúscula;

� Aplica-se explode, que recebe uma variável e um delimitador, divide a

variável em várias strings sendo separada pelo delimitador e retorna um

array ($detalhe) com todas as substrings;

� É criado o array $reservadas com várias palavras reservadas da SQL;

� É criada a variável $invalido com valor 0 para ser o contador de quantas

palavras reservadas foi encontrada no array $detalhe;

� A função foreach percorre todos os itens do array $detalhe, retornando

um elemento por vez por meio da variável $det;

� Aplica-se a função in_array, que verifica se um valor está no array,

procurando no array $reservadas o valor de $det. Se encontrar o valor, é

incrementado o contador $invalido, caso contrário o valor de $det é

substituído e inicia uma nova procura. Com esse processo, todos os

valores da variável inicial $detalhe são comparados com os valores de

$reservadas;

� Para finalizar a função validar, é retornado o contador $invalido.

Tendo o valor do contador, foi realizado um novo laço IF para verificar se é

maior que zero; se sim, é porque o valor recebido possui alguma palavra que

possa tentar executar o ataque; se não, quer dizer que a variável recebida pela

página provavelmente possui apenas o valor esperado e a sentença SQL é

criada.

3.3.2.2 – TRATANDO OS DADOS DE SAÍDA

Como dito anteriormente, todo ataque por injeção de código SQL bem

sucedido é iniciado pelo processo de tentativa e erro. Isso é possível porque o

sistema retorna para o usuário o erro ocorrido e assim, por meio destas

mensagens informativas, podem ser obtidas informações valiosas como nomes

de tabelas e os tipos das colunas.

As mensagens de erros são importantes no ambiente de criação por

indicar aos desenvolvedores as informações do erro e assim poder efetuar as

Page 51: SQL Injection TCC Wanderson

51

correções, o que para o ambiente de produção não é interessante por motivo

de segurança e por também deixar a impressão de um sistema amador.

Uma maneira de evitar que apareçam as mensagens de erro seria

desabilitar a exibição ou direcionar para uma página personalizada. A

linguagem PHP possui o arquivo php.ini que possui diversas diretivas de

configuração, dentre as quais existe a display_errors que por padrão é

marcada como ON, para exibir as mensagens de erro na tela. Alterando essa

diretiva para OFF não mais se exibe mensagens de erro quando algo incorreto

acontecer, portanto, mesmo que o usuário insista em provocar algum erro a

mensagem não será exibida.

3.3.3 – TÉCNICA DE DEFESA NO BANCO DE DADOS

Para que o código injetado pelo usuário não tenha sucesso é

necessário, além de criar barreiras na aplicação, criar barreiras no banco de

dados. Fazer isso garante uma proteção maior, pois se o ataque conseguir

passar os bloqueios da aplicação irá se deparar com mais bloqueios na base

de dados.

Muitos desenvolvedores utilizam o banco de dados apenas para guardar

os dados, não aproveitando todos os recursos que essa incrível ferramenta

disponibiliza. Agora serão apresentadas algumas técnicas de defesa possíveis,

em termos de Sistemas Gerenciadores de Banco de Dados (SGBDs), embora

pouco adotadas como práticas de projeto:

• Permissões dos usuários do Banco de Dados

Existem vários problemas circulando em volta das permissões que possuem

os usuários do banco de dados. Se o usuário que a aplicação utiliza para

conectar no banco tem direitos de administrador, ele vai poder realizar

todas as operações como DROP, ALTER, SELECT, UPDATE, INSERT e

DELETE.

O único responsável que deve ter direito total na base de dados é a pessoa

que exerce a função de DBA (Database Administrator ou Administrador de

Banco de Dados), os demais deverão ter somente a permissão que

Page 52: SQL Injection TCC Wanderson

52

necessitem. Portando, quando se cria um novo usuário deve-se analisar o

que ele vai poder fazer para ser melhor configurada sua permissão e se

tratando do usuário usado pela aplicação para conectar no banco deve ter a

mínima permissão, ou seja, o suficiente para o funcionamento do sistema.

• Criptografia

Na técnica de ataque considerada nesse trabalho, foram descobertas as

senhas de usuários cadastrados no sistema. Isso só foi possível porque não

foi utilizada nenhuma criptografia para “camuflar” tais senhas. As próprias

linguagens de programação disponibilizam meios de criptografia, mas, se

caso a criptografia utilizada for fácil de ser descoberta, o desenvolvedor

pode criar uma função que criptografe. Portanto, o objetivo de utilizar a

criptografia é de esconder os dados para que não possam ser lidos nem

mesmo pelos desenvolvedores.

• Função

Um bom motivo de utilizar funções, além de ajudar no desenvolvimento do

sistema, é na consistência dos dados que é possível fazer antes de

executar alguma ação. Como a função pertence ao banco de dados, a

aplicação à chama passando os parâmetros necessários e a função se

encarrega da validação, faz todas as alterações necessárias e retorna se

realizou a operação com sucesso ou não.

• Visões

Quando não há a necessidade de disponibilizar todas as colunas para os

usuários podem-se criar visões das colunas selecionadas. Visão é uma

relação que não contem dados, ou seja, é uma tabela dinâmica resultante

de uma consulta. Com a utilização de visões permite-se que o usuário tenha

o acesso aos dados de uma maneira indireta.

Em síntese, as técnicas de ataque consideradas mostraram a facilidade

da utilização da técnica de injeção de SQL. Usando alguns comandos da

linguagem SQL, foi possível descobrir todas as informações existentes na base

de dados e entrar no sistema sem ter permissão, mas, em contra partida,

Page 53: SQL Injection TCC Wanderson

53

também foram mostradas algumas técnicas para prevenir o ataque com

medidas tomadas no desenvolvimento da aplicação e na própria administração

do Sistema Gerenciador de Banco de Dados.

Page 54: SQL Injection TCC Wanderson

54

4 CONSIDERAÇÕES FINAIS

O objetivo deste trabalho foi realizar um estudo sobre uma das ameaças

que mais coloca em risco os sistemas, principalmente os desenvolvidos para a

plataforma web, a Injeção de SQL.

O primeiro passo do trabalho foi mostrar como a técnica funciona.

Através de um sistema comercial, foram utilizadas duas maneiras para

conseguir o acesso com direitos administrativos. De uma forma mais complexa,

a primeira tentativa ocorreu através da URL que por diferentes maneiras, junto

com os parâmetros da página, foram inseridos trechos de código SQL com a

função de forçar o sistema a passar informações importantes que ajudasse a

compor novas consultas até que foram obtidos os dados de um usuário

devidamente cadastrado no sistema. A outra forma, de uma maneira mais

simples, foi utilizando o formulário de login para inserir o código SQL na

aplicação. Com a inserção foi possível fazer o sistema entender o ataque como

se fosse um usuário cadastrado, obtendo assim o acesso privilegiado podendo

realizar qualquer operação sem restrição.

Após os ataques, foi possível entender melhor o funcionamento da

técnica, e em defesa do sistema foram estudadas boas práticas para

impossibilitar a sua funcionalidade. No trabalho foi utilizada a linguagem PHP

para demonstração, e explorando as suas funções foram criadas algumas

rotinas que verificam os dados antes de serem enviados ao banco de dados.

Dessa forma o sistema é preparado para tratar a informação recebida e

somente será processada se for a esperada, caso contrário o sistema segue

outro caminho, não levando o código malicioso ao banco de dados. Outra

maneira demonstrada de impor barreiras para o ataque foi no banco de dados,

com a criação de visões, funções e a prática de armazenamento criptografado

de dados, aumenta o grau de dificuldade na tentativa de invasão, pois mesmo

que consiga passar pela aplicação, terá mais uma barreira no próprio banco de

dados.

Com a realização desse estudo e, principalmente, conseguindo alcançar

os dois objetivos que eram explorar as vulnerabilidades de um sistema para

conseguir o acesso privilegiado e criar barreiras para impedir que o ataque

Page 55: SQL Injection TCC Wanderson

55

tenha sucesso, a compreensão da necessidade de dar uma maior importância

na implementação de técnicas para fortalecer a segurança da aplicação, teve

um aumento significativo possibilitando enxergar com mais clareza as possíveis

brechas.

Portanto, esse trabalho mostrou que mesmo com o grande crescimento

na utilização de sistemas web, muitos ainda estão vulneráveis ao ataque,

colocando em risco a segurança e integridade dos dados. Isso prova que

muitos desenvolvedores ainda estão despreparados, não possuindo

características como a visão global do projeto para prever possíveis falhas, não

utilização de uma metodologia de desenvolvimento que abranja a segurança do

sistema ou mesmo a falta de conhecimento na área. Este estudo, também,

abre oportunidades de futuros trabalhos, tais como:

• Estudo de outras formas de ataques mais avançados como em nível de

sistema ou via cookie;

• Elaboração de conteúdo para capacitação de profissionais

(desenvolvedores, arquitetos e engenheiros de software) em segurança

da informação;

• O desenvolvimento de uma ferramenta de software que permita a

análise das possíveis falhas na aplicação ou o estudo de ferramentas

existentes para testes de segurança contra SQL Injection;

• Estudar o grau de vulnerabilidade em relação às linguagens de

programação: ASP, PHP, Java e outros.

Ao longo dos estudos, percebeu-se que é possível criar aplicações mais

seguras, uma vez que essa falha de segurança ocorre muitas vezes por

desatenção ou por falta da utilização de uma metodologia de desenvolvimento

alicerçada em conceitos de segurança da informação. Constatou-se então,

neste trabalho, que para conseguir um sistema seguro da injeção de SQL não

basta se apoiar somente em técnicas de programação, mas também em

administração de banco de dados bem como uma política de segurança mais

ampla.

Page 56: SQL Injection TCC Wanderson

56

GLOSSÁRIO

ANSI – American National Standards Instiute. Instituto norte-americano sem

fins lucrativos, formada por grupos de comunidade comercial e industrial

responsável pelo desenvolvimento de normas técnicas.

ASP – Active Server Pages.

CRACKER – Conhecedor de linguagens de programação e sistemas

operacionais, com fins criminosos modifica o comportamento de programas,

invade sistemas ou computadores sem autorização.

COOKIE – Pequeno arquivo de texto criado por sites no micro do usuário para

guardar informações do mesmo como login e páginas visitadas, para

posteriormente ser utilizado pelos sites.

DBA – Database Administrator (Administrador de banco de dados). Pessoa

responsável pela criação, manutenção, segurança e performance do banco de

dados.

GET – Esse método utiliza a URL para enviar informações para outra página

concatenando com o endereço do servidor os dados necessários.

HACKER – Conhecedor de linguagens de programação e sistemas

operacionais, sem fins criminosos invade sistemas para ampliar seus

conhecimentos ou pela satisfação de detectar suas possíveis falhas de

segurança.

ISO – International Standards Organization. Organização que cria padrões

industriais de aceitação mundial, composta por entidades como ANSI (norte-

americana) e ABNT (brasileira).

JSP – Java Server Pages.

PHP – Personal Home Page.

URL – Uniform Resource Locator (Localizador de Recurso Uniforme). Padrão

de endereçamento na internet formado por duas partes, a primeira antes da

barra dupla especifica o protocolo a ser utilizado (http, ftp, etc) e a direita o

endereço do servidor.

XML – Extensible Markup Language (Linguagem de marcação extensível).

Linguagem que permite a troca das informações contidas numa página,

possibilitando que os dados sejam transportados entre sistemas.

Page 57: SQL Injection TCC Wanderson

57

REFERÊNCIAS

Albuquerque, Ricardo; Ribeiro, Bruno. Segurança no Desenvolvimento de Software; Rio de Janeiro: Editora Campus, 2002, 320p. Aquino, Rodrigo S. Prudente de. Wpage: Padronizando o desenvolvimento de Web Sites; São Paulo: Editora Viena, 2006, 189p. Bernstein, Terry et al. Segurança na Internet; Rio de Janeiro: 1997, Editora Campus Ltda, 461p. Conallen, Jim. Desenvolvendo Aplicações Web com UML, São Paulo: Editora Campus, 2003, 504p. Costa, Rogério Luís de C. SQL – Guia Prático, 2 ed. Rio de Janeiro: Editora Brasport, 2006, 248p. Date, C. J. Introdução a Sistemas de Banco de Dados. 8 ed. Rio de Janeiro: Editora Elsevier, 2004. 865p. Heuser, Carlos Alberto. Projeto de Banco de Dados. 4 ed. Porto Alegre: Editora Sagra Luzzatto. 2001, 194p. Milani, André. PostgreSQL – Guia do Programador. São Paulo: Editora Novatec, 2008. 392p. National Vulnerability Database. Disponível em <http://nvd.nist.gov>. Acesso em 10/10/2009. Oliveira, Wilson José; Segurança da Informação, técnicas e soluções; Florianópolis: Visual Books, 2001. 182p. PHP Net. Disponível em <br.php.net>. Acesso em 10/2009 Riccio, Edson Luiz. Segurança em processamento de dados. 1981. 105f. Dissertação (Mestrado em Administração) – Faculdade de Economia, Administração e Contabilidade, Universidade de São Paulo, São Paulo, 1981. Scambray Joel; Shema Mike. Segurança Contra Hackers – Aplicações Web, Minas Gerais: Editora Futura, 2003. 394p. Silberschatz, Abraham; Korth, Henry F.; Sudarsha, S. Sistema de Banco de Dados, São Paulo, 1999, Makron Books, 806p. 3ºEd. Torres, Dennes. Segurança Máxima de Software, Rio de Janeiro, Editora Brasport, 2003, 204p.