Inyección SQL explique esta consulta

7
' 1=1 GROUP BY CONCAT_WS ('~',version(), FLOOR(rand(0)*2)) having min(0)

1 > > Mi primera pregunta es para qué se utiliza la función CONCAT en esta consulta

2 > > ¿Y por qué usamos tener min(0) aquí?

    
pregunta Sumit Ojha 15.05.2015 - 21:13
fuente

1 respuesta

8

Bueno, vamos a analizarlo:

  • CONCAT_WS : concatene con separador.
  • version() : devuelve la versión de MySQL.
  • FLOOR(rand(0)*2) : emite la siguiente secuencia de números: 0, 1, 1, 0, 1, ...
  • having min(0) : por sí mismo, esto es ilegal, ya que la cláusula HAVING requiere una condición. Esto, y el hecho de que no haya ; -- al final, implica que la inyección está esperando una condición al final.

Entonces, esto concatena la cadena de la versión y una secuencia de números en un grupo. La secuencia de números para la cláusula de grupo se deriva de FLOOR(rand(0)*2) .

Lo que pasa con GROUP es que requiere claves de grupo únicas. Como version() devolverá el mismo valor cada vez, concatenando eso y la salida de FLOOR(rand(0)*2) tres veces dará como resultado dos números diferentes (0, 1) y luego una segunda instancia de 1, lo que causa un error (entrada duplicada para el grupo clave), que se muestra de nuevo al usuario. Ese error se ve algo como esto:

  

Entrada duplicada '5.6.24-1 ~ 1' para la clave 'group_key'

Esto hace que el número de versión se vuelva a filtrar en la respuesta como parte de un ataque de inyección de SQL basado en errores. Esto se puede expandir para realizar otros ataques.

En cuanto a por qué el atacante eligió FLOOR(rand(0)*2) , es una expresión simple y confiable que es confiable (la función rand() es un PRNG que toma un parámetro semilla; la misma semilla produce lo mismo secuencia siempre) y satisface el requisito de tener una salida duplicada con relativa rapidez. Podría elegir un valor distinto de 0 y aún funcionaría.

    
respondido por el Polynomial 15.05.2015 - 23:36
fuente

Lea otras preguntas en las etiquetas