sqlインジェクション攻撃:キーポイント
SQLインジェクション攻撃は、ウェブサイトのセキュリティ脅威です。攻撃者は、データベースを攻撃するために脆弱性を活用します。
SQLインジェクション攻撃を防ぐために、ユーザーの入力を信頼しないでください。潜在的な攻撃パターンがあるかどうかを常に確認してください。これには、テキスト入力だけでなく、非表示の入力、クエリ文字列パラメーター、Cookie、およびファイルアップロードも含まれます。
ユーザー入力は、サーバー側で検証して、そのタイプが正しいことを確認し、潜在的な悪意のあるコマンドを排除する必要があります。これは、SQLコマンドを変更する可能性のある入力にエスケープ文字を追加したり、SQLコマンドのユーザー入力をコマンドパラメーターに置き換える可能性のある入力に入力を追加するなど、さまざまな方法で達成できます。
潜在的な脆弱性についてウェブサイトコードを定期的に確認することが重要であり、SQLインジェクション攻撃の準備も重要です。潜在的な損害を制限するための手段には、管理者の権利の使用を避け、機密データの暗号化、絶対に必要な場合に備えて機密データを保存しないことが含まれます。
その他の保護対策には、読み取りおよび書き込みデータベース操作に個別の接続を使用し、特定のIPアドレスへのユーザーアカウントアクセスの制限、MS SQLサーバーのWindows認証モデルの使用、SHA-2パスワードハッシュなどの強力なアルゴリズムを使用します。
この記事をレビューしてくれたChris LienertとGuido Tonnaerに感謝します。
Webサイトに対するすべての攻撃の中で、SQL注入は最も危険で一般的なものであり、過去1年間に企業や組織に実際の損害を引き起こすために使用されています。このプログラムは、TalkTalk、VTech、The Wall Street Journal、米国政府など、有名な組織や企業を攻撃するために使用されています。
要するに、SQLインジェクション(SQLIとも呼ばれる)は、Webサイト入力チャネルの脆弱性を悪用して、最も敏感で価値のある情報を保存するWebアプリケーションバックエンドのデータベースを攻撃します。攻撃者は、このスキームを使用して、データを盗んだり改ざんしたり、アプリケーション機能を妨げたり、最悪の場合にデータベースサーバーへの管理アクセスを取得したりできます。ここに、SQLインジェクションとその攻撃からウェブサイトを保護する方法について知っておくべきことがあります。
sql噴射攻撃はどのように機能しますか
SQLインジェクション攻撃は、Webリクエストを介して悪意のあるSQLコマンドをデータベースサーバーに送信することにより実行されます。入力チャネルは、フォーム要素、クエリ文字列、Cookie、ファイルなどの悪意のあるコマンドを送信するために使用できます。それがどのように機能するかを理解するには、ユーザー名とパスワードを受け入れるログインフォームがあるとします:
ユーザーが資格情報を入力して「ログイン」ボタンを押すと、情報はWebサーバーに公開され、SQLコマンドと組み合わされます。たとえば、PHPでは、コードは次のようになります。
$sql_command = "select * from users where username = '" . $_POST['username']; $sql_command .= "' AND password = '" . $_POST['password'] . "'";
しかし、ユーザーが次のような他の何かを試すことを決定した場合:
SELECT * FROM users WHERE username='john' AND password='123456'
生成されたコマンドは次のようになり、常に空でないデータセットを返します:
このコードスニペットにより、ユーザーは正しい資格情報を持たずにログイン画面をバイパスできる場合があります。
SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456'
より深刻な場合、攻撃者は、管理者アカウントを介してデータベースサーバーに接続すると、サーバーのオペレーティングシステムを完全に破壊することさえできます(MySQLの「ルート」やMS SQLサーバーの「SA」など)。 Windowsサーバーでは、XP_CMDSHELLなどの拡張ストアドプロシージャを実行する攻撃者として現れることがあります。あるケースでは、攻撃者はSQLインジェクションの脆弱性を悪用して、感染したサーバーでユーザーアカウントを作成し、リモートデスクトップ機能を有効にし、SMB共有フォルダーを設定し、マルウェアをアップロードします。実際、データベースに保存されているすべてを台無しにします。
ユーザー入力チャネルはSQLインジェクション攻撃の主要な媒体であるため、ほとんどの防御には、攻撃パターンのユーザー入力の制御と検閲が含まれます。
以下は、ユーザーの入力が安全であることを保証できるいくつかの測定値です。 ユーザーの入力を信用しないでください
ユーザー入力に関する主要なルールは「不信と検証」です。つまり、これが当てはまらないことが証明されていない限り、あらゆる形態のユーザー入力は悪意があると見なされるべきです。これは、テキスト領域やテキストボックスなどの単純な入力ボックスだけでなく、隠れ入力、文字列パラメーターのクエリ、Cookie、ファイルのアップロードなど、他のすべてのものでも機能します。
ブラウザのユーザーインターフェイスがユーザーが入力を操作できないからといって、改ざんできないという意味ではありません。 Burp Suiteなどのシンプルなツールにより、ユーザーはHTTP要求をキャプチャして、サーバーに送信する前に非表示のフォーム値を含むものを変更できます。 Base64を介してデータをエンコードするのに十分賢いと思われる場合、悪意のあるユーザーは簡単にデコード、変更、およびリコードできます。
検証とは、ユーザーが正しいタイプの入力を提供し、入力文字列に埋め込まれている可能性のある悪意のあるコマンドを排除することを確認するプロセスです。たとえば、PHPでは、mysql_real_escape_string()を使用して、SQLコマンドの性質を変更する可能性のある文字を逃れることができます。
上記のログインコードの変更されたバージョンは次のとおりです。
$sql_command = "select * from users where username = '" . $_POST['username']; $sql_command .= "' AND password = '" . $_POST['password'] . "'";
検証に関する少しのメモ:クライアント検証関数を追加すると、素晴らしい仕事ができます。ただし、SQLインジェクション攻撃に対する防御として依存しないでください。クライアント関数は、サーバーへの悪意のある入力をより難しくする可能性がありますが、前述のブラウザの調整やツールを使用すると簡単に回避できます。そのため、サーバー側の検証で補完する必要があります。
いくつかのプログラミングプラットフォーム(ASP.NETなど)には、ページのポストバック時に悪意のあるコンテンツのユーザー入力を自動的に評価する組み込み機能が含まれています。しかし、ハッカーは十分なスキルと綿密さでそれらを回避できるため、独自のセキュリティチェッカーを介してユーザーの入力を実行する必要があります。あなたは決して慎重になることはありません。
コマンドパラメーターを使用
以下は、コマンドパラメーターを使用してWebサイトをSQLインジェクション攻撃から保護する方法を示すC#に記述されたコードです。
最初にSQLCommandオブジェクトを作成し、@Parameter_Nameパラダイムをコマンド文字列に使用します。この文字列には、ユーザー入力を挿入する必要があります。
SELECT * FROM users WHERE username='john' AND password='123456'
次に、コマンド文字列と直接連結するのではなく、SQLParameterオブジェクトのインスタンスを作成し、ユーザー入力を挿入します。
最後に、SQLParameterオブジェクトをSQLCommandオブジェクトのパラメーターコレクションに追加します。これにより、パラメーターを提供された入力に置き換えます。 ADO.NETは、残りの作業を担当しています。
PHPでは、同等のものは前処理ステートメントであり、ASP.NETのカウンターパートよりも複雑です。ここで探索できます。
入力の説明的変換このトリックは、PHPのような弱いタイプの言語で機能します。つまり、通常、変数のデータ型を定義しないことを意味し、言語は異なるデータ型の変換を互いに自動的に処理します。
このコードスニペットは、入力のタイプのみを検証し、その範囲ではないことに注意してください。したがって、ユーザーが負の年齢、または1300などの非現実的な年齢を入力しないことを確認するために、他のコードを実行する必要があります。
さらに、別のベストプラクティスは、非ストリング入力を含むSQLコマンドで単一の引用符を使用しないことです。したがって、次のコードを使用しないでください...$sql_command = "select * from users where username = '" . $_POST['username']; $sql_command .= "' AND password = '" . $_POST['password'] . "'";
…次のコードを使用する方が安全です。
SELECT * FROM users WHERE username='john' AND password='123456'
一般的なプラクティスとして、各ページのコードをチェックして、ページのコンテンツ、コマンド、文字列などをユーザーから来る可能性のあるソースと組み合わせた場所を確認する必要があります。ソースコードを脆弱性とセキュリティの脆弱性を確認することは、ソフトウェア開発プロセスに固有の部分である必要があります。
SQL注射の犠牲者になったときの損傷を最小限に抑えるためのヒントをいくつか紹介します。 管理者の権限を避けます
「ルート」または「sa」アカウントを使用してWebアプリケーションをデータベースサーバーに接続することは、最も深刻な間違いの1つです。すでに述べたように、妥協した管理者アカウントは、ハッカーにシステム全体にアクセスできるようになります。 ADMIN以外のアカウントでさえ損傷を引き起こす可能性があります。これは、特にデータベースサーバーが異なるアプリケーションとデータベース間で共有されている場合、サーバー内のすべてのデータベースにアクセスできます。
したがって、ウェブサイトのバックエンドにある特定のデータベースに簡単な読み取りおよび書き込みアクセス許可を持つアカウントを使用する方が良いため、WebサイトがSQLインジェクションでハッキングされている場合、損傷の範囲はそれに限定されます。範囲内の単一のデータベース。より高度なアプローチは、データベースから読み取りまたは書き込み、各セグメントの権限と役割をさらに削減するコードセグメントに個別の接続を使用することです。たとえば、リストページ(データベースを変更するのではなく、検索パラメーターを使用して広く使用)をデータベースへの読み取り専用接続を使用してエンコードして、コードの障害抵抗をさらに強化できます。
データベース内の機密データを暗号化します。これには、パスワード、セキュリティの質問と回答、財務データ、健康情報、および悪意のあるアクターに役立つ可能性のあるその他の情報が含まれます。これにより、ハッカーがデータを手元に持っていても、すぐにそれを活用できないことが保証され、脆弱性を発見し、脆弱性をプラグインし、強制的なパスワードリセットなどの他の反応を行う時間が与えられます。攻撃を受けている人は、解読の前にその価値を失います。 パスワードをハッシュしている場合は、SHA-2のような強力なアルゴリズムを使用してください。これはまもなくパスワード保護の業界標準になります。 MD5とSHA-1は時代遅れで、逆転することができます。 他の形式の暗号化については、キーを保存し、単一の賭けをしない場所に注意してください。キーが暗号化されたデータのすぐ隣にあり、ハッカーがサーバーが侵害されると簡単にアクセスできる場合、暗号化を使用することには意味がありません。
最終的な考え
SQLインジェクション攻撃からWebサイトを保護するFAQ
パラメーター化されたクエリは、値を表すためにプレースホルダーを使用し、実行時に値自体が提供されるSQLクエリの一種です。これは、攻撃者が悪意のあるSQLコードを挿入しようとしたとしても、SQLコマンドの一部ではなく、文字通りの文字列として扱われることを意味します。これにより、SQL注入攻撃が効果的に防止されます。 ストアドプロシージャは、データベースに保存されているSQLステートメントであり、アプリケーションで呼び出すことができます。データベースへの直接アクセスを許可しないため、SQLインジェクション攻撃の防止に役立ちます。代わりに、SQLコマンドとして実行されないパラメーターを使用するため、注入されたSQLコードが実行されないようにします。 正しいエラー処理は、データベース構造またはSQL構文に関する情報を明らかにしないことにより、SQLインジェクション攻撃を防ぐのに役立ちます。これは、エラーが発生すると、エラーメッセージが攻撃者にデータベース構造またはSQL構文に関する手がかりを提供し、攻撃を改善するために使用できるためです。 最小許可原則とは、意図した機能を実行するために必要なアクセス許可をユーザーアカウントまたはプロセスのみに提供することを意味します。たとえば、ユーザーアカウントがデータベースのデータのみを読み取る必要がある場合、書き込みアクセスを許可する必要はありません。これは、攻撃者が脆弱性を活用しようとするときにできることを制限することにより、SQL注入攻撃を防ぐのに役立ちます。
機密データを暗号化します
必要でない場合は、機密データを保存しないでください
SQLインジェクション攻撃からウェブサイトを保護する最初のステップは、SQLインジェクションとは何かを理解することです。 SQLインジェクションは、攻撃者が実行のために入力フィールドに悪意のあるSQLステートメントを挿入するために使用するコードインジェクション技術です。これにより、機密データ、データの損失、さらにはデータの破損への不正アクセスにつながる可能性があります。これを理解したら、入力検証、パラメーター化されたクエリ、ストアドプロシージャを使用してWebサイトを保護するなどの測定値を実装できます。
入力検証は、ユーザー入力の構文、コンテンツ、および論理値を定義する方法です。これを行うことにより、攻撃者が悪意のあるSQLコードをWebサイトの入力フィールドに挿入することを防ぐことができます。これは、入力検証プロセスが定義された基準を満たさない入力を拒否するためです。
パラメーター化されたクエリとは何ですか? SQL注射攻撃をどのように防止しますか?
ストアドプロシージャは、SQL注入攻撃の防止にどのように役立ちますか?
SQLインジェクション攻撃の防止においてエラー処理はどのような役割を果たしますか?
最小許可原則を使用して、SQLインジェクション攻撃からWebサイトを保護するにはどうすればよいですか?
SQLインジェクション攻撃の防止において、定期的な更新はどのような役割を果たしますか?
SQL注入攻撃を防ぐには、通常、既知の脆弱性のパッチが含まれているため、定期的な更新が重要です。ソフトウェアを最新の状態に保つことにより、SQLインジェクション攻撃によって悪用される可能性のある既知の脆弱性から保護されるようにすることができます。
Webアプリケーションファイアウォール(WAF)は、Webアプリケーションとインターネット間のHTTPトラフィックをフィルタリングおよび監視することにより、SQLインジェクション攻撃からWebサイトを保護するのに役立ちます。 HTTPリクエストで悪意のあるSQLコードを検出することにより、SQLインジェクション攻撃を識別およびブロックできます。
侵入検知システム(IDS)は、ネットワークトラフィックを監視し、疑わしい活動を検出することにより、SQL注入攻撃を防ぐのに役立ちます。 IDSが潜在的なSQLインジェクション攻撃を検出した場合、管理者に攻撃を防ぐための措置を講じるよう警告することができます。
暗号化は、攻撃者が機密データを読むことを難しくすることにより、SQLインジェクション攻撃からウェブサイトを保護するのに役立ちます。攻撃者がSQLインジェクションの脆弱性を悪用したとしても、それを使用するためにデータを復号化する必要があります。
以上がSQLインジェクション攻撃からウェブサイトを保護する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。