چگونه CSP را دور بزنیم؟

چگونه CSP را دور بزنیم؟


سیاست امنیتی محتوا که به اختصار CSP نامیده می‌شود، یک تکنولوژی در مرورگرها و در واقع یک مکانیزم امنیتی است که به جلوگیری از حملاتی مانند XSS کمک می‌کند؛

(مدیران وبسایت‌ها با کمک CSP ، لیستی از منابع مجاز را تولید می‌کنند که مرورگر با استفاده از آن‌ها می‌تواند محتوا‌هایی مثل JS، فایل های CSS، فونت‌ها و ... را در صفحه بارگذاری نماید.)

یک سناریوی معمول برای استفاده از CSP این است که به کمک آن مشخص کنیم عکس‌های وبسایت تنها بتوانند از دامنه فعلی بارگذاری شوند بنابراین هر تگ image ای که به یک منبع خارجی اشاره کند، توسط CSP نادیده گرفته خواهد شد و آن محتوا (تصویر) بارگذاری نمی‌شود.

عمده دلیل استفاده‌ی از تکنیک CSP این است که از اجرای اسکریپت‌های غیرقابل اطمینانِ جاوا اسکریپت جلوگیری و یا تغییرات ناشی از یک اکسپلویت مغایر با CSP (مانند حمله XSS موفق) را به حداقل برساند.

به عنوان مثال خط زیر که تنظیمات CSP را انجام می‌دهد، اجازه لود شدن و اجرای منابعی را می‌دهد که در دامنه محلی (self) قرار دارند:


Content-Security-Policy: default-src ‘self’ ‘unsafe-inline’;


چون در تنظیمات بالا از عبارت unsafe-eval استفاده نشده، بنابراین از اجرای هر تابعی که پارامتر ارسالی به آن یک رشته (String) است-مثل eval،setTimeoutو setInterval-جلوگیری می شود.

علیرغم محدودیت‌های اعمال شده در تنظیمات بالا، می‌توانیم فریم‌ها و تصاویر را بارگذاری کنیم؛ چراکه کلمه 'self' در تنظیمات بالا از کار کردن با منابعی که از قانون Same Origin Policy (SOP) پیروی می‌کنند، ممانعتی به عمل نمی‌آورد.


بیشتر مرورگرهای جدید، فایل‌هایی مثل فایل متنی و تصاویر را به یک صفحه HTML تبدیل می‌کنند، پس باز کردن هر نوع فایلی در مرورگر درون یک iframe بلافاصله آن را به یک صفحه HTML – بدون هیچگونه اعتبارسنجی‌ای – تبدیل خواهد کرد و حالا اگر این فریم در صفحه‌ای از سایت باز شود که سرآیند (Header) مربوط به تنظیمات CSP را ندارد، frame باز شده می‌تواند تمامی اسکریپت‌های js موجود در آن صفحه را اجرا کند.


بنابراین برای ایجاد یک اکسپلویت XSS لازم است تا یک iframe را که به هر مسیری (صفحه‌ای از سایت یا تصویری از سایت مثل آدرس favicon یا فایل‌های CSS و...) که سرآیند تنظیمات CSP در آن وجود ندارد ارجاع دهیم؛ با توجه به این نکته که هر نوع فایلی در مرورگر درون یک iframe بلافاصله به یک صفحه HTML تبدیل می‌‌شود، می‌توانیم سپس با جایگزین کردن محتوای سرآیند این فریم، با اسکریپت دلخواه خود، عمل تزریق را از طریق iframe انجام دهیم.

جهت مطالعه‌ی بیشتر به این لینک سر بزنید: https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa