ハルの読書と勉強録

読書の記録や勉強の覚書です。

【勉強録】Webアプリケーションの脆弱性と対策

Webアプリケーションの主要な脆弱性と対策について学習したため記事にしました。 攻撃の概要・怖さ・実装における対策についてまとめています。

参考書籍

プロになるためのWeb技術入門

目次

1. SQLインジェクション
2. クロスサイトスクリプティング(XSS)
3. セッションハイジャック
4. クロスサイトリクエストフォージェリ(CSRF)
5. 強制ブラウズ
6. ディレクトリトラバーサル

SQLインジェクション

概要

Webフォームなどの入力インターフェイスを利用して、データベースに発行されるSQLを変更することで、情報の不正取得や改ざんを行う。

怖さ

  • 例えばWHERE句に「or 1=1」の条件を設定されると、すべてのレコードが取得できたり、ログイン判定によってはパスワードに関わらずログインできる可能性がある
  • 応用でユーザーアカウント作成や通常操作では取得できない情報を表示できるなどの恐れがある
  • インターネットを介して世界中から攻撃可能
  • 被害者が情報流出に気付きにくい

対策

クロスサイトスクリプティング(XSS)

概要

HTMLの中に悪意のあるJavaScriptを埋め込んで動作させる。JavaScriptインジェクションとも。

怖さ

  • クッキーの盗難やページ改竄などによる、不正ログインや情報流出
  • XSSが可能なサイトが踏み台にされ、加害者に加担する恐れがある

対策

  • HTMLへ文字列出力をする際に、サニタイジング(Sanitizing)を行う
    • HTML構造を変化させることができる記号などの文字列を削除したり、無害な文字列に置き換える
    • 実行環境やプレゼンテーション層を扱うフレームワークで機能提供されていることが多い
    • 入力チェックでシステムが受け付ける文字列を絞り、出力時に出力対象に応じてサニタイジングを行うのが良い
      • サニタイジングによってサーバーが受け取る情報が変化することがバグになることがあるため

セッションハイジャック(Session Hijack)

概要

クライアントとサーバー間でやりとりされているセッションIDを盗み取り、利用者になりすましてサービスを利用する。

怖さ

  • ユーザーの有効なセッションIDが盗まれて利用され、そのユーザーとしてサービスを利用できると、情報流出や不正利用につながる

対策

以下すべての実施が望ましい。

  • クロスサイトスクリプティング対策
  • SSL
    • 通信路を暗号化してセッションIDの盗難を防ぐ
  • セッション・タイムアウト時間の変更
    • セッション・タイムアウト時間を短めに設定する
      • セッション情報は明示的に破棄されない限り、タイムアウト発生までサーバー側に残るため、セッションIDを盗まれた際に悪用される危険性を減らすことができる
    • ただし、操作性を損ねる可能性があるため、安全性とのバランスを考慮する
  • セッションIDのランダム化
    • 十分大きな桁数の数字の中からランダムにセッションIDが選択されるようにする
    • 通常はPHPなどの言語処理系やアプリケーションサーバーによって実現されているため、これらを利用する限りは問題ない

クロスサイトリクエストフォージェリ(Cross Site Request Forgery):CSRF

概要

攻撃者が捏造したフォームから強制的に情報をサブミットさせ、被害者のアカウントで意図しない投稿や買い物などをさせる。

怖さ

  • 利用にログインが必要なサイトでも、被害者がログイン状態であれば実行可能である
    • JavaScriptでHTMLのonLoad属性にSNSへのサブミットを仕込むなど

対策

  • ワンタイムトークン(One-time Token)を利用して自分のサーバーからのサブミットなのかをチェックする
    1. アプリケーションサーバーでワンタイムトークン(ランダムに生成された文字列)を生成して記憶する
    2. ブラウザへ返すフォームのhidden属性にワンタイムトークンを埋め込む
    3. ブラウザのサブミット時にhidden属性のワンタイムトークンを一緒に送信する
    4. リクエストを受け取ったサーバーが保存したワンタイムトークンとリクエストのワンタイムトークンを照合し、一致した場合のみサブミットを受け入れる

強制ブラウズ

概要

WebブラウザのアドレスバーにURLを直接入力して、本来表示されない画面を表示する。

怖さ

  • 例えばログイン成功後にしか表示されない画面にアクセスできる場合がある
  • 悪意なくユーザーがブックマーク登録などからアクセスする場合もある
  • Webサーバ設定によっては、存在しないファイルへのアクセス時にディレクトリのファイル一覧を表示する機能(インデックス表示機能)があり、有効になっている場合は別ファイルを強制ブラウズされる危険がある

対策

  • どのような画面でも必ずログイン状態をチェックして、未ログインであればログイン画面に戻す
  • Webサーバーのインデックス表示機能などは無効化しておく

補足

JavaScriptによるアドレスバー非表示はブラウザ設定で無効化できるため対策とならない。

ディレクトリトラバーサル(Directory Traversal)

概要

リクエストで渡された文字列を使ってファイル表示などを行う仕組みを悪用して、意図的に本来表示や取得ができないサーバー内のフォルダやファイルの表示や取得、操作を行う。

怖さ

  • サーバーのユーザーパスワードなどを閲覧される危険性がある
    • 多くの言語で文字列終端を意味する「\0」を埋め込んで以降の文字を認識されなくして(ヌルバイト(Null byte)攻撃)、実行されるケースもある

対策

  • ユーザーから入力されたパラメーターをファイル名として使用しない設計にする
    • 最も有効
  • SQLインジェクション対策
  • Webアプリケーションの専用実行ユーザーを作成し、関連ファイル以外は閲覧できないよう権限設定を行う