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

برنامه‌های کاربردی و چالش‌های آن‌ها 

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

پیمایش دایرکتوری

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

حمله‌های تزریقی

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

تزریق SQL

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

شکل ۱، نمونه‌ای از یک حمله تزریق کد SQL را نشان می‌دهد. در این شکل، یک صفحه ورود به سیستم را مشاهده می‌کنید که منتظر دریافت نام کاربری و رمزعبور است. هنگامی که کاربر اطلاعات فیلدهای مذکور را وارد می‌کند، این اطلاعات در دستورات SQL قرار می‌گیرند تا کاربر احراز هویت شود و بتواند به سیستم وارد شود. دستوری که برای این منظور استفاده می‌شود، دستور select است که برای یافتن اطلاعات در پایگاه داده استفاده می‌شود. هنگامی که کاربر روی دکمه LOGON کلیک می‌کند، دستور select سعی می‌کند نام کاربری و رمز عبوری که در برنامه تایپ شده است را پیدا کند.

شکل ۱

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

pass’ or 1=1 --

کلمه pass چیزی است که هکر به‌عنوان رمز عبور خود تایپ می‌کند که در واقع کار نخواهد کرد، زیرا هکر در برنامه حساب کاربری ندارد. دستور 1=1 به‌عنوان شرطی در دستور select استفاده می‌شود، اما به‌عنوان رمز عبور واقعی آزمایش نمی‌شود. در این‌جا نکته مهم در کاراکتر «'» مستتر است که برای بستن دستور select استفاده می‌شود. کاراکترهای «--» در پایان این دستور اشاره به درج نظر دارند و در حالت عادی مشکل خاصی ندارند، با این‌حال، نکته ظریفی وجود دارد. در کدهای اصلی، برنامه‌نویس از کاراکتر «'» در دستور select واقعی استفاده کرده و در این‌جا این کاراکتر پایان آن دستور را مشخص می‌کند. اکنون دو کاراکتر «-» ‌که در دنیای واقعی تنها برای درج نظرات توسط برنامه‌نویسان استفاده می‌شود، در خط بالا باعث نادیده گرفتن ادامه دستورات select اصلی می‌شوند. از این‌رو، در کدنویسی‌های ضعیف این تکنیک به هکر اجازه ورود به سامانه را می‌دهد. 

یکی دیگر از چالش‌های بزرگی که برنامه‌نویسان بانک‌های اطلاعاتی با آن روبرو هستند، تغییر قیمت کالاها در یک فروشگاه آنلاین توسط هکرها است. دستور زیر اجازه به ورود به سیستم را می‌دهد، اما در عین حال یک عبارت به‌روزرسانی را اجرا می‌کند که قیمت همه کتاب‌های جدول titles را به ۵۰ سنت تغییر می‌دهد:

pass’ or 1=1; update titles set price=.5 --

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

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

xp_cmdshell به‌طور پیش‌فرض غیرفعال است و به این دلیل نباید فعال شود.

pass’ ;exec master ..xp_cmdshell “net user fromSQL password /add» –

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

pass’ ;exec master ..xp_cmdshell “net localgroup administrators fromSQL /add” –

چگونه مانع پیاده‌سازی موفقیت‌آمیز حمله‌های تزریق SQL شویم؟

همان‌گونه که اشاره شد، ایمن‌سازی نرم‌افزارهای کاربردی از وظایف اصلی برنامه‌نویسان است، زیرا کارشناسان امنیتی قدرت مانور محدودی برای مقابله با این مدل حمله‌ها دارند. از این‌رو، برای محافظت از برنامه‌های کاربردی که داده‌محور هستند به نکات زیر دقت کنید:

  • Sanitization : برنامه‌نویسان باید از طریق به‌کارگیری الگوهایی مثل عبارات باقاعده هر کاراکتر ورودی دریافتی از کاربر که می‌تواند کدهای SQL را اجرا کند را شناسایی و پاک کنند. به‌عنوان مثال، آن‌ها باید نقطه ویرگول و دو خط تیره را از ورودی حذف کنند.
  • Validation: برنامه‌نویسان باید ورودی را تایید کنند و اطمینان حاصل کنند که تعداد نویسه‌های قابل ‌وارد ‌کردن و نوع نویسه‌های استفاده‌شده دارای محدودیت هستند. 
  • Parameterized queries: استفاده از پرس‌و‌جوهای پارامتری به این معنا است که ورودی به‌شکل مستقیم به یک دستور SQL ارسال نمی‌شود، بلکه در قالب پارامتر برای دستورات ارسال می‌شود و تنها مقادیر خاصی پذیرفته می‌شوند. اگر مقدار پارامتر درست باشد، توسط دستورات SQL اجرا می‌شود. الگوی محاوره‌های پارامتری یکی از مهم‌ترین مباحث دنیای برنامه‌نویسی است که باید به آن دقت کنید. 

تزریق کتابخانه پیوند پویا(Dynamic-Link Library Injection)

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

تزریق پروتکل دسترسی دایرکتوری سبک وزن

(Lightweight Directory Access Protocol Injection)

  • حمله تزریق پروتکل دسترسی به دایرکتوری سبک وزن هنگامی اتفاق می‌افتد که هکری یک فرم وب را به‌گونه‌ای پر می‌کند که معمولا از داده‌های فرم برای پرس‌وجو از پایگاه داده با فراخوانی LDAP استفاده می‌کند، اما از آن‌جایی که توسعه‌دهنده برنامه هیچ‌کدام از ورودی‌ها را تایید نکرده، هکر در اجرای دستورات موفق خواهد بود. در این حالت هکر محتوا و دستورات موردنظر را درج می‌کند و سرور آن‌ها را اجرا می‌کند. 

تزریق زبان نشانه‌گذاری توسعه‌پذیر

(Extensible Markup Language Injection)

  • حمله تزریق زبان نشانه‌گذاری توسعه‌پذیر (XML) شبیه تزریق کد اس‌کیو‌ال و تزریق LDAP است، با این تفاوت که هکر کد XML را به برنامه وارد می‌کند. اگر توسعه‌دهنده برنامه، ورودی را اعتبارسنجی نکرده باشد، هکر می‌تواند روند اجرای برنامه را با تزریق داده‌های XML  دستکاری کند. برای حل این مشکل کافی است ورودی‌ها را اعتبارسنجی کنید تا مانع پیاده‌سازی موفقیت‌آمیز این مدل حمله‌ها باشید. 

حملات سرریز بافر (Buffer Overflow Attacks)

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

شکل ۲

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

چرا آسیب‌پذیری در برنامه‌های کاربردی وجود دارد؟ 

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

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

  • مدیریت نامناسب ورودی: مدیریت و ارزیابی ورودی یکی دیگر از وظایف مهم برنامه‌نویسان و توسعه‌دهندگان نرم‌افزار است. هر زمان که داده‌ها به یک برنامه ارسال می‌شوند، برنامه‌نویس باید آن داده‌ها را اعتبارسنجی کند و از مناسب بودن آن‌ها اطمینان حاصل کند. 

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

  • مدیریت نادرست خطا: مدیریت خطا یکی دیگر از وظایف کلیدی برنامه‌نویسان است. برنامه‌نویسان باید اطمینان حاصل کنند که هرگونه خطای تولیدشده در برنامه را به‌دام می‌اندازند و آن خطاها را به‌طور مناسب مدیریت می‌کنند تا برنامه با مشکل جدی روبرو نشود. علاوه بر این، هنگامی که کدنوسی نرم‌افزار به‌پایان رسید، باید به‌دنبال شناسایی خطا باشید. مدیریت نادرست خطا می‌تواند منجر به سوء‌استفاده از برنامه شود.
  • پیکربندی پیش‌فرض: هنگام نصب نرم‌افزار یا سیستم‌ها، مطمئن شوید که پیکربندی پیش‌فرض را تا حد امکان تغییر دهید. هکرها تنظیمات پیش‌فرض محصولات را می‌شناسند و یاد می‌گیرند که چگونه از تنظیمات پیش‌فرض برای سوءاستفاده از سیستم‌ها استفاده کنند. شما باید پیش‌فرض‌ها را تغییر دهید تا هکرها شانس کمتری برای نفوذ به برنامه‌ها داشته باشند. 
  • پیکربندی نادرست یا پیکربندی ضعیف: بخش عمده‌ای از حمله‌های هکری به‌دلیل پیکربندی نادرست یا ضعیف سیستم‌عامل و برنامه‌های کاربردی انجام می‌شوند. در ارتباط با نرم‌افزارهای مهمی مثل SQL Server، Exchange Server و نمونه‌های مشابه باید اطمینان حاصل کنید که پیکربندی درستی را اعمال کرده‌اید. 
  • Weak cipher: یکی از بزرگ‌ترین مشکلات برنامه‌های کاربردی دانش کم برنامه‌نویسان در زمان به‌کارگیری الگوریتم‌های رمزنگاری است. متاسفانه برخی از برنامه‌هایی که توسط کاربران سیستم‌عامل ویندوز و اندروید استفاده می‌شود از فناوری‌ها یا پروتکل‌های رمزگذاری ضعیف استفاده می‌کنند. به‌طور ‌مثال، در برخی برنامه‌ها و سفت‌افزارها برای رمزگذاری داده‌ها از الگوریتم متقارن DES یا 3DES استفاده می‌شود. این رمزگذاری ضعیف است و باید با الگوریتم‌های قوی‌تری مثل AES جایگزین شود. مثال دیگر جایگزینی پروتکل‌های رمزگذاری ضعیف‌تر مثل TLS 1.0 و TLS 1.1 با نمونه جدیدتر TLS 1.3 است.
  • تهدیدات روز صفر: یکی از شایع‌ترین آسیب‌پذیری‌هایی که بسیاری از شرکت‌ها را قربانی می‌کند، تهدید روز صفر است که اشاره به آسیب‌پذیری ناشناخته‌ای دارد که فروشنده هنوز از آن آگاه نیست، یا به‌تازگی از آن آگاه شده است. در آسیب‌پذیری روز صفر، زمان کافی برای عرضه وصله وجود ندارد و در نتیجه هکرها می‌توانند در فرصت کوتاهی از آن استفاده کنند. بهترین راه مقابله با این حمله، به‌کارگیری سامانه‌های تشخیص و پیشگیری از نفوذ است. 

کلام آخر

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

علاوه بر این، مجموعه خط‌مشی‌ها، چک‌لیست‌ها و الگوهایی وجود دارد که کمک می‌کنند هنگام کدنویسی از اشتباهات رایج دوری کنید. با این‌حال، دقت کنید هر زبان برنامه‌نویسی الگوهای امنیتی خاص خود را دارد و این‌گونه نیست که قواعد مذکور در مورد تمامی زبان‌های برنامه‌نویسی صدق کند. به‌طور مثال، سی‌شارپ با ارائه مفهومی به‌نام Garbage Collection روند کدنویسی را برای برنامه‌نویسان ساده کرد، در حالی که زبان‌هایی مثل سی فاقد چنین ویژگی‌ای هستند و برنامه‌نویسان در هنگام تخصیص حافظه به اشیاء پویا باید خود حافظه را آزاد کنند.

ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را می‌توانید از کتابخانه‌های عمومی سراسر کشور و نیز از دکه‌های روزنامه‌فروشی تهیه نمائید.

ثبت اشتراک نسخه کاغذی ماهنامه شبکه     
ثبت اشتراک نسخه آنلاین

 

کتاب الکترونیک +Network راهنمای شبکه‌ها

  • برای دانلود تنها کتاب کامل ترجمه فارسی +Network  اینجا  کلیک کنید.

کتاب الکترونیک دوره مقدماتی آموزش پایتون

  • اگر قصد یادگیری برنامه‌نویسی را دارید ولی هیچ پیش‌زمینه‌ای ندارید اینجا کلیک کنید.

ایسوس

نظر شما چیست؟