SQLインジェクション


SQLインジェクションは、ユーザの入力データを使用してSQL文を生成するWebアプリケーションの脆弱性を利用し、本来意図されたものとは異なるSQLを実行させ、権限のないデータの取得やデータ破壊などの不正なDB操作を行うセキュリティ攻撃です。 ログイン フォームに入力されたユーザIDとパスワードでユーザを認証するアプリケーションがあるとします。

次のようにSQL文を作成しています

ここで攻撃者がユーザIDとして「myid」、パスワードとして「>pass’ OR ’a’=’a」を入力すると、結果として次のクエリーが発行されます。

結果として次のクエリーが発行されます。

ORから後が常に真であるため、すべてのレコードがWHERE句の条件に該当するようになり、不正なパスワードでも認証されてしまいます。
そのほかに、DELETE文によるデータの削除、テーブル名やカラム名といったスキーマ情報の取得などの不正操作が行われるケースもあります。

対策

SQLインジェクションに対する防御策としては、入力値を検証してSQL中で意味を持つメタ文字を適切にエスケープすることや、プリペアド ステートメントの使用が有効です。
上の例をプリペアド ステートメントを使用するよう変更すると、次のようになります。

次のようになります。

プレースホルダ「 ? 」で表されるパラメータは常に文字列として解釈されるため、入力データがSQL文の一部として扱われることはありません。
そのほかに、攻撃者に手がかりを与えないよう、データベースからの詳細なエラーメッセージをユーザに表示しない、また必要最小限の権限でデータベース操作を行うといった対策も挙げられます。

Jtestのルール

SQLインジェクションから防御する

このルールは、不正な文字を含んでいる可能性のある入力データが、検証メソッドによるチェックを受けないまま出力SQLメソッドに渡されている場合に違反をレポートします。このルールはフロー解析ルールなので、入力データの取得と出力が別のメソッドに分かれていたり、複数の実行パスが存在する場合でも、実行パスを辿って違反を検出することができます。

  • チェックできる入力データ
    • リモート メソッドおよびエントリ ポイント メソッドのパラメータ
    • ネイティブ メソッド
    • 検証を行っていない Struts フォーム
    • ネットワーク
    • Servlet リクエスト
    • ファイル
    • パイプ
    • リモート メソッド
    • リフレクション メソッド
    • 環境変数およびシステム プロパティ
    • データベース
    • ストリーム指向 API (ストリーム、リーダー、チャネル)
    • コンソール
    • GUI コントロール
  • チェックできる SQL メソッド
    • java.sql.Statement
      • addBatch(String)
      • execute(...)
      • executeQuery(String)
      • executeUpdate(...)
      • setCursorName(String)
    • org.springframework.jdbc.core.JdbcOperations
      • execute(...)
      • query.*(...)
      • update(...)
      • batchUpdate(...)
                               その他

  • 検証メソッドの指定も可能
    ルールのパラメータでは検証メソッドを指定することも可能です。検証メソッドは、不正な文字を含んでいる可能性のある入力データを受け取り、チェック済みの安全なデータをパラメータまたは戻り値として返すメソッドです。検証メソッドをパラメータで指定しておくと、チェック済みのデータに対して誤って違反が検出されることがなくなるため、解析結果の精度が向上します。


createStatementではなくprepareStatementを使用する
このルールは、java.sql.ConnectionインターフェイスのcreateStatement()メソッドが使用されている場合に違反をレポートします。createStatementが使用されている箇所を検出し、prepareStatementに変更すべきかどうかを検討したい場合、このルールを使うと便利です。

Jtestが検出する脆弱性(抜粋)一覧

※ セキュリティルール及びセキュリティコンプライアンス規約セットによる静的解析には「セキュリティコンプライアンスパック」のライセンス(有償)が必要です。

Java対応静的解析・単体テストツール Jtestに
関するお問い合わせ

  • テクマトリックス株式会社
    東京本社

    ソフトウェアエンジニアリング事業部

    03-4405-7853

メールでのお問い合わせ
parasoft-info@techmatrix.co.jp

CONTACT

製品についてやテクマトリックスについてなど、
こちらよりお気軽にお問い合わせいただけます。