Webアプリケーションの攻撃対策
Webアプリケーションの攻撃対策は、利用者からの入力値を信用せずに検査と加工を行い、OSコマンドインジェクション、クロスサイトスクリプティング(XSS)、セッションの乗っ取りなどの攻撃を成立させない実装を基本とする。加えて、WAF(Web Application Firewall)のような外部の防御機構を組み合わせ、多層的に防ぐことが求められる。攻撃の仕組みごとに有効な対策が異なるため、どの段階で何を防ぐのかを区別して理解することが重要である。
入力値の扱いと注入型攻撃
OSコマンドインジェクションは、利用者の入力がOSのコマンドの一部として解釈されることで、意図しないコマンドが実行される攻撃である。その対策として、シェルを起動できる言語機能を利用する実装を避けることが挙げられる。 入力値をSQL文の構造と分けて扱うプレースホルダは、SQLインジェクションへの対策であり、OSコマンドインジェクションへの対策ではない。
ファイル名にディレクトリが含まれないかを確認する処理は、意図しないパスへのアクセスを防ぐ対策である。OSコマンドインジェクションを防ぐ直接の手段ではないため、用途を混同しないことが必要である。また、直接メモリにアクセスできる機能を避けることは、メモリ破壊などへの対策に関係するものであり、シェルの解釈を防ぐ対策とは別物である。
クロスサイトスクリプティングへの対策
クロスサイトスクリプティングは、悪意のあるJavaScriptコードなどを含むデータがWebページに混入し、そのページを閲覧した利用者のブラウザで実行される攻撃である。 典型的な手口は、フォームの入力フィールドに悪意のあるスクリプトを含むデータを入力し、それがページに出力されることで実行させるものである。
対策の要は出力時の処理にある。利用者が入力した文字列をWebページに出力する際、タグやスクリプトとして解釈されないよう、HTMLエスケープなどの処理を施す。 HTML本文では「<」を「<」に変換するといった処理により、入力内容がブラウザで命令として扱われなくなる。入力データのサイズを制限する処理は、過大なリクエストによる負荷を抑える効果はあるが、スクリプトとして解釈される問題の原因を取り除くものではない。
大量のデータでバッファ領域の上限を超えさせる攻撃はバッファオーバーフローであり、スクリプトを混入させるXSSとは攻撃の性質が異なる。 URLやパス名を推測して制限されたページへ直接アクセスする手口も、XSSではなくアクセス制御の回避として区別する必要がある。
セッション管理とログアウト時の処理
セッションの乗っ取りは、攻撃者が正規利用者のセッションIDを入手し、その利用者になりすましてアクセスする攻撃である。ログアウト時にWebサーバでセッションIDを無効にすれば、そのIDを第三者が入手しても、以後のアクセスを認証済みとして扱わなくなり、乗っ取りの機会を減らせる。
この節の続き
- WAFの役割と限界
- 試験で問われやすい区別
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む