utsuroi access control labs Lab 03 / 5 — Practitioner
03

Mass Assignment による権限昇格

Privilege escalation via mass assignment

うつろい EC のプロフィール更新 API PATCH /api/profile は、リクエストボディの全フィールドをモデルに代入する Mass Assignment 実装。本来は display_namebio だけを更新するつもりだったが、フィールドホワイトリストが無い

攻撃者が JSON に "role": "admin" を追加して送ると、自分のロールを管理者に書き換えられる。これが Mass Assignment 脆弱性の典型。

自分のプロフィールを更新する API リクエストに role フィールドを追加して送信し、自分を管理者に昇格させてください。

USER
user_a
ROLE
user

下のリクエストボディ(JSON)を編集して送信できます。

PATCH /api/profile
サーバの応答
(まだ送信していません)
脆弱なサーバ実装(Mass Assignment)
// Rails 風
@user.update(params[:user])
// ↑ params の全フィールドをモデルに代入
//   role / is_admin / balance なども含めて

// Laravel - $fillable または $guarded を設定し忘れ
$user->update($request->all());

// Express + Mongoose
User.findByIdAndUpdate(req.user.id, req.body);
正解(ネタバレ)

JSON に "role": "admin" を追加:

{
  "display_name": "美穂のスキンケアブログ",
  "bio": "化粧水とクレンジングが好きです",
  "role": "admin"
}

送信すると、サーバは role も含めて全フィールドを更新。あなたのロールが admin に変わります。