SQl Injection


SQL Injectionとは?


ハッカーによって操作されたSQLクエリー文をそのままデータベースに渡し、異常なコマンドを実行する攻撃方法。

攻撃方法


1)認証迂回


通常ログイン時にinputウィンドウにユーザー名とパスワードを入力します.
たとえば、ユーザ名がabcパスワード1234の場合、クエリは次のように送信される.
SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";
SQL Injectionで攻撃する場合は、inputウィンドウにパスワードを入力し、別のクエリー文を入力します.
SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234"; DELETE * FROM USER WHERE ID = "1";
セキュリティが不十分な場合、このようにパスワードとアイデンティティが一致してTrueとなり、後に書かれたDELETE文もデータベースに影響し、致命的な場合です.
また、基本問合せ文のWHERE節にOR文を追加し、'1' = '1'などの真文を作成し、無条件適用に変更してDBを自由に操作することもできます.

2)データ漏洩


これはシステムで発生したエラー情報を利用して攻撃する方法である.
通常のエラーは、開発者がエラーを修正する上で役立つ存在です.ハッカーたちは逆に悪意のある文を挿入し、エラーを引き起こす.
例えば、ハッカーは、GET方式で実行されるURLクエリ文字列を追加することによってエラーを発生させる.
対応するエラーが発生した場合、そのエラーから対応するWebアプリケーションのデータベース構造を推定し、ハッカー攻撃に使用できます.

防御方法


1)入力値受信時に特殊文字かチェック


ログイン前に、認証ロジックを追加し、プリセットの特殊文字が要求に入るのを防止します.

2)SQLサーバーエラーが発生した場合、該当するエラーメッセージを非表示にしてください


viewを使用して、ソース・データベース・テーブルへのアクセス権を向上させます.一般ユーザーはviewでしかアクセスできません.これによりエラーが表示されません.

3)prepare文の使用


prepare文を使用すると、特殊文字を自動的にエスケープできます.
(文とは異なり、クエリー文では伝達パラメータ値を受け入れます)これを利用して、サーバ側はフィルタ処理によって攻撃を防御します.
参考資料