ارتقای نقش کاربر از طریق پارامتر اضافی role در فرم ثبتنام
چگونه ارسال یک فیلد اضافه در بدنهی درخواست، یک مدل را فراتر از فیلدهای مورد انتظار فرم پر میکند.
وقتی یک مدل (مثل در Laravel Eloquent یا هر ORM مشابه) بدون تعریف دقیق $fillable یا $guarded، مستقیماً از کل ورودی درخواست پر شود (مثل User::create($request->all()))، مهاجم میتواند با افزودن یک فیلد اضافه مثل role=admin یا is_admin=1 به بدنهی درخواست ثبتنام (که فرم ظاهری چنین فیلدی ندارد)، مقدار آن را مستقیماً تغییر دهد.
نحوهی شناسایی
- درخواستهای POST/PUT ثبتنام یا ویرایش پروفایل را در Burp Repeater بگیرید.
- فیلدهای احتمالی حساس (role، is_admin، balance، verified) را اضافه و پاسخ/رفتار بعدی را بررسی کنید.
راهحل
همیشه یک allowlist دقیق از فیلدهای قابلپذیرش (fillable) تعریف شود؛ هرگز کل بدنهی درخواست مستقیماً به یک مدل پاس داده نشود.