SQLインジェクション
SQLインジェクション
SQLインジェクションは、ユーザの入力データを使用してSQL文を生成するWebアプリケーションの脆弱性を利用し、本来意図されたものとは異なるSQLを実行させ、権限のないデータの取得やデータ破壊などの不正なDB操作を行うセキュリティ攻撃です。
ログイン フォームに入力されたユーザ名とパスワードでユーザを認証するアプリケーションがあるとします。
ここで攻撃者がユーザ名とパスワードとして「' OR ''='」を入力すると、結果として次のクエリーが発行されます。
ORから後が常に真であるため、すべてのレコードがWHERE句の条件に該当するようになり、不正なパスワードでも認証されてしまいます。
そのほかに、DELETE文によるデータの削除、テーブル名やカラム名といったスキーマ情報の取得などの不正操作が行われるケースもあります。
string queryString = "SELECT * FROM users WHERE " + "user_name = '" + userName.Text + "' AND password = '" + password.Text + "'";
ここで攻撃者がユーザ名とパスワードとして「' OR ''='」を入力すると、結果として次のクエリーが発行されます。
SELECT * FROM users WHERE user_name = '' OR ''='' AND password = '' OR ''=''
ORから後が常に真であるため、すべてのレコードがWHERE句の条件に該当するようになり、不正なパスワードでも認証されてしまいます。
そのほかに、DELETE文によるデータの削除、テーブル名やカラム名といったスキーマ情報の取得などの不正操作が行われるケースもあります。
対策
SQLインジェクションに対する防御策としては、入力値を検証してSQL中で意味を持つメタ文字を適切にエスケープすることや、SQLパラメーターの使用が有効です。上の例でSQLパラメーターを使用するよう変更すると、次のようになります。
string queryString = "SELECT * FROM users WHERE " + "user_name = @username AND password = @password";
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.Add("@username", SqlDbType.VarChar, 15).Value = userName.Text;
command.Parameters.Add("@password", SqlDbType.VarChar, 15).Value = password.Text;
SqlDataReader reader = command.ExecuteReader();
SQLパラメーターを使用すると入力データはリテラルとして解釈されるため、入力データがSQL文の一部として扱われることはありません。
そのほかに、攻撃者に手がかりを与えないよう、データベースからの詳細なエラーメッセージをユーザに表示しない、また必要最小限の権限でデータベース操作を行うといった対策も挙げられます。
dotTESTのルール
○ SQL クエリー インジェクションから防御するこのルールは、不正な文字を含んでいる可能性のある入力データが、検証メソッドによるチェックを受けないまま出力SQLメソッドに渡されている場合に違反をレポートします。このルールはフロー解析ルールなので、入力データの取得と出力が別のメソッドに分かれていたり、複数の実行パスが存在する場合でも、実行パスを辿って違反を検出することができます。
dotTESTが検出する脆弱性(抜粋)一覧
- クロスサイト スクリプティング(XSS)
- SQLインジェクション(本ページ)
- HTTPレスポンス分割
- 悪意のあるファイルの実行
※ セキュリティルール及びセキュリティコンプライアンス規約セットによる静的解析には「セキュリティコンプライアンスパック」のライセンス(有償)が必要です。
PICK UP
イベント・セミナー
C# VB.NET対応 静的解析・動的解析 テストツール dotTESTに
関するお問い合わせ
テクマトリックス株式会社
東京本社ソフトウェアエンジニアリング事業部
03-4405-7853
- メールでのお問い合わせ
- parasoft-info@techmatrix.co.jp