اجرای کد جاوا اسکریپت بااستفاده از پی دی اف آلوده
گاهی یک قابلیت معمولی مثل آپلود فایل در بخش پشتیبانی، در ظاهر کاملاً بیخطر به نظر میرسد. اما در یکی از بررسیها، همین قابلیت تبدیل به سرنخی برای یک زنجیره جالب شد.
اکثراً تصور به این شکل است که اجرای کد جاوااسکریپت محدود به فایلهای HTML، JS و یا SVG میباشد، ولی فایلهای PDF هم میتوانند منجر به XSS شوند و اکسپلویت خاص خودشان را دارند.
در یکی از بررسیها، قابلیت آپلود فایل در بخش پشتیبانی یک پلتفرم را بررسی میکردم. چیزی که توجه من را جلب کرد این بود که فایل PDF آپلودشده بدون تغییر خاصی روی سرور ذخیره میشد و بعداً از طریق یک لینک قابل دسترسی بود.
مرحله بعد، آزمایش یک PDF دستکاریشده بود که داخل ساختار خودش Actionهای مربوط به JavaScript داشت. نتیجه جالب بود: با باز شدن فایل در مرورگر، کد تعبیهشده اجرا میشد و امکان نمایش پنجرههای جعلی و دریافت اطلاعات واردشده توسط کاربر وجود داشت.
نکته مهم این بود که فایل روی دامنهای مرتبط با همان سرویس قرار داشت و لینک آن هم قابل اشتراکگذاری بود. بنابراین مسئله فقط «آپلود یک فایل مخرب» نبود؛ فایل میتوانست به یک محتوای فعال تبدیل شود که در سناریوهای واقعی، مخصوصاً برای صفحات پشتیبانی و کاربران داخلی، قابل سوءاستفاده باشد.
تاثیر
بسته به اینکه چه کسی فایل را باز کند، این رفتار میتوانست برای فیشینگ، جمعآوری اطلاعات ورود و در سناریوهای زنجیرهای، رسیدن به دسترسیهای حساستر استفاده شود.
اکسپلویت
برای بررسی این موضوع، یک فایل PDF دستکاریشده ایجاد کردم که داخل آن یک OpenAction حاوی JavaScript قرار داشت. با باز شدن PDF، اسکریپت اجرا میشد و دو پنجره ورود جعلی نمایش داده میشد.
برای شبیهسازی سناریوی واقعی، PDF دارای دو فیلد برای ایمیل و رمز عبور بود و اطلاعات واردشده پس از تعامل کاربر، از طریق قابلیت SubmitForm به یک سرور خارجی ارسال میشد.
نکته مهم این بود که فایل پس از آپلود بدون تغییر روی زیردامنه سرویس ذخیره میشد و لینک آن نیز قابل اشتراکگذاری بود. در نتیجه، مهاجم میتوانست بهجای ارسال یک فایل مشکوک، لینکی از یک فایل قرارگرفته روی دامنه خود سرویس را برای قربانی ارسال کند.
چرا Cookie را نمیتوان مستقیماً از این طریق خواند؟
اجرای JavaScript داخل PDF به این معنی نیست که اسکریپت همان دسترسیهای JavaScript یک صفحه HTML را دارد. محیط اجرای PDF توسط PDF Viewer کنترل میشود و APIها و محدودیتهای امنیتی مخصوص خود را دارد؛ بنابراین دسترسی مستقیم به مواردی مانند document.cookie و localStorage لزوماً وجود ندارد. از طرف دیگر، Cookieهای دارای ویژگی HttpOnly نیز اصولاً از طریق JavaScript قابل خواندن نیستند.
در این سناریو، اجرای JavaScript داخل PDF با استفاده از قابلیتهای JavaScript مخصوص PDF تأیید شد، اما سرقت Cookie بهعنوان Impact ادعا نشد. Impact قابل اثبات، Credential Harvesting بود؛ به این صورت که کاربر اطلاعات ورود خود را در رابط جعلی وارد میکرد و این اطلاعات به مهاجم ارسال میشد. همین سناریو در PoC نیز بهصورت عملی تأیید شده بود.
راهکار
JavaScript و Actionهای فعال در PDFهای آپلودی باید فیلتر یا غیرفعال شوند و نمایش فایل نیز بهتر است با یک PDF Viewer امن یا بهصورت Preview انجام شود. همچنین نگهداری فایلها روی یک دامنه جدا و با محدودیت مناسب میتواند ریسک اجرای محتوای فعال را کاهش دهد.
در نهایت، این بررسی دوباره یادآوری کرد که برای بررسی XSS نباید فقط به پسوندهای معمول محدود شد؛ گاهی یک PDF هم میتواند نقطه شروع یک سناریوی امنیتی واقعی باشد.
این رایتآپ را خواندید؟ اگر روی پروژه یا پژوهش مشابهی کار میکنید، برای همکاری در تماس باشید.