Was der Angriff wirklich bewirkt
Es gibt ein subtiles, aber cleveres Detail bei diesem Angriff, das andere Antwortende übersehen haben. Beachten Sie die Fehlermeldung Duplicate entry ':sjw:1:ukt:1' for key 'group_key'
. Die Zeichenfolge :sjw:1:ukt:1
ist eigentlich das Ergebnis eines Ausdrucks, der von Ihrem MySQL-Server ausgewertet wird. Wenn Ihre Anwendung die MySQL-Fehlerzeichenfolge an den Browser zurücksendet, kann die Fehlermeldung Daten preisgeben aus Ihrer Datenbank.
Diese Art von Angriff wird in Fällen verwendet, in denen das Abfrageergebnis nicht anderweitig an den Browser zurückgesendet wird (blinde SQL-Injection) oder wenn ein klassischer UNION SELECT-Angriff kompliziert durchzuführen ist. Es funktioniert auch in INSERT/UPDATE/DELETE-Abfragen.
Wie Hawili feststellt, sollte die ursprüngliche spezielle Abfrage keine Informationen preisgeben, es war nur ein Test, um festzustellen, ob Ihre Anwendung für diese Art von Injektion anfällig ist.
Der Angriff nicht scheitern wie von MvG vorgeschlagen, das Verursachen dieses Fehlers ist der Zweck der Abfrage.
Ein besseres Beispiel dafür, wie dies verwendet werden kann:
> 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'
Warum der Fehler ausgelöst wird
Warum die Abfrage diesen Fehler in MySQL verursacht, ist mir ein Rätsel. Es sieht nach einem MySQL-Fehler aus, da GROUP BY mit doppelten Einträgen umgehen soll, indem es sie aggregiert. Hawilis Vereinfachung der Abfrage verursacht den Fehler tatsächlich nicht!
Der Ausdruck FLOOR(RAND(0)*2)
gibt die folgenden Ergebnisse der Reihe nach, basierend auf dem zufälligen Seed-Argument 0:
> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
...
Da der 3. Wert ein Duplikat des 2. ist, wird dieser Fehler ausgegeben. Jede FROM-Tabelle mit mindestens 3 Zeilen kann verwendet werden, aber information_schema.tables ist eine übliche. Die Teile COUNT(*) und GROUP BY sind notwendig, um den Fehler in MySQL zu provozieren:
> SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'
Dieser Fehler tritt nicht in der PostgreSQL-äquivalenten Abfrage auf:
# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
count | x
-------+---
83 | 0
90 | 1
(Tut mir leid, dass ich ein Jahr zu spät antworte, aber ich bin erst heute darüber gestolpert. Diese Frage ist für mich interessant, weil ich nicht wusste, dass es Möglichkeiten gibt, Daten über Fehlermeldungen von MySQL zu verlieren)