SQLインジェクション攻撃は、データベースバックエンドに依存して動的コンテンツを生成するWebアプリケーションに大きなリスクをもたらします。このタイプの攻撃では、ハッカーはWebアプリケーションを操作して、SQLコマンドをデータベースから発行されたコマンドに注入しようとします。例については、「SQL Injection Attacks on Databases」を参照してください。この記事では、WebアプリケーションがSQLインジェクション攻撃に対して脆弱かどうかをテストするためのいくつかの方法を見ていきます。
自動SQLインジェクションスキャン
1つの可能性は、HPのWebInspect、IBMのAppScan、CenzicのHailstormなどの自動Webアプリケーション脆弱性スキャナを使用することです。これらのツールはすべて、Webアプリケーションの潜在的なSQLインジェクションの脆弱性を簡単かつ自動的に解析する方法を提供します。しかし、それらは非常に高価で、シートあたり25,000ドルまで稼働します。
手動SQLインジェクションテスト
貧弱なアプリケーション開発者は何をするべきですか?実際にいくつかの基本的なテストを実行して、Webインジェクションの脆弱性についてWebアプリケーションを評価することができます。まず、慎重な言葉:私たちが説明したテストは、基本的なSQLインジェクションの欠陥を探すだけです。彼らは高度な技術を検出せず、使用するのにいくらか退屈です。あなたがそれを買う余裕があるなら、自動化されたスキャナで行ってください。ただし、その値札を処理できない場合は、手作業によるテストが重要な第一歩です。アプリケーションが脆弱であるかどうかを評価する最も簡単な方法は、成功した場合にデータベースに実際に害を及ぼすことのない無害な注射攻撃を試すことですが、問題を修正する必要があるという証拠を提供します。たとえば、データベース内の個人を検索し、結果として連絡先情報を提供する簡単なWebアプリケーションがあるとします。そのページは次のURL形式を使用します。 http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike
このページでは、次のようなクエリを使用して、データベース検索を実行すると想定できます。 SELECT電話
FROMディレクトリ
姓=「チャップル」とファーストネーム=「マイク」
これを少し試してみましょう。上記の前提で、SQLインジェクション攻撃をテストするURLを簡単に変更することができます。 http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike'+AND+(select+count(*)+from+fake)+%3e0+OR+'1'%3d'1
WebアプリケーションがSQLインジェクションから適切に保護されていない場合、この偽のファーストネームをデータベースに対して実行するSQL文に差し込むだけで、次のようになります。 SELECT電話
FROMディレクトリ
姓=「チャップル」とファーストネーム=「マイク」
AND(偽からカウント(*)を選択)> 0
OR '1' = '1'
上記の構文は、元のURLの構文とは少し異なります。例に従うのが簡単になるように、URLエンコードされた変数を対応するASCIIコードに変換する自由を取った。たとえば、%3dは '='文字のURLエンコードです。同様の目的で改行を追加しました。 上記のURLを持つWebページを読み込もうとすると、テストが行われます。 Webアプリケーションが正常に動作している場合は、クエリをデータベースに渡す前に、入力から単一引用符を取り除きます。これは、単に一連のSQLを含む名字を持つ人のための奇妙な検索になります。アプリケーションに次のようなエラーメッセージが表示されます。 エラー:名前mike + AND +(select + count(*)+ from + fake)+%3e0 + OR + 1%3d1のユーザーが見つかりません
チャップル!
一方、アプリケーションがSQLインジェクションに対して脆弱であれば、ステートメントはデータベースに直接渡され、2つの可能性のうちの1つが発生します。まず、サーバーに詳細なエラーメッセージが有効になっている場合(そうしてはならない)、次のようなメッセージが表示されます。 Microsoft OLE DBプロバイダーのODBCドライバーエラー '80040e37'
Microsoft ODBC SQL Server Driver SQL Server無効なオブジェクト名 'fake'。
/directory.asp、13行目
一方、Webサーバーに詳細なエラーメッセージが表示されない場合は、より一般的なエラーが発生します。 内部サーバーエラーサーバーで内部エラーまたは構成ミスが発生し、要求を完了できませんでした。
エラーが発生した時刻と、エラーの原因となった可能性のあるものについては、サーバー管理者に連絡してください。
このエラーの詳細については、サーバーのエラーログを参照してください。
上記の2つのエラーのいずれかが発生した場合、アプリケーションはSQLインジェクション攻撃に対して脆弱です。 SQLインジェクション攻撃からアプリケーションを保護するために実行できる手順は次のとおりです。 結果の評価