COVIL HACKER

, ! .


» COVIL HACKER » Vulnerabilidades de aplicativos da Web » Tutorial Diferentes maneiras de identificar o SQLi


Tutorial Diferentes maneiras de identificar o SQLi

1 2 2

1

Introdução -
Você está cansado de ser um skid que nunca encontra o SQLi? Você é um daqueles caras que coloca ' depois de um parâmetro e quando não retorna um erro você pensa: "Bem, acho que não é vulnerável!"? Bem merda, este é o guia para você. Este destina-se a ser referido mais como um manual/guia de referência do que como um tutorial.

Acionadores básicos de vulnerabilidade SQLi -
A técnica mais comumente usada para obter uma página para retornar um erro SQL é interromper a consulta usando "'". Não há absolutamente nada de errado em fazer isso, no entanto, a maioria dos WAFs modernos terá sistemas de prevenção que bloqueiam esse ataque simples e usado em demasia. Confiar apenas na técnica do apóstrofo não o levará a lugar nenhum e você nunca invadirá grandes sites usando-o.

O próximo método mais usado é a técnica booleana básica. Consiste em colocar "AND 1=0", "' AND 1=0" ou "AND 0" após o parâmetro. Mais uma vez, não há nada de errado com isso, mas os WAFs modernos irão bloqueá-lo.

Observe como a técnica acima foi referida como "básica". Isso ocorre porque existem maneiras mais complicadas (mas não deveriam ser complicadas) de fazer a consulta retornar false. Uma dessas maneiras é simplesmente incluir apóstrofos em sua consulta, assim:
Código:
AND '1='0

Como alternativa, em vez de incluir apóstrofos (ou você pode apenas combinar isso com apóstrofos), você pode alterar a capitalização de "AND", bem como o tamanho dos inteiros depois dele. Alguns WAFs (mas não a maioria) terão listas negras que bloqueiam apenas "AND 1=0" ou "and 1=0", o que facilita para nós. Poderíamos fazer algo assim -
Código:
AnD 38459345=3804529
And it would work just like "AND 1=0".

Gatilhos de vulnerabilidade SQLi intermediários -
Tudo isso realmente inclui adulterar a técnica booleana um pouco mais. Uma das maneiras de fazer isso é alterar o tipo de dados de inteiro para flutuante (decimal), assim -
Código:
AND 203.345=245.234

A segunda maneira de fazer isso é adicionar espaços em branco à consulta. Espaços em branco tortos, ausentes ou extras podem ignorar IPSs baseados em assinatura. Um exemplo disso seria -
Código:
AND      1      =   0
Eu sei que parece extremamente retardado, mas ei, funciona.

A última maneira de acionar o SQLi "intermediário" é usar operadores aritméticos para mexer com a consulta. A única coisa que você não pode fazer (geralmente) é usar adição porque quando você usa +, ele é analisado como um espaço e sua consulta não será lida como uma equação. As três maneiras de fazer isso são mostradas abaixo -
Código:
AND 1-2=0
AND 1/2=0
AND 1*2=0
Todos eles retornarão false e farão com que a página seja carregada incorretamente.

Gatilhos avançados de vulnerabilidade do SQLi -
é aqui que as técnicas ainda mais complexas (mas ainda não devem ser complicadas) entram em ação quando nenhuma das opções acima funciona. Isso é o que devemos usar quando os IPSs procuram especificamente por operadores booleanos antes das declarações condicionais, se estiverem sendo anexadas a outra declaração condicional e bloqueiam imediatamente se forem detectados.

Nesse caso, podemos usar a instrução condicional "IF". A maneira mais fácil de fazer isso é -
Código:
AND IF(98234892=234234,1,0)
O 1 e 0 dentro dos parênteses representam verdadeiro e falso, onde 1 é verdadeiro e 0 é falso. A instrução acima obviamente retornará false, disparando um erro na página. Você pode modificar a instrução como as intermediárias acima (por exemplo, usando operadores aritméticos, diferentes tipos de dados, etc.) e ela ainda funcionará perfeitamente.

A próxima forma "avançada" de disparar erros é usando a instrução "BETWEEN". "BETWEEN" é um operador de comparação e retornará verdadeiro ou falso com base em se o inteiro fornecido está entre os outros dois inteiros depois dele. Isso é útil quando "=" é filtrado do parâmetro. A maneira mais básica de fazer isso é demonstrada abaixo -
Código:
AND 1 BETWEEN 2 AND 3
O que retornará falso, já que 1 obviamente não está entre 2 e 3.
O operador between também funcionará em strings (bom quando você não pode usar números inteiros), no entanto, as aspas são usadas -
Código:
AND 'a' BETWEEN 'b' AND 'c'

A última, mas certamente não menos importante, maneira de fazer isso é o operador REGEXP. Este deve ser bastante auto-explicativo e é provavelmente o mais fácil de fazer. A maneira mais simples de fazer isso é
Código:
AND 1 REGEXP 2
Que retornará falso. Isso não é diferente do usual "AND 1=0", apenas usa REGEXP em vez de um sinal de igual.

Extras -
Sempre que o espaço em branco básico " " for filtrado, tente usar caracteres de espaço em branco alternativos, como sinais de + ou comentários do MySQL. Os comentários do MySQL são interpretados como espaços em branco para que funcionem bem. Um exemplo disso seria
Código:
AND+1=0
or
AND/**/1=0
Que também pode ser usado para a massa de espaços em branco, mostrados nos gatilhos SQLi intermediários.

Tudo acima disso pode ser substituído por valores hexadecimais, como 0x61, que se traduz em "a". O que quero dizer com tudo pode ser substituído é isso -
Código:
AND 0x31=0x30
AND IF(0x31=0x30,1,0)
AND 0x31 BETWEEN 0x32 AND 0x33
AND 0x31 REGEXP 0x30
Observação: você também pode codificar strings em hexadecimal em vez de números inteiros e usá-los.

GRANDE NOTA: TUDO ISSO PODE SER ABATIDO COM intval() e/ou mysqli_real_escape_string()

0

2


» COVIL HACKER » Vulnerabilidades de aplicativos da Web » Tutorial Diferentes maneiras de identificar o SQLi


|