Comprender la inyección de SQL basada en boolean

9

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 o FALSE .

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 consulta SELECT 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 como TRUE FALSE .

  1. ¿Mi comprensión de lo anterior es correcta?
  2. 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 del AND ? 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?
  3. 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?
pregunta qre0ct 22.06.2014 - 04:40
fuente

1 respuesta

9
  

¿Mi comprensión de lo anterior es correcta?

Sí, tu comprensión es correcta.

  

Si es así, entonces en la consulta, $ Id = 1 'AND ASCII (SUBSTRING (username, 1,1)) = 97 AND' 1 '=' 1 , ¿cuál es la necesidad de la parte audaz arriba? 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 en negrita de la consulta?

Para explotar una inyección de SQL con éxito, es necesario que el SQL resultante sea válido. El AND '1'='1 final es para ajustar el código inyectado en la declaración existente. Ya que escapamos de un literal de cadena con 1' al comienzo, necesitamos introducir un nuevo literal de cadena al final. Sin embargo, también se podría usar AND ASCII(SUBSTRING(username,1,1))='97 , ya que MySQL puede comparar cadenas con valores enteros.

  

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?

La inyección de SQL basada en errores sería el caso cuando el servidor respondería con el mensaje de error técnico real como:

  

# 1064: tiene un error en su sintaxis SQL. Consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de '' 'en la línea 1

Aquí puede ver qué parte del SQL resultante falló y puede razonar cómo solucionarlo con la inyección.

En la inyección SQL basada en Boolean, todo lo que ve es un comportamiento diferente en diferentes entradas. Este comportamiento diferente puede incluir la respuesta de un mensaje de error, pero a menos que sea uno con detalles técnicos que le digan a qué salió mal, no le ayuda más que a cualquier otro comportamiento booleano.

    
respondido por el Gumbo 22.06.2014 - 09:21
fuente

Lea otras preguntas en las etiquetas