Estoy tratando de entender el concepto de inyección ciega basada en Boolean. He pasado por OWASP Guide To SQLi para entenderlo. Sin embargo, estoy confundido con cómo funciona exactamente. A continuación es lo que entiendo del artículo en el enlace anterior. Por favor, avíseme si mi comprensión es correcta o si estoy entendiendo mal algo.
Entonces, según el enlace anterior, asumimos una URL de muestra donde el parámetro vulnerable es 'id' como:
http://www.example.com/index.php?id=1'
Por lo tanto, la consulta coreesponding que se está ejecutando en el servidor podría ser:
SELECT field1, field2, field3 FROM Users WHERE Id='$Id'
Ahora, asumiendo que Users
contiene un campo llamado Username
, queremos extraer el valor del campo Username
donde id=1
usando nuestra técnica booleana. Así que intentamos adivinar este valor carácter por carácter haciendo esto:
$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1
El artículo dice que seguimos aumentando el valor ASCII de 97 en adelante 1 a 1 cada vez que encontramos que la evaluación es falsa.
Ahora, el problema aquí es cómo encontrar si el resultado que se obtiene de la consulta anterior es
TRUE
oFALSE
.
Entonces, para resolver este problema, el artículo dice que intentamos realizar lo siguiente antes de intentar lo anterior:
$Id=1' AND '1' = '2
, por lo que esto generaría la consultaSELECT field1, field2, field3 FROM Users WHERE Id='1' AND '1' = '2'
.
Después de la ejecución de la consulta anterior, el servidor devolverá cierto estado (una página, una redirección, etc.). Ahora, como 1=2
siempre se evaluará como FALSE
, conoceremos qué sucede en caso de que se devuelva un resultado FALSE
de una consulta.
Ahora podemos hacer coincidir este resultado con el resultado que obtenemos por la ejecución de
$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1
y, por lo tanto, concluir si la prueba contra 97 (o cualquier valor ASCII específico) se evalúa comoTRUE
FALSE
.
- ¿Mi comprensión de lo anterior es correcta?
- Si es así, entonces en la consulta,
$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1
, ¿por qué necesitamos la parte después delAND
? Quiero decir, ¿no podemos confirmar el resultado (como se confirma en el análisis anterior) sin la nota audaz de la consulta? ¿Por qué es realmente necesaria la parte audaz de la consulta? - Ya que en esta técnica también estamos básicamente tratando de ver la página de error y distinguirla de la página de éxito, ¿no debería considerarse como un SQLi basado en errores en lugar de llamarlo basado en Boolean?