تزریق کد (انگلیسی:XSS: Cross site scripting) از روشهای نفوذ و گرفتن دسترسی غیر مجاز از یک وبگاه است که توسط یک هکر به کار میرود.
تاریخچه :
تاریخچه حفرههای امنیتی در معرض حملات XSS به سال ۱۹۹۶ و سالهای اولیه صفحات وب باز میگردد. نفوذگران در آن زمان که پروتکل HTTP جا افتاده بود و طراحان وبگاهها از زبانهای پردازهنویسی مانند جاوا اسکریپت سود میبردند، دریافتند وقتی کاربران معمولی وارد سایتی میشود میتوان به کمک کدنویسی در حفرههای امنیتی وبگاه، صفحه دیگری را در همان صفحه بارگذاری کرد سپس با سود بردن از جاوا اسکریپت دادههای کاربر مانند نام کاربری، گذرواژه و یا کوکی(Cookie)ها را دزدید.
در این هنگام رسانهها این مشکلات را به ضعف امنیتی مرورگرها نسبت داده بودند. شرکت ارتباطی Netscape که جزو اولین تولیدکنندگان مرورگرهای وب و همچنین سازنده زبان جاوا اسکریپت بود سیاست دامنه شخصی را به این زبان افزود که جلوی دسترسی به آدرسهای خارج از دامنه وبگاه را میگرفت و تا حدودی این حملات را محدود میکرد.
Scripting يكي از روش هاي حمله هكرها به سايت ها است و يك نقص امنيتي محسوب ميشود. البته در اين حمله کدهای سمت کلاینت از قبیل جاوا اسکریپت به سایت تزریق میشوند و هدف اصلي هكرها كاربراني هستند كه به سايت مراجعه كرده اند. در حقيقت هكرها در اين نوع از حمله اطلاعات كاربران يك سايت را بدون اينكه خودشان آگاهي داشته باشند، به سرقت مي برند.
اگرچه مخففCross Site Scripting ، CSS مي باشد اما از آنجا كه CSS به عنوان مخفف Cascading Style Sheets نيز مي باشد، به منظور جلوگيري از بروز اشتباه، XSSرا به Cross Site Scriptingنسبت داده اند.
در XSSهكرها كدهاي خود را جايگزين كدهاي صفحات وب پويا مي كنند. اين حمله اغلب هنگامي صورت مي گيرد كه يك سايت جهت درخواست اطلاعات كاربر از Querystring استفاده مي نمايد. كدهائي كه جايگزين كدهاي صفحاتپويا مي شوند، بر روي كامپيوتر كاربر اجرا مي شوند. اين كدها مي توانند اطلاعات بااهميت موجود در كامپيوتر او را سرقت ببرند و به صورت مخرب بكار گيرند.
يكي از روش هاي دستيابي به اطلاعات كاربر بدست آوردن cookie اي است كه سايت ها پس از استفاده كاربر در سيستم او ايجاد و ذخيره مي نمايند، تا در ورودهاي بعدي ازاطلاعات ذخيره شده در آن استفاده نموده و به كاربر اجازه ورود دهند. با دستيابي به اين فايل در حقيقت هكر به اطلاعات كاربر دست پيدا نموده و مي تواند از آنها استفاده هاي سوئي نمايد.
انواع حملات : XSS
انعکاس
در این نوع از حمله، هکر یک حفره امنیتی و راهی برای استفاده از آن پیدا می نماید تا کاربر ناشناس را به یک برنامه وب دارای آسیب پذیری XSS هدایت کند. در این هنگام حمله انجام شده است.
این حمله به وسیله یک سری از پارامترهای URL که با URL ارسال می شوند، انجام می شود. هکر URL مخرب را با پارامترهای موجود در URL برای کاربر ارسال می کند. این URL معمولا ازطریق ایمیل، وبلاگ ها یا انجمن ها و یا هر روش ممکن دیگری برای کاربر فرستاده میشود. شاید تصور شود که کاربر بر روی لینک های ناشناس کلیک نمی کند، بنابراین مشکلی برای او پیش نمی آید. اما باید توجه نمود که با استفاده از JavaScript حتی با باز نمودن یک ایمیل و حتی مشاهده یک سایت، حمله XSS انجام می شود. به علاوه در این نوع حمله معمولا URL ها با متدهایی مثل Hex و یا هر متد کدگذاری دیگری که URL ها رابصورت معتبر نمایش می دهد، کدگذاری می شوند.
ذخیره
در این نوع حمله، هکرکدهای مخربی را که یک کاربر در آینده آنها را فراخوانی می کند ذخیره مینماید.
در واقع یک کاربر ندانسته به کدهای مخرب برخورد می نماید و کدهای مخرب اجرا می شوند. مسئله اینجاست که هنگام ذخیره سازی کدها و همچنین هنگام واکشی آنها اعتبارسنجی ورودی ها و خروجی ها انجام نشده است.
نکته حائز اهمیت این است که حتی درصورت اعتبارسنجی کدها در هنگام ذخیره نمودن آنها، چک نمودن خروجی ها و اعتبارسنجی آنها نیز لازم است. چرا که به این ترتیب کدهای مخرب ناشناخته در طی فرایند اعتبار سنجی ورودی، کشف خواهند شد.
سناریوهای مختلفی برای قرار دادن کدمخرب درسایت ها به عنوان حمله وجود دارد:
•طراح سایت، خود کد مخرب را در صفحه قرار داده باشد.
•حفره سایت ممکن است درسطح سیستم عامل یا شبکه ایجادشده باشد.
•یک حفره دائمی در یک یاز مکانهای عمومی وبگاه قرار گرفته باشد.
•قربانی بر روی یک لینک حاوی XSS مدل non-persistent یا DOM-based کلیک کند.
يك هكر با بهره گيري از XSSمي تواند به انجام اعمالي از قبيل موارد زير اقدام نمايد: * تغيير تنظيمات كاربر * ربودن حسابها * ربودن كوكي ها * اعمال كدهاي تخریب کننده * لینک به سايت هاي مخرب * راه اندازي تبليغات كاذب
راه هاي متداولي كه كاربران از طريق آنها مورد حمله قرار مي گيرند، عبارتند از: * باز نمودن يك صفحه وب * كليك نمودن بر روي لينك * باز نمودن ايميل
جلوگيري ازXSS
ساده ترين راه جلوگيري از XSS ، اضافه نمودن كدي به برنامه تحت وب است تا باعث شود از برخي تگ هاي فرمان در ورودي پويا چشم پوشي شود.
تگ هاي قابل استفاده درXSS عبارتنداز: * <script> * <object> * <applet> * <embed> * <form>
به طور كلي جهت جلوگیری ازXSS باید استراتژی های مختلفی درنظر گرفته شود: * استفاده از مرورگرهاي وب امن:
مرورگرهایی مثل Firefox و Opera از امنیت بالاتری (نه 100درصد) نسبت به IE برخوردار هستند. اینترنت اکسپلورر از جمله مرورگرهایی است که نقاط ضعف زیادی دارد و بسیار در معرض خطر است. * بكارگيري ابزارهائي كه اجراي كدهای Script ، Flash و هر کد مخرب دیگری را محدودمي كنند. مثلNoScript * عدم كليك بر روي link ها و ايميل هاي ناشناس :
سعی کنید آدرس وب سایت هاییکه قصد مشاهده آنها را دارید، مستقیما در نوار آدرس مرورگر وارد نمایید. * استفاده از توابعی که عملیات پاکسازی کدها را انجام می دهند. مثلhtmlentitiesدر زبانPHP(فیلتر نمودن ورودی های کاربر و همچنین کدهای خروجی).
زبانهاي متداول مورد استفاده درXSSعبارتند از:
JavaScript ، VBScript ، HTML ، Perl ، C++ ، ActiveX و Flash register_globals چیست؟
نقل از سایت webdesign.org : یکی از مواردی که در برنامه نویسی PHP همواره باید مد نظر قرار گیرد استفاده از register_globals میباشد. استفاده از این مورد به شما این امکان را میدهد تا به متغیرهایی فرمها و URL ها به شکل دیگری دسترسی داشته باشید. مثلا در یک URL به شکل file.php?var=foo بتوانید به متغیری به نام $var دسترسی داشته باشید.
متاسفانه برخی از برنامه نویسان نسبت به استفاده از این امکان چندان نظر مساعدی ندارند و ترجیح میدهند آن را در فایل php.ini غیرفعال سازند. البته دقت داشته باشید که این امکان به صورت پیش فرض در PHP 4.2.0 غیرفعال میباشد.
لذا این احتمال وجود دارد که کدی که شما مینویسید تحت برخی از وب سرورها جواب ندهد. و به همین دلیل ممکن است شما ترجیح دهید راحتی کاری که این امکان برای شما فراهم میکند را فراموش کرده و در عوض کدی بنویسید که اطمینان داشته باشید بر روی همه وب سرورها جواب میدهد!
از دید ما راه صحیح دسترسی به متغیرها از طریق آرایه مرتبطشان میباشد. مثلا در مثال بالا به جای استفاده از var $ از var]_ $GET[استفاده نمایید و به همین شکل به جای استفاده از $ عبارت] HTTP_USER_AGENT $SERVER[' به کار گیرید.
آرایه های اصلی عبارتند از $_ GET, $_POST, $_COOKIE, $_SERVER که برحسب اینکه متغیرها از کجا می آیند نامگذاری شده اند.
SQL Injection چیست ؟
SQL Injection یک نوع حمله با استفاده از ارسال یک رشته(String) حاوی کد مخرب به SQL Server Instance می باشد. کد مخرب حاوی یک دستور معتبر SQL است که به طورطبیعی توسط SQL سرور اجرا می شود.
فرم اولیه این نوع حمله شامل درج یک دستور SQL در مقادیری است که توسط برنامه از کاربر دریافت می شود. به طور مثال فرض کنید برنامه نام یک طرف حساب را دریافت و لیست سفارشات خرید مربوط به طرف حساب انتخابی را لیست می کند. کد مربوط به تهیه لیست می تواند شبیه به زیر باشد:
SELECT * FROM CustomerOrder WHERE CustomerName=’@pUserInput’
که @pUserInput پارامتر دریافت شده از کاربر است حال اگر کاربر قصد برنامه ریزی یک حمله را داشته باشد می تواند رشته ای با فرمت زیر را به عنوان نام طرف حساب به برنامه ارائه کند: Mohammad’; DELETE FROM CustomerOrder—
دستور SQL که به سرور SQL ارسال می شود به صورت زیر خواهد بود: SELECT * FROM CustomerOrder WHERE CustomerName=’ Mohammad’; DELETE FROM CustomerOrder— ارسال این دستور به SQL سرور حاصلی جز حذف کلیه طرف حسابهای ثبت شده در پایگاه داده نخواهد داشت. توجه داشته باشید که (;) به مفهوم پایان یک دستور و شروع یک دستور دیگر بوده و (--) به مفهوم آنست که مابقی عبارت بعد از – برای SQL به منزله کامنت تلقی خواهد شد.
جهت جلوگیری از حملات از نوع SQL Injection باید تمامی اطلاعاتی که توسط برنامه از کاربر دریافت می شود به دقت ارزیابی و محتوای مشکوک و مخاطره آمیز پذیرش نشود. رعایت موارد زیر می تواند به طور قابل قبولی از حملات SQL Injection جلوگیری نماید:
1- سایز و نوع دیتا دریافتی کنترل و محدودیت های وابسته به نوع اطلاعات موردنظراعمال شود.
2- محتوای دیتا کنترل واز پذیرش اطلاعات باینری،کاراکترها یک امنتو ... خود داری شود.
3- هیچگاه به طورمستقیم از دیتای وارد شده توسط کاربر دستورSQL ساخته نشود.
4- کاراکترهای خاص نظیر(;),(‘),(--),(xp_),(/* */) در اطلاعات دریافت شده از کاربر پذیرش نشده و یا به نحو مناسب جایگزین شود.
5- سایزونوع پارامترهای ورویSP ها کنترل شود.
نکته 1: اطلاعات دریافتی الزام به طور مستقیم از کاربر دریافت نمی شود و می تواند شامل اطلاعاتی باشد که قبلا در جداول پایگاه داده ذخیره شده است.
چگونه از sql injection جلوگیری کنیم؟
ورودی های sql injection کجا هستند؟
ورودی اطلاعات به سایت شما معمولا کنترل هایی شبیه textBox , MemoBox , ComboBox و نظیر اینها هستند. ولی کنترلی که کاربر بتواند در آن کد بنویسد تکس باکس می باشد. همچنین خروجی برخی صفحات شما ورودی صفحه دیگریست که اطلاعات صفحه قبل را با queryString می گیرد. 1. ورودی از تکس باکس textBox 2. ورودی از آدرس بار QueryString
چطور از sql injection جلوگیری کنیم؟
با کنترل ورودی های سایت می توان این کار را انجام داد.
1- سعی کنید تا می توانید اطلاعات مهم را از طریق queryString پاس ندهید و از جایگزین هایی مانند Session، static variables , cooki و ... استفاده کنید. ولی آی دی ها را از طریق queryString بفرستید، چرا که در موتورهای جستجو صفحات جداکانه برای سایتتان محسوب شود.
2-حال فرض کنید مجبورید اطلاعات را از queryString پاس بدهید. در این صورت بهترین و مطمان ترین راه این است که داده ها را به صورت پارامتری در sql اجرا کنید تا مشکل هک بوجود نیاید. پارامتر مزیتی که دارد این است که هکر هرچقدر هم کد بنویسد و هر کدی بنویسد فقط به عنوان یک پارامتر ورودی در sql محسوب می شود و بخشی از دستور نمی شود. این موضوع در مورد تکس باکس ها هم وجود دارد.
3- باز هم فرض می کنیم مجبورید از روش غیر پارامتری استفاده کنید. در اینجا باید داده های ورودی را چک کنید که کد اینجکشن نباشد: 1. روش اول اینست که آی دی ها را به نوع عدد صحیح تبدیل کنید تا هکر نتواند به جز ارقام وارد کند. 2. روش دوم اینست که عبارات مشکوک که سایت شما را هک می کند فیلتر کنید. مانند: union select, Table_Name, Order by , -- و مانند اینها 3. راه بعدی اینست که ورودی ها را انکد کنید.
نشست (Session) چیست؟ cookie اطلاعاتی هستند که به طور موقت ذخیره میشوند و تا زمان اعتبار آن، آن اطلاعات باقی میمانند.
معمولاً از این اطلاعات در وبگاهها استفاده میشود تا کاربر مجبور نباشد این اطلاعات را چندین بار وارد کند. مرسومترین استفاده آن برای اطلاعات ورود به سایت است.
بدین گونه که پس از وارد کردن اطلاعات ورود به سایت، نرمافزار وبگاه یک جلسه ایجاد و در آن اطلاعات ورود را ذخیره میکند و تا زمان مشخص شده، این اطلاعات ذخیره میمانند.
بنابراین کاربر با داشتن کلید جلسه (session key) در مرورگر خود، برای بازکردن صفحات دیگر وبگاه نیاز به وارد کردن دوباره رمز عبور نخواهد داشت.
طبق توضیحات داده شده در مورد نحوه عملکرد جلسهها طبیعی است که شخص نفوذگر با داشتن کلید جلسه میتواند خود را به عنوان کاربر وارد شده در وبگاه معرفی کند و بدیهی است که این امر بدون داشتن نام کاربری یا رمز عبور قابل انجام خواهد بود که در اغلب مواقع نیز نفوذگر کلید جلسه مدیر وبگاه را جعل میکند و از این طریق وارد صفحه مدیریت وبگاه میشود
راهها و راهکارها
با وجود حفره XSS، نفوذگر میتواند کدهای جاوااسکریپت روی سیستم قربانی اجرا کند.
از جمله کارهایی که میتوان با جاوا اسکریپت انجام داد، سرقت Cookieها و جلسهها است.
جلوگیری از XSS و همچنین HttpOnly کردن جلسهها و کوکیها از جمله راههای جلوگیری از این روش هستند.
استراق سمع(Session sidejacking)
در این روش نفوذگر از طریق packetهای TCP/IP اطلاعات رد و بدل شده را به روش استراق سمع (معمولاً در شبکههای بیسیم) دریافت و از آن کلید جلسه را استخراج میکند.
برای جلوگیری از این راه علاوه بر تامین امنیت شخصی، استفاده از پروتکل امن(https) میتواند به جلوگیری از این روش کمک کند. شایان ذکر است که اگر در https استراق سمع صورت گیرد، مرورگر با نمایش پیغام خطا شما را مطلع میکند.
تثبیت نشست (session fixation)
در این روش نفوذگر کلید جلسه شخص مورد هدف را آن چیزی قرار میدهد که خود میخواهد. از این طریق شخص قربانی با وارد شدن به سایت(همراه با کلید جلسه که نفوذگر به او تحمیل کرده) این امکان را به مهاجم میدهد تا با استفاده از همان کلید جلسه خود را به جای قربانی معرفی کند.
برای جلوگیری از این روش، مهمترین کار برقراری امنیت شخصی است و اعتماد نداشتن به لینکهایی که فرستاده میشود.
به عنوان مثال اگر مهاجم آدرس http://site.com/?SID=TEST را برای قربانی ارسال کند و قربانی بدون توجه به آدرس آنرا باز کند، با کلید جلسه معادل TEST وارد سایت میشود و اگر در سایت وارد شود، مهاجم نیز میتواند با TEST(یعنی مراجعه به آدرس گفته شده در بالا) وارد سایت شود.