¿Por qué usar enmascaramiento de bits en SQLi ciego?

2

Sigo este tutorial sobre Pentesterlab sobre SQLi, y están hablando de Blind SQL. Por lo que pensé, se necesitaba SQLi ciego cuando no ve (error) el resultado de su objetivo, y solo puede usar fase / right / slow / fast para ver si su consulta es verdadera o funciona.

Pero en ese tutorial comienzan con el enmascaramiento de bits y no sé nada. Sé que existe una máscara de bits de:

  • Extracción: AND (utilizado en este tutorial)
  • subconjunto de configuración: O
  • Alternar: XOR

Y 'AND' funciona como este ejemplo:

  

MÁSCARA: 100110
VALU: 101010
RESU: 100010

Sólo '1' donde valor y máscara son '1'.

Sin embargo, ¿cómo se usa esto en Blind SQLi? ¿Y por qué ese script que usan en el tutorial?

tl; dr ¿Por qué usan la máscara de bits en Blind SQLi? Supongo que no entiendo Blind SQLi por completo.

    
pregunta O'Niel 21.12.2016 - 19:48
fuente

1 respuesta

4
  

Pensé que se necesitaba SQLi ciego cuando no ve el resultado (error) de su objetivo, y solo puede usar fase / derecha / lenta / rápida para ver si su consulta es verdadera o funciona.

Correcto, en una inyección ciega de SQL solo puede evaluar si el resultado de una consulta es verdadero o falso.

Entonces, ¿cómo obtendrías un valor de la base de datos si solo pudieras hacer preguntas de sí / no?

Seguramente pedirías cada letra por separado. Pero eso seguiría siendo por lo menos 62 posibilidades (asumiendo a-zA-Z0-9 ) por personaje. Por lo tanto, la idea presentada en el tutorial es solicitar cada bit individualmente. De esta manera, necesita exactamente 8 consultas por byte para determinar su valor. Entonces, todo lo que hace es transformar el valor que desea leer en binario y pedir cada bit sucesivamente si es 1.

Digamos que quieres recuperar el valor "secreto". Entonces comienzas extrayendo el primer carácter:

substring('secret',1,1) -> 's'

Entonces obtienes su valor ASCII:

ascii('s') -> 115

Ahora aplica un bit a bit "y" ( & ) para aislar el valor del primer bit:

115 & 1 -> 1

  1110011
& 0000001
---------
  0000001

El resultado es 1 , lo que hace que la declaración sea verdadera.

Si aplica este método para cada bit de cada carácter del valor que desea leer, finalmente obtendrá la cadena completa solo evaluando si sus consultas son verdaderas o falsas.

    
respondido por el Arminius 21.12.2016 - 21:41
fuente

Lea otras preguntas en las etiquetas