تزریق کد – XSS

تزریق کد XSS

تزریق کد (انگلیسی: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 مدل nonpersistent یا DOMbased کلیک کند.

 

 

یک هکر با بهره گیری از  XSSمی تواند به انجام اعمالی از قبیل موارد زیر اقدام نماید:

·        تغییر تنظیمات کاربر

·        ربودن حسابها

·        ربودن کوکی ها

·        اعمال کدهای تخریب کننده

·        لینک به سایت های مخرب

·        راه اندازی تبلیغات کاذب

راه های متداولی که کاربران از طریق آنها مورد حمله قرار می گیرند، عبارتند از:

·        باز نمودن یک صفحه وب

·        کلیک نمودن بر روی لینک

·        باز نمودن ایمیل

جلوگیری ازXSS


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

·        <script>

·        <object>

·        <applet>

·        <embed>

·        <form>

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

·        استفاده از مرورگرهای وب امن:
مرورگرهایی مثل Firefox و Opera از امنیت بالاتری (نه ۱۰۰درصد) نسبت به 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 جلوگیری نماید:

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

۲-     محتوای دیتا کنترل واز پذیرش اطلاعات باینری،کاراکترها یک امنتو … خود داری شود.

۳-     هیچگاه به طورمستقیم از دیتای وارد شده توسط کاربر دستورSQL ساخته نشود.

۴-     کاراکترهای خاص نظیر(;),(‘),(–),(xp_),(/*  */) در اطلاعات دریافت شده از کاربر پذیرش نشده و یا به نحو مناسب جایگزین شود.

۵-    سایزونوع پارامترهای ورویSP ها کنترل شود.

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

چگونه از sql injection جلوگیری کنیم؟

ورودی های sql injection کجا هستند؟

ورودی اطلاعات به سایت شما معمولا کنترل هایی شبیه textBox , MemoBox , ComboBox  و نظیر اینها هستند. ولی کنترلی که کاربر بتواند در آن کد بنویسد تکس باکس می باشد. همچنین خروجی برخی صفحات شما ورودی صفحه دیگریست که اطلاعات صفحه قبل را با queryString می گیرد.

۱. ورودی از تکس باکس textBox

۲. ورودی از آدرس بار QueryString

چطور از sql injection  جلوگیری کنیم؟

با کنترل ورودی های سایت می توان این کار را انجام داد.

۱- سعی کنید تا می توانید اطلاعات مهم را از طریق queryString پاس ندهید و از جایگزین هایی مانند Session، static variables , cooki و … استفاده کنید. ولی آی دی ها را از طریق queryString بفرستید، چرا که در موتورهای جستجو صفحات جداکانه برای سایتتان محسوب شود.

۲-حال فرض کنید مجبورید اطلاعات را از queryString پاس بدهید. در این صورت بهترین و مطمان ترین راه این است که داده ها را به صورت پارامتری در sql اجرا کنید تا مشکل هک بوجود نیاید. پارامتر مزیتی که دارد این است که هکر هرچقدر هم کد بنویسد و هر کدی بنویسد فقط به عنوان یک پارامتر ورودی در sql محسوب می شود و بخشی از دستور نمی شود. این موضوع در مورد تکس باکس ها هم وجود دارد.

۳- باز هم فرض می کنیم مجبورید از روش غیر پارامتری استفاده کنید. در اینجا باید داده های ورودی را چک کنید که کد اینجکشن نباشد:

۱. روش اول اینست که آی دی ها را به نوع عدد صحیح تبدیل کنید تا هکر نتواند به جز ارقام وارد کند.

۲. روش دوم اینست که عبارات مشکوک که سایت شما را هک می کند فیلتر کنید. مانند: union select, Table_Name, Order by , — و مانند اینها

۳. راه بعدی اینست که ورودی ها را انکد کنید.

 

نشست (Session) چیست؟

cookie اطلاعاتی هستند که به طور موقت ذخیره می‌شوند و تا زمان اعتبار آن، آن اطلاعات باقی می‌مانند.

معمولاً از این اطلاعات در وب‌گاه‌ها استفاده می‌شود تا کاربر مجبور نباشد این اطلاعات را چندین بار وارد کند. مرسوم‌ترین استفاده آن برای اطلاعات ورود به سایت است.

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

بنابراین کاربر با داشتن کلید جلسه (session key) در مرورگر خود، برای بازکردن صفحات دیگر وبگاه نیاز به وارد کردن دوباره رمز عبور نخواهد داشت.

طبق توضیحات داده شده در مورد نحوه عملکرد جلسه‌ها طبیعی است که شخص نفوذگر با داشتن کلید جلسه می‌تواند خود را به عنوان کاربر وارد شده در وبگاه معرفی کند و بدیهی است که این امر بدون داشتن نام کاربری یا رمز عبور قابل انجام خواهد بود که در اغلب مواقع نیز نفوذگر کلید جلسه مدیر وبگاه را جعل می‌کند و از این طریق وارد صفحه مدیریت وبگاه می‌شود

راه‌ها و راهکارها

با وجود حفره XSS، نفوذگر می‌تواند کدهای جاوااسکریپت روی سیستم قربانی اجرا کند.

از جمله کارهایی که می‌توان با جاوا اسکریپت انجام داد، سرقت Cookieها و جلسه‌ها است.

جلوگیری از XSS و همچنین HttpOnly کردن جلسه‌ها و کوکی‌ها از جمله راه‌های جلوگیری از این روش هستند.

استراق سمع(Session sidejacking)

در این روش نفوذگر از طریق  packetهای TCP/IP اطلاعات رد و بدل شده را به روش استراق سمع (معمولاً در شبکه‌های بیسیم) دریافت و از آن کلید جلسه را استخراج می‌کند.

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

تثبیت نشست (session fixation)

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

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

به عنوان مثال اگر مهاجم آدرس http://site.com/?SID=TEST را برای قربانی ارسال کند و قربانی بدون توجه به آدرس آنرا باز کند، با کلید جلسه معادل TEST وارد سایت می‌شود و اگر در سایت وارد شود، مهاجم نیز می‌تواند با TEST(یعنی مراجعه به آدرس گفته شده در بالا) وارد سایت شود.

 

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

نمایش نظرات (1)