Inyección de SQL basada en errores

2

Entiendo la idea conceptual detrás de SQLi basado en errores, pero no la ejecución real.

En particular, no puedo entender esta expresión:

or 1 group by concat_ws(0x3a,version(),floor(rand(0)*2)) having min(0) or 1--

¿Cuál es la razón de tener "o 1", "floor (rand (0) * 2)" y min (0)?

    
pregunta Kiuhnm 20.01.2015 - 01:15
fuente

1 respuesta

2

SQLi basado en errores se basa en un error que se encuentra en MySQL con respecto a la declaración GROUP BY (consulte aquí y aquí ).

Para desencadenar el error se deben seguir las siguientes reglas:

  1. Usa una función agregada.
  2. GRUPO POR una columna que tiene dos valores idénticos en filas diferentes.
  3. La salida de la función rand () debe aparecer en la columna del punto 2 anterior.

La cadena

or 1 group by concat_ws(0x3a,version(),floor(rand(0)*2)) having min(0) or 1--

se inyecta en una cláusula WHERE, por lo que or 1 (que es equivalente a or true ) se usa para cancelar las condiciones anteriores y mostrar tantas filas como sea posible. De esta manera, debería haber al menos dos filas con el mismo valor para floor(rand(0)*2)) . Esto se ocupa de los puntos 2 y 3. Usamos floor () de modo que los valores devueltos son solo 0 o 1. Si tuviéramos que usar rand directamente, sería casi imposible satisfacer el punto 2.

Necesitamos having min(0) para ocuparnos del punto 1.

Además, la instancia de or 1 al final de la consulta es inútil y puede eliminarse.

    
respondido por el Kiuhnm 20.01.2015 - 18:39
fuente

Lea otras preguntas en las etiquetas