رایتاپ
XSS in Asp.net writeup

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

Cross-site Scripting (XSS) به حمله تزریق کد client-side اشاره دارد که در آن مهاجم می‌تواند اسکریپت‌های مخرب را در یک وب سایت یا برنامه وب قانونی اجرا کند. XSS زمانی اتفاق می‌افتد که یک برنامه وب از کاربر ورودی نامعتبر یا رمزگذاری شده در خروجی تولید شده استفاده می‌کند.

روش کار ASP.NET  و دلیل وجود آسیب‌پذیری:

توانایی اضافه کردن منابع مورد نیاز (مانند css و js) ویژگی مهمی از فریم‌ورک‌ها است. به‌روز رسانی دستی صفحات فرعی با قرار دادن Relative URL بسیار سخت است. همچنین تغییر ساختار فایل‌ها و دایرکتوری‌ها برای تصحیح تمام مسیرها به همان سختی است. به‌علاوه، استفاده از absolute URL این مشکل را حل نمی‌کند. دیپلوی اپلیکیشن به زیر دایرکتوری به جای Root  باعث می‌شود که absolute URL بی‌مصرف شود.

برخی از برنامه های وب ASP.NET که از Control.ResolveUrl برای روت مسیرهای مربوط به Root برنامه استفاده می‌کنند، در برابر XSS آسیب‌پذیر هستند. برای مثال، می‌توان از روش زیر برای حل مشکل مسیرهای app-root-relative استفاده کرد. ولی استفاده از این روش راه‌های بیشتری برای اجرای حملات سایبری باز می‌گذارد.

متد Control.ResolverUrl(String):

کنترل‌های سی شارپ ResolveUrl(string relativeUrl) مسیر‌های URL را برای استفاده در ریکوئست‌های سمت کلاینت تبدیل می‌کند و مشکل مسیر‌های app-root-relative را حل می‌کند.

 <%@ Page Language="C#" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="<%= ResolveUrl("~/Script.js") %>"></script> </head> <body> .NET version: <%=Environment.Version%> </body> </html> 

تیکه کد بالا مسیر ~/Script.js در سرور تغییر می‌دهد. برای مثال، توسعه دهنده از مسیر Scritp.js با استفاده از کد بالا در مسیر روت برنامه خود استفاده می‌کند سپس به A/B/C/default.aspx دسترسی پیدا می‌کند که به شکل زیر رندر می‌شود:

 <script src="/Script.js"></script>

نحوه تست:

ASP.NET با قرار دادن خودکار یک شناسه نشست منحصر به فرد در URL صفحه، وضعیت نشست بدون کوکی را حفظ می‌کند. به عنوان مثال، در http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx توسط ASP.NET اصلاح شده است تا شناسه منحصر به فرد  lit3py55t21z5v55vlm25s55  را در خود داشته باشد:

برخی از شناسه های اضافی که ممکن است درURL ها مشاهده شوند عبارتند از:

  • (A(?)) - Anonymous ID
  • (S(?)) - Session ID
  • (F(?)) - Form Authentication Ticket

هنگام باز کردن http://localhost/(A(ABCD))/A/B/C/default.aspx، رشته (A(ABCD)) به مسیر Script.js اضافه می‌شود. همین امر هنگام دسترسی رخ می‌دهد:

 از همین روش به منظور اجرای Payload مربوط به XSS می‌توان استفاده کرد:

 http://localhost/A/B/C/(A(%22onerror=%22alert`1`%22))/default.aspx