محققان امنیتی مؤسسه SBA Research دو آسیبپذیری XSS (Reflected XSS) را در فریمورکLaravel کشف کردهاند. این آسیبپذیریها که تحت شناسههای CVE-2024-13918 و CVE-2024-13919 ثبت شدهاند، نسخههای 11.9.0 تا 11.35.1 لاراول را تحت تأثیر قرار داده و میتوانند به مهاجمان اجازه دهند کد جاوااسکریپت دلخواه را در مرورگر کاربران اجرا کنند.
حملات XSS بازتابی زمانی رخ میدهند که مهاجم کد مخربی را به یک وبسایت تزریق کرده و این کد بدون پردازش صحیح به کاربر در وبسایت نشان داده میشود. اگر کاربر روی لینکی که حاوی کد مخرب است کلیک کند، مرورگر این کد را اجرا کرده و ممکن است اطلاعات حساسی مانند کوکیها، توکنهای نشست(session tokens) و سایر دادههای مهم را سرقت کند.
جزئیات آسیبپذیریها CVE-2024-13918 و CVE-2024-13919
این آسیبپذیریها ناشی از کدگذاری نامناسب پارامترهای درخواست (Request Parameters) و پارامترهای مسیر (Route Parameters) در صفحه خطای حالت دیباگ هستند.
هنگامی که حالت دیباگ فعال(APP_DEBUG=true) باشد و برنامه وب با خطای HTTP از سری 5XX مواجه شود، یک صفحه خطا به کاربر نمایش داده میشود. این صفحه شامل اطلاعاتی درباره درخواست ارسالشده است که موجب بروز خطا شده است. مشکل اصلی همانطور که گفته شد این است که مقادیر موجود در پارامترهای URL و بدنه درخواست بدون کدگذاری مناسب در صفحه خطا نمایش داده میشوند. در نتیجه، مهاجم میتواند کد مخربی را تزریق کند که در مرورگر قربانی بازتاب شده و اجرا شود.
نمونه کد آسیبپذیر
قطعه کد زیر نشان میدهد که مقادیر ورودی در صفحه خطا بدون انجام کدگذاری HTML مناسب نمایش داده میشوند. (Templating Engine) کدگذاری HTML را برای دادههایی که از طریق {!! !!} ارسال میشوند، غیرفعال میکند:
{!! $exception->requestBody() ?: 'No body data' !!}
اثبات مفهوم (PoC)
پیشنیازها:
- فعال کردن حالت دیباگ: ابتدا مطمئن شوید که مقدار APP_DEBUG=true در فایل .env تنظیم شده است.
- ایجاد یک اندپوینت که خطا ایجاد کند: بهعنوان مثال، میتوان یک تابع ایجاد کرد که تقسیم بر صفر انجام دهد.
مراحل سوءاستفاده از آسیبپذیری ها
مهاجم برای اکسپلویت این آسیبپذیری باید کاربر را فریب دهد تا روی یک لینک مخرب کلیک کند. این لینک حاوی یک پیلود ویژه است که کد جاوااسکریپت را در پارامترهای آسیبپذیر تزریق میکند. پس از کلیک کاربر، مرورگر این کد را اجرا کرده و ممکن است کنترل حساب کاربری وی در سایت هدف را در اختیار مهاجم قرار دهد یا دادههای حساس وی را سرقت کند.
در این مثال، برنامه تحت آدرس http://localhost:8000 اجرا میشود. مهاجم میتواند لینک مخربی ایجاد کند که یک کد جاوااسکریپت را در پارامترهای درخواست تزریق کند. لینک مخرب:
http://localhost:8000/poc-url?payload=
هنگامی که این لینک توسط قربانی کلیک شود، تابع poc-url اجرا شده و خطای تقسیم بر صفر رخ میدهد. سرور وب با خطای 500 (Internal Server Error) پاسخ میدهد. صفحه خطا تولید شده و کد HTML زیر را در خروجی نمایش میدهد:
{
"payload": ""
}
مقدار Payload در پاسخ سرور بدون کدگذاری مناسب نمایش داده میشود. در نتیجه مرورگر کد جاوااسکریپت را تفسیر کرده و اجرا میکند و یک پیام هشدار (alert(1)) در مرورگر قربانی ظاهر میشود.
توصیههای امنیتی
این آسیبپذیریها به لاراول گزارش شدهاند و در نسخه 11.36.0 اصلاح شدهاند. به کاربران لاراول توصیه میشود که هرچه سریعتر نسخه خود را بهروزرسانی کنند تا خطرات این آسیبپذیریها کاهش یابد.
در صورتی که ارتقا به نسخه جدید ممکن نباشد، کاربران میتوانند با تغییر مقدار APP_DEBUG=false در تنظیمات خود، حالت دیباگ را غیرفعال کنند.