【勉強録】Webアプリケーションの脆弱性と対策
Webアプリケーションの主要な脆弱性と対策について学習したため記事にしました。 攻撃の概要・怖さ・実装における対策についてまとめています。
参考書籍
目次
1. SQLインジェクション
2. クロスサイトスクリプティング(XSS)
3. セッションハイジャック
4. クロスサイトリクエストフォージェリ(CSRF)
5. 強制ブラウズ
6. ディレクトリトラバーサル
SQLインジェクション
概要
Webフォームなどの入力インターフェイスを利用して、データベースに発行されるSQLを変更することで、情報の不正取得や改ざんを行う。
怖さ
- 例えばWHERE句に「or 1=1」の条件を設定されると、すべてのレコードが取得できたり、ログイン判定によってはパスワードに関わらずログインできる可能性がある
- 応用でユーザーアカウント作成や通常操作では取得できない情報を表示できるなどの恐れがある
- インターネットを介して世界中から攻撃可能
- 被害者が情報流出に気付きにくい
対策
- 入力チェックの実装
クロスサイトスクリプティング(XSS)
概要
HTMLの中に悪意のあるJavaScriptを埋め込んで動作させる。JavaScriptインジェクションとも。
怖さ
- クッキーの盗難やページ改竄などによる、不正ログインや情報流出
- XSSが可能なサイトが踏み台にされ、加害者に加担する恐れがある
- 脆弱性のあるサイトに対するGETリクエストを仕込んだリンクを用意し、リンクをクリックしたユーザーのクッキー内容を盗み、セッションハイジャックなどにつながる
対策
- HTMLへ文字列出力をする際に、サニタイジング(Sanitizing)を行う
セッションハイジャック(Session Hijack)
概要
クライアントとサーバー間でやりとりされているセッションIDを盗み取り、利用者になりすましてサービスを利用する。
怖さ
- ユーザーの有効なセッションIDが盗まれて利用され、そのユーザーとしてサービスを利用できると、情報流出や不正利用につながる
対策
以下すべての実施が望ましい。
- クロスサイトスクリプティング対策
- セッションハイジャックの手段で最も多いのがXSSであるため
- SSL
- 通信路を暗号化してセッションIDの盗難を防ぐ
- セッション・タイムアウト時間の変更
- セッションIDのランダム化
- 十分大きな桁数の数字の中からランダムにセッションIDが選択されるようにする
- 通常はPHPなどの言語処理系やアプリケーションサーバーによって実現されているため、これらを利用する限りは問題ない
クロスサイトリクエストフォージェリ(Cross Site Request Forgery):CSRF
概要
攻撃者が捏造したフォームから強制的に情報をサブミットさせ、被害者のアカウントで意図しない投稿や買い物などをさせる。
怖さ
- 利用にログインが必要なサイトでも、被害者がログイン状態であれば実行可能である
- JavaScriptでHTMLのonLoad属性にSNSへのサブミットを仕込むなど
対策
- ワンタイムトークン(One-time Token)を利用して自分のサーバーからのサブミットなのかをチェックする
強制ブラウズ
概要
WebブラウザのアドレスバーにURLを直接入力して、本来表示されない画面を表示する。
怖さ
- 例えばログイン成功後にしか表示されない画面にアクセスできる場合がある
- 悪意なくユーザーがブックマーク登録などからアクセスする場合もある
- Webサーバ設定によっては、存在しないファイルへのアクセス時にディレクトリのファイル一覧を表示する機能(インデックス表示機能)があり、有効になっている場合は別ファイルを強制ブラウズされる危険がある
対策
- どのような画面でも必ずログイン状態をチェックして、未ログインであればログイン画面に戻す
- Webサーバーのインデックス表示機能などは無効化しておく
補足
JavaScriptによるアドレスバー非表示はブラウザ設定で無効化できるため対策とならない。
ディレクトリトラバーサル(Directory Traversal)
概要
リクエストで渡された文字列を使ってファイル表示などを行う仕組みを悪用して、意図的に本来表示や取得ができないサーバー内のフォルダやファイルの表示や取得、操作を行う。
怖さ
- サーバーのユーザーパスワードなどを閲覧される危険性がある
- 多くの言語で文字列終端を意味する「\0」を埋め込んで以降の文字を認識されなくして(ヌルバイト(Null byte)攻撃)、実行されるケースもある
対策
- ユーザーから入力されたパラメーターをファイル名として使用しない設計にする
- 最も有効
- SQLインジェクション対策
- サニタイジングでファイル名に使用しない文字を削除など
- Webアプリケーションの専用実行ユーザーを作成し、関連ファイル以外は閲覧できないよう権限設定を行う