استاندارد OWASP
در این مقاله با استفاده از استاندارد OWASP به دستهبندی آسیبپذیریهای تحت وب پرداختهایم. در انتها نیز مقایسهای میان دستهبندی آسیبپذیری سالهای مختلف این استاندارد آمده که بیانگر روند تغییر تهدیدهای برنامههای تحت وب است. برخی اوقات این تغییرات نشان از ارایهی یک راهحل قطعی برای آسیبپذیری حذف شده دارند.
آسیبپذیری تزریق یا Injection
آسیبپذیریهای تزریق انواع مختلفی دارند و بهطور کلی این حملات از ارسال دادهی نامطمین به یک نقطهی آسیبپذیر از برنامه (که معمولن نقش مفسر دارد) ناشی میشوند. حملهکننده ممکن است بتواند با سواستفاده از آن داده، موفق به اجرای یک دستور در سرور آسیبپذیر شود یا به اطلاعات محرمانه دسترسی پیدا کند. برای جلوگیری از این نوع حملات لازم است تا روی دادههای ورودی تمرکز کرد و اعتبارسنجی آنها را با دقت بیشتری انجام داد. بهویژه دادههایی که بهسمت مفسرهای مختلف مانند مفسر پایگاههای داده فرستاده میشوند. کاوش این نوع آسیبپذیری کار چندان سختی نیست و بهترین روش برای انجام این عمل، مرور کد منبع است. یکی از بهترین روشهای جلوگیری از این نوع آسیبپذیری، اعتبارسنجی مقادیر ورودی براساس وایتلیست (whitelisting) در سمت سرور و استفاده از APIهای امن برای ارتباط با مفسرهاست.
آسیبپذیری Broken Authentication
اگر قسمتهایی از برنامه که مسوولیت تصدیق اصالت و مدیریت نشست کاربران را بهعهده دارند درست طراحی و پیادهسازی نشده باشد، این آسیبپذیری محتمل خواهد بود. این آسیبپذیری میتواند به حملهکننده اجازهی دسترسی به گذرواژه، کلیدهای حساس، اطلاعات نشست و… را بدهد و در نتیجهی آن مهاجم میتواند خود را بهجای کاربر مجاز یا حتا مدیر سیستم معرفی کند.
با استفاده از ابزارهای خودکار تست آسیبپذیری نیز بهراحتی میتوان از برخی اقسام این آسیبپذیری سواستفاده کرد. دقت داشته باشید که حتا بهدست آوردن یک جفت نام کاربری و گذرواژهی صحیح با دسترسی پایین توسط مهاجم نیز میتواند بسیار خطرناک باشد. یکی از راههای جلوگیری از این آسیبپذیری، مراقبت از نام کاربری و عدم استفاده از گذرواژهی ضعیف و پیشفرض، همچنین پیادهسازی فرآیند captcha است. امنسازی فرآیند فراموشی رمز عبور، طراحی و پیادهسازی فرآیند تصدیق اصالت چند عامله، تغییرات دورهای گذرواژه و محافظت از شمارهی نشست از دیگر راهکارهای جلوگیری از این آسیبپذیری هستند.
آسیبپذیری Sensitive Data Exposure
بسیاری از برنامههای کاربردی تحت وب اگر از دادههای حساس خود درست مراقبت نکنند ممکن است دچار این نوع آسیبپذیری شوند. با استفاده از این نوع آسیبپذیری امکان جمعآوری اطلاعات حساس برای مهاجم فراهم خواهد بود، بهگونهای که حتا برخی از این اطلاعات ممکن است منجر به گسترش دسترسی مهاجم شوند. این آسیبپذیری میتواند با استفاده از اعمال فرآیندهای رمزنگاری قوی و صحیح روی دادههای حساس برطرف شود. استفاده از استاندارد PCI DSS میتواند در مورد جلوگیری از این آسیبپذیری مفید باشد. بهطور خلاصه قسمتهایی از برنامهی تحت وب که دادهها را بدون رمزنگاری تبادل میکنند، مانند پروتکلهای بدون رمزنگاری ارتباطی، نگهداری ناامن فایلهای پشتیبان، استفاده از الگوریتمهای ناامن و قدیمی رمزنگاری و استفاده از کلید پیشفرض و کلیدهای ناامن رمزنگاری، مستعد وجود این نوع آسیبپذیری هستند. طراحی دقیق جریان اطلاعات و طبقهبندی اطلاعات سامانه، یکی از روشهای مهم جلوگیری از این نوع آسیبپذیری است. از دیگر روشهای جلوگیری از این آسیبپذیری میتوان به عدم ذخیرهسازی اطلاعات حساس وقتی به آنها نیازی نیست، اشاره کرد.
آسیبپذیری (XML External Entities (XXE
بسیاری از پردازندههای قدیمی یا ضعیف XML در پردازش برخی از اسناد XML، ارجاعات به موجودیتهای خارجی (external entityها) را نیز ارزیابی میکنند. این امر میتواند سبب ایجاد مشکلات امنیتی از قبیل، افشای اطلاعات داخلی، اسکن پورت، اجرای حملهی denial-of-service و حتا اجرای دستورات از راه دور شود. قسمتهایی از برنامه که با اسناد XML یا وبسرویس کار میکنند، از قسمتهای مستعد این آسیبپذیری هستند. این نوع آسیبپذیری را با تحلیل کد منبع میتوان کشف کرد. غیرفعال کردن ارجاعات به موجودیتهای خارجی در مفسرهای XML همچنین بهروزرسانی این مفسر، از بهترین راهکارهای جلوگیری از این آسیبپذیری است.
آسیبپذیری Broken Access Control
فرآیند Access Control در سامانههای تحت وب مسوول کنترل و محدود کردن دسترسی کاربران به اطلاعات و عملکردهاست. اگر این فرآیند بهدرستی طراحی و پیادهسازی نشده باشد، مهاجم میتواند برخی از اقداماتی که برایش مجاز نیست را انجام دهد، همانند دسترسی به دادهها و انجام اعمالی که پیش از این امکان دسترسی یا انجام آنها را نداشته است. این اقدامات میتوانند سبب نقض خطمشی امنیتی سیستم شوند. تست سامانه بهشکل دستی، از بهترین روشهای کشف این نوع آسیبپذیری است. رعایت استانداردهای برنامهنویسی لایهبندیشده در کنترل دسترسی نیز یکی از روشهای جلوگیری از این نوع آسیبپذیری بهشمار میآید. تا زمانی که اجازهای داده نشده است، بهشکل پیشفرض برای هیچ کاربری نباید مجوز دسترسی وجود داشته باشد. همچنین برای کنترل دسترسی باید از روش لیستسفید استفاده شده و توکنهای اعتبارسنجی نیز باید پس از خروج کاربر منقضی شوند.
آسیبپذیری Security Misconfiguration
یکی از مسایل بسیار رایج در سامانههای آنلاین استفاده از تنظیمات ناامن و بهویژه تنظیمات پیشفرض است. در برخی موقعیتها این تنظیمات بسیار خطرناک است و میتوانند منجر به دسترسی مهاجم به سیستم شوند. تنظیمات ناامن محدود به بخش خاصی از سامانه نیست و میتوانند در تمامی قسمتهای برنامه رخ دهند. اسکنرهای خودکار راهکار خوبی برای کشف این نوع آسیبپذیری هستند. مدیر سامانه باید از نصب هرگونه سرویس زاید اجتناب و بهطور مرتب سرویسهای لازم را بهروزرسانی کند، همچنین با تنظیمات امنیتی آنها آشنا باشد.
آسیبپذیری (Cross-Site Scripting (XSS
این آسیبپذیری قدیمی، حاصل تفسیر قسمتی از کدهای ورودی کاربر توسط مرورگر، بدون اعتبارسنجی مناسب است. در این حمله، مهاجم اسکریپت مخرب خود را با روشهای مختلفی مانند ارسال یک URL با استفاده از ایمیل، بارگذاری در بخشهای آسیبپذیر وبسایت و… برای کاربری دیگر ارسال میکند و به این ترتیب میتواند کنترل مرورگر کاربر قربانی را در اختیار گیرد. قسمتهایی از برنامه که دادههای پویا را نمایش میدهند، از قسمتهای مستعد به این آسیبپذیری بهشمار میآید.
ابزارهای تست خودکار و بررسی کد منبع از بهترین روشهای کشف این آسیبپذیری هستند. این نوع آسیبپذیری برای از بین بردن مراقبتهای آسیبپذیریهای CSRF نیز استفاده میشود. پیادهسازی امن و حساس به زمینهی (context sensitive encoding) APIهای نمایش دادههای پویا در چارچوبهای (Framework) ساخت نرمافزارهای تحت وب از بهترین راههای جلوگیری از این نوع آسیبپذیری است. فعالسازی خطمشی امن محتوا ((Content Security Policy (CSP) نیز از دیگر روشهای جلوگیری از این نوع آسیبپذیری است.
آسیبپذیری Insecure Deserialization
Serialization عملی است که بهواسطهی آن میتوان Object را از کد برنامه گرفت و آن را به قالبی برای سایر مصارف همانند ذخیرهسازی آن روی حافظه یا انتقال آن روی لینک ارتباطی در ساختار شبکه تبدیل کرد. عکس این عمل Deserialization نام دارد. بهطور کلی ارتباط بین برنامهها، ارتباط با سرویسهای وب، پایگاههای داده، سامانهی فایل، Cache کردن و تبادل اطلاعات تصدیق اصالت، از موارد استفادهی فرآیند سریالسازی بهشمار میآیند.
هدف این حمله، اپلیکیشنهایی هستند که بهشکل مداوم از Serialize و Deserialize دادهها استفاده میکنند. این آسیبپذیری حاصل فرض نادرستِ امن بودن ورودیها به هنگام سریال کردن آنهاست. ممکن است برنامه پس از بازگشایی ورودی سریالشده آن را اجرا کند. در این موقعیت مهاجم میتواند با سریال کردن ورودی دلخواه خود، کنترل دسترسی سامانه را به دست گیرد.
در حالتی دیگر، مهاجم حتا میتواند این آسیبپذیری را به آسیبپذیریهای تزریق، تبدیل کند. تست دستی بهترین روش کشف این آسیبپذیری است. برای جلوگیری از این نوع آسیبپذیری میبایست دادههای سریالشده پس از بازگشایی، اعتبارسنجی شوند. این اعتبارسنجی میتواند از نوع چک کردن امضای دیجیتال یا بررسی قیود امنیتی باشد. نظارت (Monitor) بر شیوهی تشکیل اشیا براساس بازگشایی ورودی سریالشده (input object deserialization) نیز از انواع روشهای تشخیص سواستفاده از این آسیبپذیری است.
Using Components with Known Vulnerabilities
استفاده از اجزای (Component) ناامن در سامانههای آنلاین امری شایع است. اگر یکی از اجزای مورد استفاده دارای آسیبپذیری گزارش شده باشد، مهاجم بهسادگی میتواند با استفاده از آن آسیبپذیری به سامانه حمله کند. بررسی و بهروزرسانی اجزای استفاده شده در برنامه و تعریف این بررسی بهعنوان یک فرآیند تکرارشونده، یکی از راهحلهای جلوگیری از این آسیبپذیری است. استفاده از اسکنرهای خودکار بهروز شده نیز روش مناسبی برای کشف این آسیبپذیری بهشمار میآید.
Insufficient Logging & Monitoring
با اینکه فرآیند لاگ کردن نامناسب، خود یک آسیبپذیری نیست، اما میتواند فراهمکنندهی بستری مناسب برای مخفی ماندن مهاجم باشد. در بیشتر موارد با فرآیند نظارت و لاگ کردن (Logging) مناسب حتا با وجود آسیبپذیریهای خطرناک، باز هم امکان کشف و خنثاسازی حمله بسیار بالاست. استفادهی مناسب از فرآیندهای نظارت و لاگ کردن برای امنیت حداقلی الزامی هستند. همچنین جدی توصیه میشود از فرآیند مرکزیسازی لاگ و تحلیل خودکار لاگ استفاده شود.
آسیبپذیری Buffer Overflows
این آسیبپذیری اکنون در بستر وب بسیار نادر است، اما در گذشته بهدلیل استفاده از تکنولوژی CGI بر بستر وب، بیشتر مورد بحث بوده است. این آسیبپذیری زمانی پدید میآید که برنامه در انتقال مقادیر دادهی نامطمین به بافری دیگر، اندازهی بافر مقصد را چک نکرده باشد و با این انتقال، افزونبر بافر مقصد، مقادیر دیگری از برنامه نیز بازنویسی شوند که در موقعیتهایی ممکن است منجر به دسترسی حملهکننده به سیستم و اجرای کد توسط وی شود. استفاده از زبانهای برنامهنویسی امن یا استفاده از توابع امن در برابر این آسیبپذیری از بهترین روشهای جلوگیری از بروز این حمله هستند. تشخیص توابع خطرناک انتقال داده و ردگیری دادههای ورودی، روشی بهینه در کشف این دسته از آسیبپذیری است.
حمله Denial of Service
این دستهی کلی آسیبپذیری به آسیبپذیریهایی گفته میشود که مانع از دسترسی کاربر مجاز به سیستم میشوند. این آسیبپذیری انواع مختلفی دارد و تقریبن تمامی آسیبپذیریهایی که به اجرای دستور ختم میشوند به نوعی میتوانند به این آسیبپذیری نیز ختم شوند. اما یکی از دستههای مشهور این نوع آسیبپذیری اتلاف منابع سیستم است که این منابع میتوانند در لایههای مختلف تعریف شوند. کشف این نوع آسیبپذیری بسیار سخت است، جلوگیری از آن نیز اگر توزیع شود بسیار سخت خواهد بود.
آسیبپذیری (Cross Site Request Forgery (CSRF
این آسیبپذیری سبب میشود تا حملهکننده بتواند فعالیتی ناخواسته را -بهویژه انجام فعالیتی که منجر به تغییر حالت سیستم شود- توسط قربانی (کاربر مجاز سیستم) انجام دهد. از بهترین روشهای جلوگیری از این دسته از آسیبپذیریها، ایجاد توکنهای موقت که نمیتوان حدس زد و ذخیرهی آنها در نشست (session) برای درخواستهای کاربر مجاز و منوط شدن انجام درخواست کاربر به صحت توکن است. برای یافتن این آسیبپذیری باید تمامی فعالیتهای کاربرِ مجاز به این توکنها مجهز باشند وگرنه، سامانه در برابر این تهدید آسیبپذیر خواهد بود.
Information Leakage and Improper Error Handling
برنامههای تحت وب میتوانند در حالتهای مختلف اطلاعاتی از برنامه را نشت دهند که ممکن است برای حملهکننده مفید باشد. برنامه میبایست حداقل اطلاعات لازم را در اختیار کاربر قرار دهد. در برخی اوقات نیز با استفاده از ترکیبی از این نوع آسیبپذیری، آسیبپذیریهای جدیتری همچون تزریق پرسوجوی ساختارمند برمبنای اشکال، ایجاد میشوند. برای جلوگیری از این آسیبپذیری تنظیمات سیستم باید بهگونهای انجام شوند که اشکالات بهشکل کلی در اختیار کاربر قرار گیرد و از ارایهی جزییات صرف نظر شود.
دستههای آسیبپذیری Injection ،XXE ،XSS، برخی دستههای Insecure Deserialization ،Using Components with Known Vulnerabilities ،Buffer Overflows و برخی دستههای Denial of Service را بهدلیل داشتن نوعی الگو، دیواره آتش لایه کاربردی یا همان (WAF (Web Application Firewall میتواند تشخیص دهد. البته گاهی اوقات مهاجم با دارا بودن دانش کافی میتواند از دیوارههای آتش سامانههای وب نیز عبور کند یا در اصطلاح آنها را Bypass کند. در واقع باید توجه داشت که استفاده از WAF، به تنهایی سبب امن شدن کامل برنامهها و جلوگیری از تمام حملات نمیشود؛ اما با استفاده از تنظیمات مناسب در تجهیزات، میتوان بسیاری حملات تحت وب را تشخیص داد و از به ثمر رسیدن آنها جلوگیری کرد.