SQL Injection Seg Info

Embed Size (px)

Citation preview

FACULDADE DE TECNOLOGIA DE MOGI DAS CRUZES

SEGURANA DA INFORMAO SQL INJECTION

MARCIO AUGUSTO DE ANDRADE RA 092211-0

FATEC MC 2011

RESUMOO presente artigo trata de um importante tipo de ataque em aplicaes WEB, o SQL Injection que vem se tornando um dos mais realizados em se tratando de base de dados e tambm mostra como saber se a aplicao est vulnervel, como se explora estas falhas e o que se pode fazer para impedir que a aplicao seja alvo desses tipos de ataques. PALAVRAS-CHAVE: Segurana da Informao, SQL Injection, Ataques.

ABSTRACTThis article deals with an important type of attack on web applications, SQL Injection that is becoming one of the most accomplished in the case of the database and also shows how to tell if the application is vulnerable, as it explores these gaps and what can be done toprevent the application to target these types of attacks. KEYWORDS: Information Security, SQL Injection Attacks

INTRODUO

Os ataques a base de dados atravs da tcnica SQL Injection vem crescendo muito com a grande acessibilidade das aplicaes WEB e a pouca ateno dos desenvolvedores para a segurana da informao deixando falhas nas aplicaes que acabam sendo um prato cheio para os atacantes de planto e aqueles querem ganhar fama com invases de sites e roubar informaes das bases de dados. A injeo de SQL na o o nico tipo de ataque para conseguir roubar informaes, mas com certeza um dos mais fceis de realizar desde que se tenha uma base de SQL, porque no necessita de ter nenhum tipo de programa especial para comear a atacar basta ter uma aplicao que aceite este tipo de ataque para comear. De certo para se conseguir um bom resultado no ataque preciso o uso de outras ferramentas e alguns conhecimentos avanados para manipular estas ferramentas, mas no o foco deste trabalho aprofundar nestes tipos de ferramentas.

SQL INJECTIONAs falhas de Injeo, particularmente injeo SQL, so comuns em aplicaes web. Existem muitos tipos de injeo: SQL, LDAP, XPath, XSLT, HTML, XML, comando de sistema operacional e muitas outras. Falhas de Injeo acontecem quando os dados que o usurio d de entrada so enviados como parte de um comando ou consulta. (OWASP, 2007) As injees de SQL so possveis em aplicaes que utilizam de bases de dados e formulaes de string de instrues SQL que no so devidamente tratadas pelos desenvolvedores ou por administradores de aplicaes. SQL Structured Query Language (Linguagem de Consulta Estruturada) a linguagem padro para manipulao de bases de dados como Oracle, MSSQL Server, MySql, PostgreSQL entre outros. Normalmente as principais categorias de ataques de injeo de SQL so:

Manipulao SQL este processo consiste em usar diferentes comandos da linguagem SQL para realizar o ataque como UNION e modificar a clusula WHERE para se obter resultados diferentes. Injeo de cdigo neste mtodo usa-se novas instrues SQL ou comandos de manipulao de base de dados como EXECUTE, mas este mtodo s ser possvel se a base de dados suportar vrias solicitaes. Injeo em chamada de funo este mtodo faz uso de chamada de funo para executar no sistema operacional ou na base de dados. Estouros de buffer (Buffer Overflow) este mtodo pouco explorado por causa que os bancos de dados j possuem as correes mas pode ser aplicado se o servidor estiver vulnervel.

Deteco de vulnerabilidade por injeo de SQLNo sempre, mas na maioria das vezes pode-se detectar se a aplicao est vulnervel ou no ao ataque usando caracteres especiais como: Aspas simples ou apstrofe ( ) : usado em ASP (Active Server Pages) para se fazer um comentrio no cdigo fonte para que o que estiver aps ele no ser interpretado pelo navegador. Dois sinais de menos ( -- ) : usado para introduzir comentrio na linguagem SQL baseada em Transact-SQL para que tudo que vier aps tambm no seja interpretado pela linguagem. Ponto e vrgula ( ; ) Delimita o final de uma consulta e inicia outra em linguagem SQL;. Sinal de maior ( > ) usado tanto em Windows como em Linux para redirecionar a sada de um comando para um arquivo e quando usado em duplicidade ( >> ) acrescenta o contedo no final do arquivo preservando o que j existia e se o arquivo no existir, o mesmo ser criado e depois receber o contedo do comando.

Realizando um ataque de SQL InjectionPara ilustrar um exemplo de ataque ser usada uma pequena aplicao WEB que simula a entrada de usurio e senha para acesso a rea administrativa da aplicao.

O arquivo de login ser simples com uma caixa de texto para usurio outra para senha e um boto que envia os dados para o arquivo process_login.asp.

Figura 1 Tela de Login

O banco de dados ter uma tabela de nome usurios que ter trs campos, registroUsuario, nomeUsuario e senhaUsuario que por enquanto somente os desenvolvedores sabem sua estrutura, mas logo isso ser mudado. No process_login.asp teremos o cdigo SQL que vai buscar no banco o usurio e a senha para realizar a validao.

Figura 2 Parte do cdigo do process_login.asp com a instruo SQL

Agora vamos verificar se a aplicao est vulnervel adicionando algumas instrues clssicas da injeo de SQL.

Figura 3 Usando uma instruo clssica de SQL Injection

Esta pgina esta vulnervel, pois no retornou nenhum erro de login e acabamos obtendo acesso a aplicao com primeiro usurio cadastrado. Mas um invasor no se contentar em ter somente um acesso fcil da primeira conta ele vai tentar conseguir os dados da tabela, mas ele no sabe o nome da tabela nem quais so os campos. Para conseguir estas informaes basta criar erros nas consultas para o servidor mostrar na tela as informaes.

Obtendo a tabela e os campos

Para obter o nome da tabela e seus campos s usar a clausula HAVING do SQL que o servidor realizar o resto se no tiver controle de erros.

Figura 4 Buscando dados da estrutura da tabela

Figura 5 Nome da tabela e primeiro campo

Note em destaque o nome da tabela (usuarios) ponto primeiro campo (registroUsuario), agora acrescenta este campo na consulta e encontra-se o prximo campo da tabela.

Figura 6 Nome do segundo campo da tabela usuarios

E nova consulta para descobrir outro campo.

Figura 7 Nome do terceiro campo da tabela

E depois de colocar todos os campos encontrados na consulta e executar novamente no gera mais erros isso significa que no tem mais campos na tabela.

Figura 8 Todos os campos da tabela foram encontrados

Aps esta jornada o invasor tem o nome da tabela e dos campos, mas no tem os tipos de dados. Com mais injeo de SQL ser fcil encontrar este tipos. Usando UNION e SUM para somar os campos e gerar mais erros no servidor.

Figura 9 Recuperando os tipos de dados

Figura 10 Tipo de dado varchar(max)

Se o tipo fosse nmero o erro seria must a have an equal number expressions, deve realizar as consultas para todos os campos encontrados. Agora que o invasor j tem todas estas informaes ele j pode realizar ataques mais significativos como criar um usurio na aplicao.

Figura 11 Inserindo usurio na tabela

Usando a clusula IN do SQL podemos conseguir o nome do usurio.and 1 in (select nomeUsuario)

Figura 12 Conseguir o nome do usurio

and 1 in (select senhaUsuario)

Figura 13 Senha do usurio

Bom mas isso s mostra o nome e a senha do primeiro usurio, para recuperar todos usurios e senhas teria que criar uma tabela e copiar todos os nomes e senhas para a tabela criada e isso possvel atravs da seguinte injeo de SQL:

;begin declare @ret varchar(8000) set @ret=':' select @ret=@ret+' ' + nameUsuario+'/' + senhaUsuario from usuarios where nomeUsuario>@ret select @ret as ret into foo end

Depois basta gerar o erro para exibir o contedo do campo ret da tabela foo e ver todos os usurios e senhas do banco. union select ret,1,1 from foo --

E para no ficar rastro da invaso usa se o comando SQL para deletar a tabela.; drop table foo

Para poder voltar sem estes esforos todos o invasor pode criar um backdoor para explorar mais a aplicao mesmo se o administrador consertar a vulnerabilidade de SQL Injection, mas para isso ter que usar outras aplicaes para completar a invaso, desativar o firewall e ter acesso ao servidor para executar comandos na linha de comando. Aps esta maratona de ataque o atacante estar praticamente com o controle da aplicao e muitas vezes nem notado, mas para evitar estes transtornos, basta seguir algumas recomendaes para corrigir a aplicao vulnervel.

Tratando os caracteres especiais

Substituindo aspas simples ( ) por arroba ( @ ) em pginas ASP:

Remover ataques usados em SQL Injection

Configurao do Microsoft SQL ServerNo deixar na opo de Local System, pois assim facilita o ataque de SQL Injection e desabilitar a opo de executar o xp_cmdshell nas opes do SQL Surface Area Configuration.

CONCLUSOAs SQL Injections podem ser realizadas por qualquer indivduo que tenha curiosidade, um pouco de pacincia e alguns conhecimentos de SQL. Para poder afirmar que a aplicao no tem vulnerabilidade a SQL Injection a mesma ter que ser submetida a teste desta natureza assim como os outros tipos de ataques na fase de implementao e aps com teste de usurio para poder garantir que esta segura.

REFERNCIASGR1NCH, Rner, SQL INJECTION AVANADO: http://www.dclabs.com.br/ JNIOR, Daladier, Aplicaes WEB e SQL Injection, 2011 Manual do PHP, http://php.net/manual/pt_BR/index.php