Web 200: Blind SQL Injection

By BioITINES Team

La solucion a continuacion esta basada en el reto Web 100, pero debido a que fue solucionado via Blind SQL Injection, el equipo uso la misma tecnica para resolver el Web 200.

Diccionario de palabras

En el reto web se tenia un input, el cual esperaba alguna de las 3 palabras que se dieron en el reto: Chiva, Naco, Fresa. Al dar clic en el botón “Buscar” se dirigía a otra página web en la cual se mostraba el significado de las palabras. En la parte del URL se podía observar el parámetro Buscar:

                                                          buscar.php?Buscar=naco

Entonces, cuando se ingresaban las palabras que se dieron en el reto devolvía dicho significado correspondiente. Por ejemplo, si se introducía naco, mostraba:



Posteriormente se hizo una prueba al final del URL en donde se mostraba la palabra naco para determinar si se trataba de una inyección SQL. Se cerro la comilla simple (‘) de la palabra naco, agregando lo siguiente: and '1'='1 esperando que el script en el servidor agregara la comilla al final y con esto se ejecutara nuestro comando.
Al hacer esto, se devolvía correctamente la definicion de la palabra enviada, dandonos una confirmacion verdadera, posteriormente cambiamos la operacion a: and '1'='0  esperando que al ser una condición falsa regresara otra respuesta, y con esto confirmar la existencia de  inyeccion SQL.


Condicion verdadera (True):
                                             hxxp://18.219.x.x/buscar.php?Buscar=naco' and '1'= '1

Condicion Falsa (False):

                                            hxxp://18.219.x.x/buscar.php?Buscar=naco' and '1' = '0

Acertadamente se verificó que se trataba de una inyección Blind SQL, ya que no se reciben resultados de la operacion SQL, pero si se reciben respuestas booleanas True o False. Por lo que el siguiente paso fue utilizando estas respuestas booleanas, determinar la longitud de cadena de la base de datos que el reto pedía.


                                  hxxp://18.219.x.x/buscar.php?Buscar=naco' and length(database ())<'19


Se llego a la conclusión de que la longitud de la base de datos era de 19 caracteres los que abarcaban la longitud de la cadena de la base de datos. Por consiguiente, se implementó una búsqueda booleana tratando de identificar los caracteres a traves de su valor ASCII, es decir:

               hxxp://18.219.x.x/buscar.php?Buscar=naco' and ascii(substr(database (),1,1))<'83


Que es lo que hacemos?


Se ejecuta el comando de MySQL database() el cual regresa el nombre de la Base de Datos usada por la aplicacion Web, pero al solo tener respuestas booleanas, extraemos el primer caracter de dicha cadena via substr(cadena, 1,1), lo convertimos a su valor ascii y le preguntamos si su valor es menos de 83.  
Es decir,  siempre que el ASCII fuera menor a 83 la pagina no mostraba nada. Pero al llegar al 83, la pagina mostraba la definicion de naco. Entonces como el 82 no mostraba nada y el 83 si, se determinó que el primer caracter de la Base de Datos era el 83. 

Y como todo método debe tener su comprobación, para verificar que el dato ASCII era el correcto se aplicaba lo siguiente:

             
hxxp://18.219.x.x/buscar.php?Buscar=naco' and ascii(substr(database (),1,1))='83
 

Simplemente se quitaba el signo menor que y se igualaba con número ascii próximo. Si se mostraba la leyenda del significado de “Naco”, eso confirmaba que era el caracter buscado en dicha cadena.
 

Ahora, como preguntamos por el segundo caracter del nombre de la Base de Datos?

        
            hxxp://18.219.x.x/buscar.php?Buscar=naco' and ascii(substr(database (),N,1))='83


Donde N determina la posicion del caracter a extraer en la cadena: 1, 2, 3, etc.

Así sucesivamente se fueron extrayendo los siguientes 18 caracteres hasta llegar con el nombre de la base de datos, dandonos la flag:
 

                                                             SQL_1nJ3ct10N_R0CKS

Reto Ciego (Web 200)


Para poder acertar en la inyección SQL a ciegas, se aplico el mismo procedimiento del reto anterior, puesto que igual se requería el nombre de la base de datos, solo que esta vez la longitud de la cadena era de 24 caracteres.
Una vez que se determinaron los 24 caracteres ascii, formaron la frase, en este caso el correspondiente flag:


                                                        Bl1nd_SQL_1nJ3ct1oN_R1F4



HackDef Team

Queremos mencionar otra forma de resolverlo por parte del equipo HackBUAZ quienes bypasearon el fitro del operador "union" y con esto consiguieron la flag con un solo request! Abajo la descripcion de su solucion


Igual que el otro es un buscador pero ahora mas Seguro pero parece que si se detecta un ataque el servidor se reinicia

Hicimos varios intentos pero siempre obteniendo pantallas como esta:


Pero revisando un poco las maneras de burlar eso… encontramos … en la pagina de Owasp diferentes tecnicas:


https://www.owasp.org/index.php/SQL_Injection_Bypassing_WAF



Probamos algunas de esas inyecciones y escogemos la de /*!50000UniON SeLeCt*/
Pero antes veamos como funciona.

Le dice al DB Engine que solo las versiones de MySQL 5.0.0 o mayores (50000) veran ese comandoel cual esta entre los caracteres /* y */.



Por ejemplo, en la figura de abajo, le decimos al engine que si la version de MySQL es mayor a 5.0.0 ejecute el comando "select 1" y por ende vemos que imprime el resultado, pero despues le decimos que si la version es mayor a 5.8.8.x (lo cual no se cumple) entonces no se ejecuta el comando y vemos no regresa resultado (0 rows).





Finalmente y ya entendido el ataque, mandamos este request:



                 hxxp://189.240.x.x/buscar.php?Buscar='/*!50000UniON+SeLeCt*/+database();#



Y se obtinene el Flag:



Comments