Bypass ویژگی Content Security Policy در اجرای XSS

در این Write up، تست نفوذگر با شناسایی دو آسیب پذیری XSS در سایت، اقدام به عبور از ویژگی Content Security Policy می نماید.

خلاصه

تست نفوذگر، یک آسیب پذیری XSS را شناسایی می کند ولی پیلودهای رایج XSS برای این تارگت، اجرا نمی گردد. دلیل عدم اجرای این پیلودها، وجود ویژگی Content Security Policy یا CSP می باشد. این ویژگی کدهای جاوا اسکریپت خارجی که همان پیلودهای XSS می باشند را مسدود می نماید.

تست نفوذگر با شناسایی آسیب پذیری XSS در یک Endpoint دیگر(که آن هم از CSP استفاده نموده و کدهای جاوا اسکریپت را مسدود می کند) و ترکیب آن ها با یکدیگر و استفاده از MIME Sniffing اقدام به عبور از محدودیت CSP می نماید.

شناسایی اولین آسیب پذیری XSS

تصویر زیر نشان دهنده، انعکاس مقدار پارامتر name در وب سایت می باشد:

تست نفوذگر به جای مقدار وارد شده، یک پیلود ساده HTML را قرار می دهد که این پیلود اجرا شده و نتیجه آن در صفحه نمایش داده می شود:

در این حالت، آسیب پذیری HTML Injection تایید می شود و در ادامه تست نفوذگر تلاش می کند تا آسیب پذیری XSS را نیز تایید نماید. بدین منظور از پیلود رایج XSS برای نمایش Alert استفاده می کند. در صورتی که هیچ بررسی در ورودی ها انجام نشده و یا WAF برای مقابله با حملات تحت وب در سامانه وجود نداشته باشد، پیلود بدون مشکل اجرا خواهد شد.

جالب به نظر می رسد. پیلود در سایت Inject می شود ولی alert(1) اجرا نمی شود. تست نفوذگر برای بررسی بیشتر این موضوع به سورس صفحه مراجعه می کند و مشاهده می کند که هیچ فیلتری اعمال نشده و حتی بخشی از پیلود هم حذف نشده است:

شناسایی CSP

زمانی که تست نفوذگر در حال بررسی بیشتر سامانه با ابزارهای توسعه مرورگر(Console) بوده، متوجه می شود که ویژگی Content Security Policy منجر به عدم اجرای پیلود XSS شده است.

CSP یک لایه امنیتی اضافه شده است که با قرار گرفتن در هدر HTTP، کدهای خارجی را برای تزریق به یک وب سایت مسدود می کند. معمولا پیاده سازی مناسب CSP تنها اجازه اجرای اسکریپت های داخلی را فراهم می کند (دامنه خود).

در این مرحله، تست نفوذگر ابتدا باید نحوه کار CSP را تشخیص داده و اینکه کدام منبع اجازه بارگذاری و اجرا اسکریپت داخل سایت را دارد.

با دقت به هدر HTTP و بخش Content-Security-Policy، مشخص می شود که قوانین اعمال شده برای این بخش، تنها اجازه اجرای اسکریپت از خود سایت و زیردایرکتوری های آن را می دهد. این موضوع محدودیت زیادی را ایجاد نموده و به نظر می رسد که امکان اجرای کد اسکریپت تست نفوذگر وجود ندارد.

شناسایی آسیب پذیری XSS در Endpoint دیگر

از آن جا که امکان عبور از این ویژگی امنیتی وجود نداشت، تست نفوذگر سعی می کند تا بخش های دیگر را بررسی نموده تا آسیب پذیری های XSS دیگری را شناسایی نماید. وی سورس صفحه اصلی وب سایت را بررسی نموده و متوجه می شود که یک صفحه php وجود دارد که دارای پارامتر است. این موضوع جذاب به نظر می رسد.

بدون اتلاف وقت، تست نفوذگر به بخش /js/countdown.php می رود و در انتهای پارامتر، یک رشته ساده را به آن اضافه می نماید تا رفتار آن را بررسی کند.

وی مشاهده می کند که مقدار وارد شده (kleiton0x00) در صفحه انعکاس داده می شود. در این حالت می توان اسکریپت را نیز Inject نمود.

شکستن رشته جاوا اسکریپت برای حمله دوم XSS

در این قسمت به جای قرار دادن یک پیلود ساده، تست نفوذگر سعی در شکستن رشته جاوا اسکریپت دارد. بر اساس کد، ورودی دقیقا بعد از اعداد منعکس می شود. برای اجرای کد ابتدا نیاز به یک ); برای بستن کد جاوا اسکریپت می باشد. پرانتز باز برای بسته مقدار متغیر و عبارت ; برای بستن کد جاوا اسکریپت جاری بوده و نشان دهنده انتهای خط می باشد. با توجه به اینکه کد بسته شده است، می توان یک کد جاوا اسکریپت دیگر را اضافه نمود که در این بخش کد alert(1); مد نظر می باشد.

متاسفانه سمت چپ کد عبارت *1000).getTime(); وجود دارد. با استفاده از اضافه نمودن // شما می توانید ادامه کد را کامنت نموده تا پیلود ارسال شده اجرا گردد. پیلود نهایی عبارت به صورت زیر می باشد:

با توجه به سورس کد، کد جاوا اسکریپت ما با موفقیت تزریق گردید.

هنگام فراخوانی URL بالا که اسکریپت تزریق شده نیز در آن وجود دارد، alert انعکاس داده نمی شود که این امر مربوط به وجود ویژگی CSP می باشد.

عبور از ویژگی CSP با وجود دو آسیب پذیری XSS با استفاده از MIME Sniffing

حال زمان این می رسد که تست نفوذگر، آسیب پذیری XSS اول را با آسیب پذیری XSS دوم که در صفحه countdown.php وجود داشت، ترکیب نماید.

در ادامه مشاهده می نمایید که تست نفوذگر به چه صورت با بهره گیری از MIME Sniffing اقدام به اجرای پیلود XSS می نماید.
لازم به ذکر است که برای بهره مندی از ویژگی MIME Sniffing، پیش شرط هایی وجود دارد که باید پوشش داده شوند.

توجه داشته باشید که این پیش شرط ها در سمت کلاینت می باشد:

  • تست نفوذگر باید قادر باشد تا محتوای پاسخ داده شده از سرور را کنترل کند تا بتواند کد مخرب جاوا اسکریپت را تزریق نماید (آسیب پذیری XSS دوم که تست نفوذگر شناسایی نموده است)
  • تست نفوذگر باید بتواند یک زمینه اجرایی که امکان HTML Injection یا JavaScript Injection در آن وجود داشته باشد را معرفی کند (آسیب پذیری XSS اولی که تست نفوذگگر شناسایی نموده است)

در انتها به جای بارگذاری پیلودهای رایج XSS در این حالت از URL زیر که برای آسیب پذیری XSS دوم می باشد استفاده می شود:

بنابراین، ترکیب پیلود XSS اول با آدرس URL آسیب پذیر دوم، پیلود نهایی زیر را تشکیل می دهد که منجر به اجرای اسکریپت می شود:

منبع:

infosecwriteups.com/content-security-policy-bypass-to-perform-xss-3c8dd0d40c2e

درباره نویسنده: احسان نیک آور

ممکن است دوست داشته باشید