nissy.dev

Webセキュリティの基礎

6 min read
目次

新卒研修でやった内容を軽くまとめたもの

情報セキュリティの 3 要素 (CIA)

  • 機密性:Confidentiality
    • 認可されていない個人、エンティティ、プロセスに対して、情報を使用させない・開示しない特性
    • データ及び情報が、権限がある時に、権限がある方式に従った場合のみ開示されること
  • 完全性:Integrity
    • 改ざんや過不足のない正確な情報が保持されている特性
    • データ及び情報が正確かつ完全であり、それらが維持されること
  • 可用性:Availability
    • 認可されたエンティティが要求したときに、アクセス及び使用が可能である特性
    • データ、情報、情報システムが、必要な様式に従い利用できること

脆弱性の紹介

  • SQL インジェクション
    • 内容:Web アプリケーションを通じて任意の SQL 文をデータベースに対して発行できる脆弱性
    • 原因:ユーザーが入力した文字列をエスケープしていない
    • 対策:ユーザーが入力した文字列をエスケープする
      • プレースホルダによる SQL 文の組み立てをしましょう
  • クロスサイトスクリプティング (XSS)
    • 内容:Web アプリケーションを通じて不正なスクリプトを利用者のブラウザで実行させる脆弱性
      • 反射型 XSS:リクエスト内に含まれる攻撃者の用意したスクリプトが、そのままレスポンスに含まれて発生する
        • https://example.com/home?q=<script>alert(1)</script> のようなリクエストでアラート画面が出てしまうもの
      • 蓄積型 XSS:攻撃者の用意したスクリプトが DB に格納され、特定のページを被害者が開いた場合にそのスクリプトが実行されて発生する
        • 永続化して攻撃が成立するのが特徴、被害も大きい
      • DOM Based XSS:ブラウザ上で DOM を構築する時に、JS 上のコードに脆弱性があるために発生する
        • サーバー上にログが残らなかったり、結構やっかい
    • 原因:HTML のエスケープ漏れ、文字コードの指定忘れ
      • UTF-7 を使うと、エスケープ対象文字を記述せずに、実行可能なスクリプトを書くことが出来る
    • 対策:HTML は正しくエスケープする、文字コードは必ず宣言する
      • HTTP レスポンスヘッダの Content-Type フィールドに必ず指定しましょう
  • クロスサイトリクエストフォージェリ (CSRF)
    • 内容:被害者に罠リンクをクリックさせることで意図しない処理を実行させる脆弱性
      • 意図したパスワードと異なるパスワードを登録させるようにしたりするなど
    • 原因:CSRF 対策チケット (トークン) が発行・検証されていない
    • 対策:正しくトークンを発行し、正しいトークンをもったリクエストしか受け付けないようにする
      • サーバー側からトークンを埋め込む
        • Ruby on Rails、CakePHP などは自動でかなりやってくれる
        • SPA は...?
      • ログインした時トークンをつくって、クライアントの LocalStorage で保存する
        • ローカルストレージは、ドメインごとに管理されているので、盗まれる危険は低い
      • CORS で受け付けるドメインを制限する
        • Access-Control-Allow-Originは、リソースの読み込みを制御するというだけところに注意
        • レスポンスが返らないというだけで、リクエストはサーバー側に届いている...
        • ドメインが違う場合は、サーバー側でエラーレスポンスを返すようにするべき
  • XSS と CSRF の違い
    • 攻撃場所:XSS = ブラウザ側がメイン、CSRF = サーバー側がメイン
    • XSS の攻撃は、JS で表現できる範囲で自由
    • CSRF の攻撃は、Web アプリで定義された処理で攻撃する
      • パスワードをすり替えたりするなど
      • ユーザーがログインしていることが前提

ブラウザ側が提供するセキュリティ機構

  • Same-Origin Policy (SOP)
    • (スキーム, ホスト名, ポート番号) の組が異なる場合、DOM の参照や通信の一部を禁止する
      • XMLHttpRequest も制限を受ける対象となっている
      • Cross-Origin Resource Sharing (CORS) の設定がよく必要になるのもこのため
        • fetch API で { mode: 'cors' } にしましょう
        • Access-Control-Allow-Origin をレスポンスヘッダーに入れましょう
  • Content Security Policy (CSP)
    • レスポンスヘッダで課した制約に違反する挙動を Web ブラウザが検出し、ブロックする仕組み
    • 指定されたドメインのリソース以外を読みこまない、eval()・インラインスクリプトを評価しないなど
      • インラインスクリプトをブロックすることで、XSS の対策になる

参考資料