Jの衝動書き日記

さらりーまんSEの日記でございます。

体系的に学ぶ安全なWebアプリケーションの作り方の読書メモ 第3回 XSS対策まとめ

今回もテーマにそってまとめてみた。テーマはXSS対策。ちなみに本では、VirtualMachineを使ってXSSがあると実際にどうなるかも解説している。閲覧しただけでクッキーが表示されたり、メールが送信されたりとギクリとすること請け合いだ。

XSSとは何か?

クロスサイト・スクリプティングの略称。

罠サイトを正規サイトと同一サイトと何らかの方法で認識させることで、ブラウザが持つ防御手段(同一生成元ポリシー)をすり抜けて受動的攻撃を行う手段のこと。

同一生成元ポリシー(same origin policy)とは?

JavaScriptによるサイトをまたがったアクセスを禁止するセキュリティ上の制限のこと。このため、通常ブラウザは異なるサイトのjavascriptは実行不可としている。

  • 何故必要なのか?
    • javascriptでは別のHTMLページから情報を取得することが可能 → iframeの中の要素等
    • 罠サイトをアクセスした上で、正規サイトにアクセスすると、罠サイト上のjavascriptから正規サイト上の情報が盗まれる
    • 同一生成元ポリシーがあるため、実際は、異なるホストに置かれたjavascriptからのコンテンツに対するアクセスは制限される
  • 同一生成元とどうやって判断する?
    • URL のホスト(FQDN; Fully Qualified Domain Name)が一致している
    • スキーム(プロトコル)が一致している→http,httpsなど
    • ポート番号が一致している
  • 保護対象は?
    • iframe内のドキュメント
    • XMLHttpRequestオブジェクトでアクセスできるURL
  • JavaScriptの読み込み
    • あるドキュメント内でscript src="XXX"と他サイトのJavascriptファイルをロードした場合の扱い
      • 読み込まれたjavascriptファイルは、読み込んだドキュメントのドメインで動作
      • 自分が明示的に読み込んだファイルは同一生成元として扱われる
      • 別サイトから読み込んだjavascriptファイルがCookieにアクセスした場合、対象となるのは別サイトのcookieではなく、読み込んだサイトのもの

XSS脆弱性が発生する理由は?

入力値を元にHTML生成を行う際に、HTMLの文法上特別な意味を持つ特殊記号(メタ文字)を正しく扱っていないため、開発者の意図しない形でHTMLやJavaScriptを注入・変形されると発生する。XSS脆弱性があるサイトは、罠サイトを踏んだ瞬間に情報(セッションID等)を盗み出すことが可能。メールも送れる。

具体的な事例は本を参照。XSS脆弱性があるとクッキーの読み出しなどは簡単にできる。

XSSのポイント

  • 外部入力した文字列は、きちんと文字列として扱うように対処する
  • 外部入力したものを使用する場合、必ず適切なエスケープ処理を行う
  • 外部入力するものは、ただの文字列であるため、制御文字の入力は許されない
  • 制御文字がある場合、エスケープする → 使用目的にあったエスケープ処理を行う(javascipt,htmlでエスケープ処理は異なる)
    •  javasciptのXSS対策は色々メンドイので、動的作成は出来るだけ避けた方が無難
  • HTMLエスケープ
    • 要素の場合:要素中に存在する<と&を文字参照(&lt;等)に変換する
    • 属性値の場合:属性値を””でくくり、属性値中に存在する<,&,"を文字参照に変換する
  • href属性、src属性のXSS
    • url形式に注意
    • 対策
      • httpスキームとhttpsスキームのみ入力として許可するようにする
        • http: または https: で始まる絶対URL
        • スラッシュ「/」で始まる相対URL
      • リンク先のドメインが外部の場合
        • エラーとする
        • 警告するページをクッションとして挟む
  • javascriptの動的生成
    • 外部入力の文字列を使う場合、javascriptとしてのエスケープ処理を行う
    • 特殊な文字(',/など)を¥'などとエスケープする
    • 文字入力するのは原則としてリテラル(ただの文字列)のため、制御文字は許さない → エスケープすればOK
    • エスケープ対象の文字とエスケープ処理
      • \      → \\ 
      • '       → \'
      • "      → \”
      • 改行 → \n
  • script要素のXSS
    • </script><script>悪意のあるスクリプト</script>
    • 一度、スクリプトを強制的に終わらせ、後に悪意のあるものを混入する
    • 対策
      • script要素に渡す時、</という文字列が現れないようにする

補足メモ

  • 受動的攻撃
    • Webサイトの利用者に罠を仕掛けることにより、罠を閲覧したユーザを通してアプリケーションを攻撃する
    • 代表的なもの
      • 単純なもの:罠を仕掛けたサイトを閲覧してマルウェアに感染する
      • 正規サイトを悪用する:正規サイトを改竄して罠を仕掛ける・誘導する
      • サイトをまたがったもの:罠サイト→正規サイト
        • クロスサイト・リクエストフォージェリ(CSRF)
        • クロスサイト・スクリプティング(XSS
        • HTTPヘッダ・インジェクション
  • JavaScript以外のクロスドメインアクセス
    • frame要素とiframe要素
      • javasciptによるクロスドメインのドキュメントにはアクセス不可
    • img要素
      • javascriptはイメージにはアクセス不可
    • css要素
      • 他サイトのものも読み込み可
      • javascript的に特に問題はない→IEにはかつてCSS以外のファイルを読み込んだ場合、そのコードが実行されるという脆弱性があった
    • form要素のaction属性
      • 他のサイトへ送信可能
      • submitへのjavascriptからの制御に関する制限は特にない

参考文献

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践