mysqlを使用していることを発見した攻撃者は、この情報のみを使用してSQLインジェクション攻撃を行うことができますか?テーブル/データベース名がわからない場合、どうしてそれを見つけることができますか?それは可能ですか?それを避ける方法は?ありがとう
Philippの発言に加えて、SQLインジェクション攻撃はDBの構造を知らずに行われることがよくありますが、脆弱性が公開されると、それを使用して構造を特定できます。
たとえば、かつて教えられた最初のSQLインジェクション文字列の1つは、以前は';shutdown--
でした
これは、ユーザーが提供したデータがSQLクエリで引用符で囲まれていることを前提としているため、文字列の最初の引用符で閉じられ、次のセミコロンでステートメントが終了するため、エラーが発生する可能性があります。ただし、次のステートメントは引き続き実行され、shutdown
になります。 --
は、残りがコメントであることを示します。したがって、入力がサニタイズされていない場合、この文字列はサーバーをすぐにシャットダウンする可能性があります。
SQLサーバーなどの多くのDBシステムで同じ一歩前進して、システムテーブルのリストはよく知られており、クエリを実行していたアカウントが特権を持っていれば、それを使用してユーザー、テーブル、ストアドプロシージャをリストできます。ビュー、およびその他のSQL構成。それがリストされたら、それらをドロップ、エクスポートでき、テーブルまたはビューの構造もリストすることができます。
同様に、クエリは、認証をバイパスするように構成できます。たとえば、' or '1'='1' --
などの文字列を使用できます。
上記のような文字列はWHERE
句に挿入され、どのユーザー名またはパスワードが提供されても、これは真の評価となり、資格情報を提供せずにユーザーを認証できます。例えば。:
SELECT * FROM USERS WHERE UserName = '' or '1'='1' --
つまり、SQLインジェクション攻撃が成功すると、攻撃者はサーバー上でコードを実行できるようになります。これは、脅威のモデリングに関してサーバー自体に座っている場合と同じと見なす必要があります。
攻撃を回避するために、ほとんどのフレームワークとDBシステムには、パラメーター化されたクエリのメカニズムが用意されています。プラットフォームを確認する必要がありますが、通常、パラメーター化されたクエリが最も安全な方法です。自分でSQLクエリを構築する必要がある場合(たとえば、それを必要とする外部APIに渡す場合)、回避するように努めますが、適切にエンコードすることを検討してください。
場合によります。
ただし、これらの問題を回避する最善の方法は、最初からSQLインジェクションを回避することです。 SQLデータベースと通信するには、文字列を連結するよりも多くの優れた方法があります。ストアドプロシージャ、準備されたステートメント、またはORMラッパーを使用します。
はい- INFORMATION_SCHEMA を使用してデータベースの構造を見つけることができます。
this one などの多くのオンラインチュートリアルでは、単純なエクスプロイトからすべてのデータの抽出までのプロセスを説明しています。
防御側の観点からは、INFORMATION_SCHEMAテーブルへのアクセスを拒否できます。正当なアプリケーションがこれを使用することはないでしょう。ただし、この場合、Philippが示唆するように、攻撃者はテーブルと列の名前を総当たりにする可能性があります。アクセスを拒否するWebアプリは実際に見たことがありません。そもそもSQLインジェクションを防ぐためにあなたの努力を費やす方が良いです。