免責事項:パラメータ化されたクエリは進むべき道であり、それについて議論する必要はありません:)
私は友達の場所で次のコードを見ました:
var query = "SELECT * FROM students WHERE name = " + name;
nameはユーザー指定の変数です。私の明らかな反応は、「ジョンさん、SQLインジェクションを恐れていませんか?」のようなものでした。彼は述べたよりも、クエリをパラメーター化する必要があることを知っていますが、ユーザーはすべての読み取りを許可され、テーブル/データベースの編集を防ぐための簡単なソリューションを構築したため、この場合は必要ありません。
if(query.Contains(';') { throw new Exception(); }
私は次のようなことができることを知っています
name = Felix OR 1 = 1
しかし、ユーザーがすべてを読み取ることが許可されているため、これは害にはなりません。
私の質問は、ジョンは本当に正しいですか?エントリを挿入、更新、または削除するこの単純なチェックをバイパスする方法はありませんか?
TL; DRいいえ、あなたの友達は正しくないです。 INSERT、UPDATE、DELETE、およびDROP TABLEは、SQLインジェクションに関連するSQLリスクのすべてではなく、すべてではありません。
私がそのクエリで実行できる最も簡単なことは、SLEEP(3600)
(またはjohn' OR SLEEP(3600)='
)の名前と、サービス拒否(できればすぐに)の名前で繰り返しユーザーに尋ねることです接続プールが使い果たされた-メモリが最初に満杯にならない限り-現存するすべての接続は3600秒(1時間)の遅延が切れるのを待ってロックされている間)。
適切な文字列でUNCOMPRESS(HEX2BIN(...))
を使用して、文字列拡張爆弾をトリガーできます。
次に、UNION
キーワードを使用して、他のテーブル(および場合によっては他のtablespaces)を探索できます。アクセス許可が正しく設定されておらず、パスワードが適切に保護されていない場合(これは思ったよりも頻繁に発生します)、_mysql.user
_に対するJOINは、大きなダメージを与える可能性があります。
そして、ユーザーreallyが「すべての読み取り特権」を持っている場合、_@@secure_file_priv
_と呼ばれる気の利いた変数をUNION SELECTでき、空の場合は、SLEEPを複製できますLOAD_FILE()
と呼ばれるほとんど知られていない関数を使用するトリック。これは、適切な状況で読み取りを許可します-たとえば-アクセスパスワードを保存するいくつかのWebアプリケーションへのアクセスパスワード。ハッシュ化)、保護が不十分なPHPファイルでリカバリを容易にするため。
最後に、MySQLのどのバージョンについて話しているのですか?これは非常に重要な場合があるためです。既知のテーブルでUNIONを使用できることは、「認証されたユーザーの特権で任意のSELECTクエリを実行できる」ということと同じです。いくつかのケースでは- this は私が数秒グーグルで最初に見つけたものです-これはよりもはるかに多いあなたが交渉した。