はまやんはまやんはまやん

hamayanhamayan's blog

CTFのWebセキュリティにおける認証認可まわりまとめ(Cookie/Session、Authentication/Authorization、JWT、IDOR, TOTP, OAuth)

この記事はCTFのWebセキュリティ Advent Calendar 2021の3日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

Cookie

Authentication/Authorization

  • 認証と認可は違うので注意
  • IDOR
    • 認可確認不足があり、とあるリソースを見れてはいけない人が見れてしまう状態になっていること
    • CTFでよくあるのはSQLiteのDBファイルが見れてしまったり、ログファイルが見れてしまったりする
    • 例外のダンプはIDORに入るんだろうか?misconfigurationと言えばそうなのだが、IDORとも言えるのか?

Basic認証まわり

  • Basic認証
    • Basic認証をかけたいフォルダに以下を配置
    • パスワードが暗号化してある場合
      • e.g. admin:$apr1$1U8G15kK$tr9xPq8gjidsrw9e パスワードクラックできる可能性がある
  • Digest認証
    • nonceとかハッシュとかを使う
  • Mutual認証
    • Webブラウザとサーバが相互認証を行う(サーバがクライアントを検証するだけじゃない)

JWT

  • JSONをベースとしたトーク
    • より細かくはRFCを読むほうがいい
    • JOSE: Javascript Object Signing and Encryption
    • JWTはJWSかJWEを使うことができる
      • 署名付きデータの場合はJWS
      • 暗号化する場合はJWE
  • とりあえずJWTの中身を見るときはJSON Web Tokens - jwt.ioを使っている人が多いイメージ。単なるbase64なのでデコードして読んでも良い
  • 攻撃方法
      - アルゴリズムをnoneにすることで検証を回避する
      - JWTの署名アルゴリズムをnoneにすることで、署名アルゴリズムをトークンから取得するような実装をしているサービスで検証を回避できる。pyjwtを使って、生成するのが簡単。
      - `eyXXXXXXXXXXXXXXX.eyXXXXXXXXXXXXX.`みたいなのを最終的に投げる
      - [CTFtime.org / H@cktivityCon 2021 CTF / SpiralCI](https://ctftime.org/task/17330)
    

OAuth

MFA/TOTP/TOTP

OTP

TOTP

  • 秘密鍵だけを共有して、二者間でトークンの生成と検証を行う
  • 手順
    1. サーバサイドで秘密鍵を作成し、otpauth://を使って生成器(クライアントサイド)に秘密鍵情報を送る (大体はQRコードを使う)
    2. クライアントサイドで秘密鍵と時間を元にトークンを生成する
    3. それをクライアントが入力
    4. サーバサイドは、秘密鍵トークンと時間を元に正しさを検証する
  • クライアントサイドとサーバサイドは完全に独立しているので、秘密鍵と時間だけを使ってOTP認証を実現する
    • 時間は同じ時間であればいいので、秘密鍵だけ特定できれば、トークンは容易に作れる
  • 秘密鍵からトークンを発行する
    • TOTP Generator
    • oathtool --base32 --totp <SECRET>
      • otpauth://のsecretを入れる
  • otpauth://totp/[ユーザー名]?secret=[秘密鍵]&issuer=[発行者]
    • &issuerは任意
  • できる対策/注意点
    • 秘密鍵をクライアントサイドが紛失した場合はどうするか
    • サーバの時刻は正確に(NTP)
    • 秘密鍵を送るときのresponseをキャッシュされないようにする(文字列とかQR画像とか)
    • 試行回数制限がついているか(総当たり対策)
    • 使用できるトークンについては少し前と少し先のトークンも利用できるようになっているので少し注意
    • 使用済みのTOTPは使えないようにする(再送攻撃対策)
      • 使用済みのTOTPの保存はユーザーID毎に管理すること(セッションとかだと消えちゃう)

SMS

WebAuthn

  • FIDO Allianceという認証機能のプロバイダーが提唱している規格
  • FIDO: Fast IDentity Online
    • 生体認証を簡単に利用できる
    • 生体情報がネットワーク上を流れない
      • 端末で処理して認証サーバから受け取ったチャレンジに応答するだけ

IDOR: Insecure Direct Object Reference