Jtest Security-Java対応ソースコードセキュリティ検証ツール-
SQLインジェクション
SQLインジェクションは、ユーザの入力データを使用してSQL文を生成するWebアプリケーションの脆弱性を利用し、本来意図されたものとは異なるSQLを実行させ、権限のないデータの取得やデータ破壊などの不正なDB操作を行うセキュリティ攻撃です。
ログイン フォームに入力されたユーザIDとパスワードでユーザを認証するアプリケーションがあるとします。
ここで攻撃者がユーザIDとして「myid」、パスワードとして「>pass’ OR ’a’=’a」を入力すると、結果として次のクエリーが発行されます。
ORから後が常に真であるため、すべてのレコードがWHERE句の条件に該当するようになり、不正なパスワードでも認証されてしまいます。
そのほかに、DELETE文によるデータの削除、テーブル名やカラム名といったスキーマ情報の取得などの不正操作が行われるケースもあります。

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

ORから後が常に真であるため、すべてのレコードがWHERE句の条件に該当するようになり、不正なパスワードでも認証されてしまいます。
そのほかに、DELETE文によるデータの削除、テーブル名やカラム名といったスキーマ情報の取得などの不正操作が行われるケースもあります。
対策
SQLインジェクションに対する防御策としては、入力値を検証してSQL中で意味を持つメタ文字を適切にエスケープすることや、プリペアド ステートメントの使用が有効です。
上の例をプリペアド ステートメントを使用するよう変更すると、次のようになります。
プレースホルダ「 ? 」で表されるパラメータは常に文字列として解釈されるため、入力データがSQL文の一部として扱われることはありません。
そのほかに、攻撃者に手がかりを与えないよう、データベースからの詳細なエラーメッセージをユーザに表示しない、また必要最小限の権限でデータベース操作を行うといった対策も挙げられます。
上の例をプリペアド ステートメントを使用するよう変更すると、次のようになります。

プレースホルダ「 ? 」で表されるパラメータは常に文字列として解釈されるため、入力データがSQL文の一部として扱われることはありません。
そのほかに、攻撃者に手がかりを与えないよう、データベースからの詳細なエラーメッセージをユーザに表示しない、また必要最小限の権限でデータベース操作を行うといった対策も挙げられます。
Jtest Securityのルール
- チェックできる入力データ
- リモート メソッドおよびエントリ ポイント メソッドのパラメータ
- ネイティブ メソッド
- 検証を行っていない 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(...)
- 検証メソッドの指定も可能
- ルールのパラメータでは検証メソッドを指定することも可能です。検証メソッドは、不正な文字を含んでいる可能性のある入力データを受け取り、チェック済みの安全なデータをパラメータまたは戻り値として返すメソッドです。検証メソッドをパラメータで指定しておくと、チェック済みのデータに対して誤って違反が検出されることがなくなるため、解析結果の精度が向上します。
このルールは、不正な文字を含んでいる可能性のある入力データが、検証メソッドによるチェックを受けないまま出力SQLメソッドに渡されている場合に違反をレポートします。このルールはバグ探偵(フロー解析)ルールなので、入力データの取得と出力が別のメソッドに分かれていたり、複数の実行パスが存在する場合でも、実行パスを辿って違反を検出することができます。
このルールは、java.sql.ConnectionインターフェイスのcreateStatement()メソッドが使用されている場合に違反をレポートします。createStatementが使用されている箇所を検出し、prepareStatementに変更すべきかどうかを検討したい場合、このルールを使うと便利です。
Jtest Securityが検出する脆弱性(抜粋)一覧
- クロスサイト スクリプティング(XSS)
- SQLインジェクション、コマンドインジェクション、XMLインジェクションなどのインジェクション(本ページ)
- HTTPレスポンス分割
- 悪意のあるファイルの実行
- 強制ブラウズ
- 不適切なエラー処理(近日公開予定)
| |||||||||














