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 編
機能マッピング
- Swagger / Burp でエンドポイント一覧化
権限分けたトークン用意
user_jwt
,admin_jwt
を別ファイル保存
- Burp Repeater で差し替え
GET /api/admin/users
Authorization: Bearer user_jwt ←低権限で試す
レスポンス比較
- 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, (^^ゞ