Shikata Ga Nai

Private? There is no such things.

第34回:権限昇格(特権取得)とは?どう見つける?

Hello there, ('ω')ノ

1. 権限昇格とは?

区分 説明
縦(Vertical) 低権限 → 高権限へ 一般ユーザ → 管理者
横(Horizontal) 同レベル間だが他人のリソースへ ユーザ A → ユーザ B の情報

どちらも 「本来できない操作ができる」 点が共通。 バグバウンティでは Critical/High 判定になる花形バグです。


2. よくある原因とチェックリスト

原因 簡易テスト例 補足
IDOR(パラメータ改ざん) user_id=10 → 11 API “/admin=1” なども要確認
ロール判定がフロントのみ DevTools で role: "admin" に書換 JWT の payload 偽装も同様
機能単位の認可漏れ 一般ユーザで /admin/report.csv 直叩き 403 でなく 200 ならアウト
不完全な入力検証 group_id=-1 で全体一覧取得 “0” や “*” も試す
CSRF + 認可欠如 CSRF で isAdmin=true 更新 重要操作に token 無いか確認

3. 実践ステップ:API 編

  1. 機能マッピング

    • Swagger / Burp でエンドポイント一覧化
  2. 権限分けたトークン用意

    • user_jwt, admin_jwt を別ファイル保存
  3. Burp Repeater で差し替え
   GET /api/admin/users
   Authorization: Bearer user_jwt   ←低権限で試す
  1. レスポンス比較

    • 200/JSON なら縦昇格
    • 403 でもエラーメッセージでヒント出ることあり

4. 実践ステップ:Web UI 編

4.1 フロント側チェック

  • HTML/JS 内に隠しリンク
  <!--   <a href="/admin">Admin Panel</a>   -->

→ コメントアウトでも URL だけ抽出して叩く

4.2 Cookie/JWT 書き換え

localStorage.setItem('role','admin')
document.cookie="role=admin"

リロードでメニュー出現→縦昇格成功


5. PoC 作成テンプレ

1) 一般ユーザでログイン
2) /api/admin/users を F12 で直接リクエスト
3) 200 OK & 全ユーザ情報JSON が返る

影響:
- 認証を迂回し機密情報取得
- 管理者機能全操作可能(ユーザ削除・権限変更)

修正案:
- サーバ側で JWT の role を強制検証
- 重要エンドポイントへ RBAC ミドルウェア適用

添付

  • ① user JWT (redacted)
  • ② Burp リクエスト/レスポンス
  • ③ 画面スクショ

6. 防御ベストプラクティス

レイヤ 施策
API ミドルウェアで サーバ側 RBAC 徹底
DB tenant_id カラムで必ずスコープ絞り込み
JWT alg=none 禁止、署名・失効期限必須
ログ 403/401 を監視 → 多発でアラート
テスト 自動化ツール(Nuclei AuthZ テンプレ)+手動確認

7. 便利ツールメモ

用途 ツール 使い方
自動権限テスト Autorize (Burp拡張) High/Low トークンを設定→自動差し替え
JWT 編集 JWT Editor (Burp) payload デコード&書換→再署名
RBAC ルールLint OPA / Rego opa test でポリシー自動検証

まとめ:「権限を横と縦に揺さぶる」のがコツ

  • ロール別トークンで API 全エンドポイント を一気差し替え
  • UI に頼らず 直リンク+パラメータ改ざん を習慣化
  • 修正提案まで添えると、企業側も即対応→報酬もスムーズ

“できないはず” を疑う視点が、 Critical バグ発見→高バウンティ への近道です!

Best regards, (^^ゞ