تست نفوذ
تست نفوذ (penetration testing) عبارت است از شبیهسازی حملات واقعی جهت ارزیابی مخاطرات مربوط به نقض امنیتی بالقوه. در تست نفوذ، تسترها نه تنها آسیبپذیریهایی را که میتواند توسط مهاجمان مورد استفاده قرار گیرد، کشف میکنند، بلکه در صورت امکان، آسیبپذیریها را به منظور ارزیابی آنچه که ممکن است مهاجمان بعد از بهرهبرداری موفق به دست بیاورند، مورد استفاده قرار میدهند.
در مواقعی یک خبرنامه در مورد آسیب یک شرکت بزرگ توسط یک حمله سایبری منتشر میشود. اغلب مهاجمان از آخرین و بزرگترین zero-day ها (آسیب پذیریهای وصله نشده توسط ناشران نرم افزاری) استفاده نمیکنند. شرکتهای بزرگ با بودجههای قابل ملاحظه امنیتی، قربانی آسیبپذیریهای تزریق SQL در وب سایتهایشان، حملات مبتنی بر مهندسی اجتماعی علیه کارکنان، کلمات عبور ضعیف در سرویسهای اینترنتی و غیره هستند. به عبارت دیگر، شرکتها در حال از دست دادن دادههای خصوصی و افشای اطلاعات شخصی مشتریان خود از طریق حفرههای امنیتی قابل اصلاح میباشند. در تست نفوذ، این مسائل را قبل از اینکه یک حمله انجام شود، پیدا کرده و توصیه میشود چگونه آنها را تعمیر و از آسیبپذیریهای آینده جلوگیری نمود.
دامنه تستهای نفوذ شما از مشتری به مشتری متفاوت خواهد بود. بعضی از مشتریان وضعیت امنیتی عالی دارند، در حالی که برخی دیگر آسیبپذیریهایی دارند که به مهاجمین اجازه میدهد در محیطشان رخنه کرده و دسترسی به سیستم های داخلی را به دست آورند.
شما همچنین میتوانید ارزیابی یک یا چند برنامه کاربردی وب سفارشی را انجام دهید. شما ممکن است حملات مبتنی بر مهندسی اجتماعی و سمت مشتری را برای دسترسی به شبکه داخلی مشتری اجرا کنید. بعضی از تستهای نفوذ نیازمند آن هستند که مانند کارمند داخلی عمل کنید - یک کارمند مخرب یا مهاجم که قبلا در محیط رخنه کرده است - همانطور که یک تست نفوذ داخلی انجام میدهید. برخی از مشتریان، یک تست نفوذ خارجی را درخواست میکنند که در آن یک حمله از طریق اینترنت شبیهسازی گردد. برخی دیگر ممکن است ارزیابی امنیت شبکههای بیسیم در دفتر کاری خود را تقاضا نمایند. در بعضی موارد ممکن است حتی کنترلهای امنیتی فیزیکی مشتری را بررسی کنید.
مراحل تست نفوذ
تست نفوذ با مرحله پیشبرد مشارکت (pre-engagement) آغاز میشود که شامل گفتگو با مشتری در مورد اهداف تست نفوذ، نگاشت دامنه (وسعت و پارامترهای تست) و غیره است. وقتی تستر نفوذ و مشتری در مورد دامنه، فرمت گزارش و سایر موضوعات به توافق رسیدند، تست واقعی آغاز میشود.
مراحل تست نفوذ
در مرحله جمعآوری اطلاعات، تستر نفوذ اطلاعات موجود در مورد کلاینت را جستجو میکند و راههای بالقوه اتصال به سیستمهای آن را شناسایی میکند. در مرحله مدل سازی تهدید (threat modeling) اگر یافته ها اجازه دهد مهاجم به سیستم وارد شود، تستر از این اطلاعات برای تعیین ارزش هر یافته و تأثیر آن بر مشتری استفاده میکند. این ارزیابی به تستر نفوذ اجازه میدهد تا برنامه عملیاتی و روشهای حمله را توسعه دهد.
پیش از این تستر نفوذ میتواند حمله به سیستمها را شروع کند و تحلیل آسیبپذیری را انجام دهد. در این مرحله، تستر نفوذ تلاش میکند آسیبپذیریهای موجود قابل استفاده در مرحله بهرهبرداری در سیستمها را کشف کند. یک بهره برداری موفق ممکن است به مرحله پس از بهره برداری (post-exploitation) منجر شود. در این حالت نتیجه بهرهبرداری برای یافتن اطلاعات اضافی، اطلاعات حساس، دسترسی به سیستمهای دیگر و غیره استفاده میشود.در نهایت در مرحله گزارش، تستر نفوذ یافتهها را برای مدیران و کارشناسان فنی خلاصه میکند.
1. پیشبرد مشارکت
قبل از آغاز تست نفوذ، تسترهای نفوذ تراکنشهای پیشبرد مشارکت با مشتری را انجام میدهند تا اطمینان حاصل شود که همه در صفحه یکسان از تست نفوذ هستند. عدم ارتباط بین تستر نفوذ و مشتری که منتظر اسکن آسیبپذیری ساده است، میتواند منجر به یک وضعیت دشوار شود زیرا تستهای نفوذ مزاحمت بیشتری ایجاد میکنند.
مرحله پیشبرد مشارکت، زمانی است که شما باید وقت خود را برای درک اهداف کسب و کار مشتری برای تست نفوذ در نظر بگیرید. اگر این اولین تست نفوذ آنهاست، چه چیزی موجب شده است تا تستر نفوذ را پیدا کنند؟ در مورد افشای چه مواردی، بیشتر نگران میشوند؟ آیا آنها دستگاههای شکنندهای دارند که هنگام تست باید مراقب باشید؟ سوالاتی مربوط به کسب و کار مشتری بپرسید. چه موضوعاتی برای آنها مهمتر است؟ به عنوان مثال، برای یک فروشنده اینترنتی آنلاین، ساعتهای خرابی، به معنی از دست رفتن هزاران دلار درآمد میباشد. برای یک بانک محلی، داشتن سایتهای بانکی آنلاین که برای ساعات کمی خراب میشوند ممکن است تعداد اندکی از مشتریان را آزار دهد، اما این خرابی تقریبا به اندازهی مصالحه از یک پایگاه داده کارت اعتباری مخرب نیست. برای یک کارشناس امنیت اطلاعات، داشتن صفحه اصلی حاوی پیامهای نامتعارف از طرف مهاجمین میتواند به اعتبار سازمان خدشه وارد کرده و منجر به از بین رفتن بخش اعظم درآمد سازمان خواهد شد.
موارد مهم دیگر برای بحث و توافق در مرحله پیشبرد مشارکت در تست نفوذ عبارتند از:
- دامنه
چه آدرسهای IP یا هاست در دامنه مد نظر قرار دارند و کدامها در دامنه نیستند؟ کدام نوع از اقدامات انجام شده، مجوز لازم از سوی مشتری را دارد؟ آیا شما مجاز به بهرهبرداری هستید و به طور بالقوه سرویس را کاهش میدهید یا باید ارزیابی را محدود کنید تا فقط آسیبپذیریهای احتمالی را شناسایی کنید؟ آیا مشتری متوجه است که حتی یک اسکن ساده پورت میتواند سرور یا روتر را down کند؟ آیا شما مجاز به انجام یک حمله مبتنی بر مهندسی اجتماعی هستید؟
- پنجره تست
مشتری ممکن است بخواهد فقط در ساعتهای خاص یا در روزهای خاص، تست را انجام دهید.
- اطلاعات تماس
اگر چیزی جدی پیدا کنید باید با چه کسی تماس بگیرید؟ آیا مشتری انتظار دارد که 24 ساعته در شبانه روز با کسی تماس بگیرید؟ آیا آنها ترجیح میدهند که از رمزگذاری برای ارسال ایمیل استفاده کنید؟
- کارت کسب مجوز در تست نفوذ
اطمینان حاصل کنید که مجوز انجام تست نفوذ را دارید. اگر یک هدف متعلق به شرکت نیست (به عنوان مثال، به این علت که آن توسط یک شخص ثالث میزبانی شده است)، اطمینان حاصل کنید که مشتری تأیید رسمی از شخص ثالث برای انجام تست نفوذ را داراست. صرف نظر از این، اطمینان حاصل کنید که قرارداد شما حاوی بیانیهای است که مسئولیت شما را در موارد غیر منتظره مشخص میکند و اجازه کتبی برای انجام تست را دریافت کنید.
2. جمعآوری اطلاعات
مرحله بعدی، جمع آوری اطلاعات است. در طی این مرحله، منابع اطلاعاتی در دسترس را آزادانه تحلیل میکنید. این فرآیند به عنوان جمع آوری اطلاعات منبع باز (OSINT) شناخته شده است. همچنین از ابزارهایی مانند اسکنرهای پورت استفاده میکنید تا بدانید چه سیستمهایی در اینترنت یا شبکه داخلی و همچنین چه نرم افزار در حال اجرایی وجود دارد.
جمع آوری اطلاعات
3. مدل سازی تهدید
بر اساس دانش حاصل شده در مرحله جمعآوری اطلاعات، ما به سمت مدلسازی تهدید حرکت میکنیم. در اینجا ما در جایگاه مهاجمان فکر میکنیم و برنامههای حمله را براساس اطلاعاتی که جمعآوری کردهایم، توسعه میدهیم. به عنوان مثال، اگر مشتری نرم افزار اختصاصی را توسعه دهد، یک مهاجم میتواند این سازمان را از طریق دسترسی به سیستمهای توسعه داخلی خود، که در آن کد منبع توسعه یافته و تست شده، و فروش اسرار تجاری شرکت به یک شرکت رقیب، از بین ببرد. براساس اطلاعاتی که در جمعآوری اطلاعات به دست آوردهایم، استراتژیهایی برای نفوذ به سیستمهای مشتری ایجاد میکنیم.
4. تحلیل آسیبپذیری
بعد از مرحله فوق، تسترهای نفوذ فعالانه به کشف آسيبپذيریها میپردازند تا مشخص شود که چگونه استراتژیهای بهرهبرداری آنها ممکن است موفق باشد. بهرهبرداریهای ناموفق میتواند سرویسها را از کار بیندازد، هشدارهای تشخیص نفوذ را تنظیم کند و در غیر این صورت شانس بهرهبرداری موفقیت را از بین ببرد. اغلب در این مرحله، تسترهای نفوذ، اسکنر آسیبپذیری را اجرا میکنند که از پایگاههای دادهی آسیبپذیر و یک سری از چکهای فعال استفاده میکنند تا بهترین حدس را در مورد آسیبپذیریهای موجود در یک سیستم مشتری نشان دهند. اما هر چند که اسکنر آسیبپذیری ابزار قدرتمندی است، آنها نمیتوانند به طور کامل جایگزین تفکر انتقادی شوند. بنابراین در این مرحله، تحلیل دستی را اجرا کرده و نتایج خود را بازنگری میکنیم.
تحلیل آسیب پذیری
5. بهرهبرداری (exploitation)
در اینجا بهرهبرداریها را در مقابل آسیبپذیریهایی که (گاهی با استفاده از یک ابزار مانندMetasploit ) کشف کردهایم، در تلاش برای دسترسی به سیستمهای مشتری اجرا میکنیم. همانطور که میبینید، بعضی از آسیبپذیریها، مانند ورود به سیستم با گذرواژههای پیش فرض، به راحتی قابل استفاده هستند.
6. مرحله پس از بهره برداری (post-exploitation)
تستهای نفوذ در مرحله پسا بهرهبرداری، درست بعد از بهرهبرداری آغاز میشوند. شما وارد سیستم شده اید، اما آیا این نفوذ واقعا برای مشتری مهم است؟ اگر یک سیستم موروثی بدون وصله را بشکنید که بخشی از یک دامنه نیست یا به نحوی دیگر به اهداف با ارزش بالا متصل شده است و این سیستم حاوی هیچ اطلاعاتی برای جذب مهاجم نیست، خطر این آسیبپذیری به مراتب کمتر از آن است که بتوانید از آن به عنوان یک کنترل کننده دامنه یا یک سیستم توسعه مشتری استفاده کنید.
پس از بهرهبرداری، اطلاعاتی در مورد سیستم تحت حمله جمعآوری میکنیم، فایلهای مهم را جستجو میکنیم، تلاش میکنیم امتیازات را در صورت لزوم افزایش دهیم و غیره. برای مثال، ممکن است هشهای رمزنگاری را برای دیدن اینکه آیا میتوانیم آنها را معکوس کنیم یا از آنها برای دسترسی به سیستمهای اضافی استفاده کنیم، رها کنیم. همچنین ممکن است سعی کنیم از دستگاه بهرهبرداری شده برای حمله به سیستمهایی که قبلا به آنها دسترسی نداشتیم، استفاده کنیم.
7. گزارش نویسی
مرحله نهایی تست نفوذ، ارائه گزارش است. این جایی است که یافتههای خود را به مشتری به شیوهای قابل درک انتقال میدهیم. به آنها میگوییم که آنها به درستی کار میکنند، جایی که آنها باید وضعیت امنیتی خود را بهبود ببخشند، چطور وارد شوید، آنچه پیدا کردید، چگونه مشکلات را حل کنید و غیره.
گزارش نویسی در تست نفوذ
نوشتن یک گزارش خوب تست نفوذ، یک هنر است که نیازمند تمرین برای کسب مهارت است. شما باید یافتههای خود را به وضوح به همه، از کارمندان IT متعهد برای رفع آسیبپذیریها تا مدیران بالارتبه انتقال دهید که در مورد تغییرات با ممیزیهای خارجی اظهار نظر کنند. به عنوان مثال، اگر یک شخص غیرفنی عبارت زیر را بخواند "من از MSOS-067 برای گرفتن یک shell استفاده کردم"، ممکن است تصور کند منظور شما از shell یک خرچنگ است! (در حالیکه منظور، گرفتن یک امکان ارتباطی برای نفوذ به سیستم می باشد). گزارش تست نفوذ باید شامل خلاصه اجرایی و گزارش فنی باشد، همانطور که در بخشهای زیر بحث شده است.
8. خلاصه اجرایی
خلاصه اجرائی اهداف آزمون را توصیف میکند و سطح بالایی از بررسی اجمالی یافتهها را ارائه میدهد. مخاطب مورد نظر، مدیران مسئول برنامه امنیتی هستند. خلاصه اجرائی باید شامل موارد زیر باشد:
- پیش زمینه
هدف آزمون را توصیف میکند و هر شرایطی که ممکن است برای مدیران ناشناخته باشد، مانند آسیبپذیری و اقدامات متقابل را تعریف میکند.
- وضعیت کلی
یک مرور کلی از اثربخشی تست، مسائلی که در این مورد یافت شده است (مانند بهرهبرداری از آسیبپذیری مایکروسافتMSOS-067 ) و مسائل عمومی که موجب آسیبپذیری میشود، مانند عدم مدیریت وصله (patch).
- مشخصات ریسک
رتبه کلی وضعیت امنیت سازمان در مقایسه با سازمانهای مشابه. لازم است یک توصیفی از رتبه بندی نیز ارائه شود.
مشخصات ریسک
- یافته های عمومی
خلاصه کلی از مسائل شناسایی شده، همراه با آمار و شاخص هایی برروی میزان اثربخشی اقدامات متقابل.
- خلاصه پیشنهادی
یک بررسی اجمالی سطح بالا از وظایف، جهت مقابله با مسائل کشف شده در تست نفوذ.
- نقشه راه استراتژیک
اهداف کوتاه مدت و بلند مدت را جهت بهبود وضع امنیتی به مشتریان تخصیص دهید. به عنوان مثال، شما ممکن است به آنها بگوئید که برای تطبیق نگرانیهای کوتاه مدت، وصلههای خاصی را اعمال کنند اما بدون یک برنامه بلند مدت برای مدیریت وصله، مشتری پس از انتشار وصلههای جدید، در همان موقعیت قرار خواهد گرفت.
نقشه راه استراتژیک
9. گزارش فنی
این قسمت از گزارش، جزئیات فنی تست را ارائه میدهد که باید شامل موارد زیر باشد:
- مقدمه
فهرستی از جزئیات مانند محدوده، مخاطبین و غیره میباشد.
- جمعآوری اطلاعات
شامل جزئیات یافتهها در مرحله جمعآوری اطلاعات است. علاقهی خاصی، به رد پای اینترنت مشتری است.
- ارزیابی آسیبپذیری (vulnerability assessment)
جزئیات یافتههای مرحله تحلیل آسیبپذیری تست است.
- تأیید بهرهوری/آسیبپذیری
جزئیات یافتههای مرحله بهرهبرداری از تست است.
- پس از بهرهبرداری
جزئیات یافتههای مرحله پس از بهرهبرداری تست می باشد.
- خطر/در معرض قرار گرفتن
توصیف کمی از ریسک کشف شده است. این بخش، اگر آسیبپذیری شناسایی شده توسط یک مهاجم مورد بهرهبرداری قرار گیرد، میزان خسارت را تخمین میزند.
- نتیجه
مرور نهایی تست نفوذ.
تست نفوذ برنامه کاربردی تحت وب
اگر چه اسکنرهای خودکار در شناسایی آسیب پذیری های شناخته شده در برنامه های کاربردی وب خوب عمل می کنند، اما بسیاری از مشتریان، برنامه های تحت وب سفارشی تولید میکنند. هرچند ابزارهای تست نفوذ میتوانند حملات علیه زمینه های ورود کاربر در برنامه های وب سفارشی را به صورت خودکار انجام دهند، اما هیچ چیز نمیتواند برای یافتن مسائل امنیتی در این برنامه ها، یک تستر نفوذ خوب را با یک پروکسی جایگزین کند.
همانند تمام نرم افزارها، در برنامه های کاربردی تحت وب ممکن است مسائلی هنگام ورود غیراصولی به سیستم وجود داشته باشد. به عنوان مثال، هنگامی که یک برنامه داده ها را از یک پایگاه داده بر اساس ورودی کاربر میخواند، برنامه ورودی های خاصی همچون نام کاربری و رمز عبور را انتظار دارد. اگر در عوض، کاربر ورودی خاصی برای ایجاد پرس و جوهای جدید در پایگاه داده وارد کند، ممکن است او بتواند دادهها را از پایگاه داده به سرقت ببرد، احراز هویت موجود را دور بزند، و یا حتی یک سری دستور در سیستم پایه ای اجرا کند.
در این بخش، ما در جستجوی برخی از آسیب پذیریهای رایج در برنامه های وب با استفاده از یک مثال خواهیم بود: یک کتابفروشی ساده با چندین مسائل امنیتی که اغلب در برنامه های وب یافت می شوند.
استفاده از پروکسی Burp
ما می توانیم از یک پروکسی برای ضبط درخواست و پاسخ بین مرورگر و برنامه وب استفاده کنیم تا بتوانیم دقیقا همان چیزی را که ازسمت سرور فرستاده می شود ببینیم. کالی-لینوکس همراه با نسخه رایگان Burp Suite ، یک بستر آزمایشی برای برنامه های وب است که دارای ویژگی پروکسی است. Burp شامل سایر اجزای مفید مانند Burp Spider میباشد که میتواند در محتویات و قابلیتهای برنامه crawl کند و Burp Repeater که به شما اجازه میدهد تا درخواست ها را تغییر داده و مجددا به سمت سرور ارسال کنید. در حال حاضر، ما روی تب پروکسی Burp تمرکز میکنیم.
برای راهاندازی Burp Suite در کالی-لینوکس، به قسمت برنامه های کاربردی در سمت چپ بالای GUI بروید و سپس برروی Kali Linux < Fuzzers Web Application < burpsuiteکلیک کنید، همانطور که در تصویر نشان داده شده است.
مسیر اجرای برنامه Burp در کالی لینوکس
همانطوری که در تصویر زیر نشان داده شده است، روی تب Proxy کلیک کنید. به طور پیش فرض، دکمه Intercept is on باید انتخاب شود تا Burp Suite درخواست خروجی از پیکربندی مرورگر وب (browser) را متوقف کند و آن را برای استفاده از Burp به عنوان یک پروکسی برای ترافیک وب نگه دارد. این تنظیم به ما اجازه می دهد تا قبل از فرستادن درخواست های وب به سمت سرور، جزئیات آن را مشاهده و حتی تغییر دهیم.
رابط کاربری پروکسی Burp
اکنون ما باید از مرورگر خود در کالی-لینوکس استفاده کنیم تا ترافیک وب را از طریق Burp Suite پروکسی کنیم.
- مرورگر Iceweasel را باز کنید، به Edit Advanced < Preferences < بروید و تب Network را انتخاب کنید.
- در سمت راست تنظیمات اتصال را کلیک کنید.
- در پنجره تنظیمات اتصال که در تصویر زیر نشان داده شده است، پیکربندی دستی پروکسی را انتخاب کرده و آدرس IP 127.0.0.1 و پورت 8080 را وارد کنید. اینکار به Iceweasel میگوید که ترافیک پروکسی را از طریق localhost در پورت 8080 ارسال کند، که البته پورت پیش فرض برای پروکسی Burp است.
تنظیم پروکسی در Iceweasel
برای اطمینان از اینکه lceweasel تمامی ترافیک را از Burp Suite پروکسی میکند، به آدرس زیر بروید: http: / / 192.168.20.12 / bookservice.
همانطور که در تصویر زیر نشان داده شده است، اتصال در مرورگر برقرار شده و درخواست HTTP GET برای صفحه اصلی سایت کتابفروشی توسط پروکسی Burp گرفته میشود.
ضبط شدن درخواست HTTP GET
ما می توانیم جزئیات درخواست HTTP GET ارسال شده به سرور در صفحه وب کتابفروشی را بخوانیم. همانطور که بعدا خواهیم دید، می توانیم قبل از فرستادن درخواست به سرور، تغییرات لازم را اعمال کنیم. اما در حال حاضر، با کلیک کردن بر روی دکمه Forward، درخواست را به جلو میبریم. با بازگشت به صفحهی مرورگر، میبینیم که سرور، صفحه اصلی سایت کتابفروشی را برایمان ارسال کرده است، همانطور که در تصویر زیر نشان داده شده است.
سایت کتابفروشی
حال سعی کنید یک حساب کاربری ایجاد کنید. برروی ورودی در سمت چپ بالای صفحه کلیک کرده و سپس از طریق پروکسی درخواست را به سرور منتقل کنید. برای دسترسی به صفحه ثبت نام، با کلیک کاربر جدید و ارسال درخواست به سرور، همین کار را انجام دهید. روی دکمه login در سمت چپ بالای صفحه کلیک کنید و سپس از طریق پروکسی، درخواست را به سرور منتقل کنید. برای دسترسی به صفحه ثبت نام، با کلیک کاربر جدید و ارسال درخواست به سرور، همین کار را انجام دهید. برای دسترسی به صفحه ثبت نام، با کلیک برروی New User و ارسال درخواست به سرور، کار قبل را تکرار کنید.
ثبت نام یک حساب جدید
یک نام کاربری، رمز عبور و آدرس ایمیل وارد کنید. سپس درخواست را با کلیک برروی Go ارسال کنید. درخواست باید در Burp Proxy ضبط شود، همانطور که در تصویر زیر نشان داده شده است.
درخواست ضبط شده در Burp
همانطور که در تصویر زیر میبینید، علاوه بر بررسی درخواست خام، می توانید برروی تب Params در بالای پنجره درخواست در Burp Suite کلیک کنید تا پارامترهای درخواست را در فرمت قابل خواندن نمایش دهد.
پارامترهای درخواست
به عنوان مثال، صفحه نمایش نشان میدهد که کاربر حاوی مقدار georgia، رمز عبور حاوی password و ایمیل حاوی georgia[at]bulbsecuritydotcom است. شما می توانید این فیلدها را مستقیما در پروکسی تغییر دهید. برای مثال، اگر گذرواژه جورجیا را قبل از ارسال درخواست به سرور به password تغییر دهید، سرور رمز عبور جورجیا را برابر password ست میکند، زیرا سرور هرگز درخواست اولیه از مرورگر که درخواست گذرواژه برابر با password بوده را ندیده است. پروکسی به شما اجازه می دهد جزئیات هر درخواست سرور را مشاهده کنید. اگر در هر لحظه نیازی به ترافیک پروکسی نداشته باشید، روی دکمه Intercep is on کلیک کنید تا Intercept غیرفعال شود و ترافیک را بدون تعامل با کاربر به سرور منتقل کند. اگر می خواهید یک درخواست خاص را دریافت کنید، دکمه را دوباره روشن کنید.
تزریق پرس و جو (SQL-Injection)
بسیاری از برنامه های کاربردی تحت وب، داده ها را در یک پایگاه داده (معمولا پایگاه داده مبتنی بر SQL) ذخیره می کنند. ما معمولا دسترسی مستقیم به اجرای پرس و جوهای SQL در پایگاه داده پسزمینه سایت برنامه کاربردی وب را نداریم. با این حال، اگر برنامه نویس نتواند ورودی کاربر را در هنگام تعامل با پایگاه داده پاکسازی کند، ممکن است بتوانید یک حمله تزریق SQL را برای دستکاری پرس و جوی ارسال شده به آن انجام دهید. حملات تزریق موفق SQL می تواند داده ها را از پایگاه داده بخواند، داده ها را تغییر دهد، پایگاه داده را خاموش یا نابود کرده، و در بعضی موارد حتی دستورات را در سیستم عامل اصلی اجرا کند (که می تواند بسیار قدرتمند باشد زیرا سرورهای پایگاه داده اغلب به عنوان کاربرانی که دارای امتیاز هستند، اجرا میشوند).
یک مکان معمول برای بررسی مسائل تزریق SQL، در صفحه ورود به سیستم است. بسیاری از برنامه های کاربردی تحت وب، اطلاعات کاربر را در یک پایگاه داده ذخیره میکنند. بنابراین می توانیم از پرس و جوی SQL استفاده کنیم تا کاربر صحیح را بر اساس نام کاربری و رمز عبور ارائه شده توسط کاربر استخراج کنیم. اگر برنامه نویس ورود کاربر را طبق اصول صحیح برنامه نویسی توسعه نداده باشد، می توان پرس و جوهای SQL را برای حمله به پایگاه داده ایجاد کرد. یک مثال از تزریق SQL که می تواند توسط یک مهاجم مورد استفاده قرار گیرد، در اینجا نشان داده می شود:
چه اتفاقی میافتد اگر یک مهاجم نام کاربری را برابر'' یا' '1 '=' 1 و رمز عبور کاربر' ' یا' 1 '=' 1' قرار دهد؟ عبارت SQL این گونه میشود:
از آنجا که'' یا' '1 '=' 1 همیشه درست خواهد بود، این دستور SELECT ، نام کاربری اول موجود در جدول کاربران را بدون در نظر گرفتن نام کاربری و رمز عبور باز میگرداند.
برنامه ما از یک پایگاه داده SQL برای ذخیره سوابق کتاب موجود در فروشگاه استفاده میکند و هنگامی که ما یک کتاب را بر روی صفحه اصلی انتخاب میکنیم، جزئیات آن از پایگاه داده MS SQL گرفته میشود. برای مثال، اگر برروی پیوند Details برای اولین کتاب در سایت کلیک شود، URL درخواست شده اینگونه خواهد بود:
جزئیات کتاب بر اساس نتایج حاصل از پرس و جوی پایگاه داده برای رکورد با ID 1 پر شده است.
تست آسیب پذیری تزریق SQL
یک تست معمولی برای بررسی آسیب پذیریهای تزریق SQL، استفاده از یک علامت نقل قول برای بستن پرس و جوی SQL است. اگر یک آسیب پذیری تزریق SQL وجود داشته باشد، اضافه کردن آن علامت نقل قول باید برنامه را به یک خطای SQL ببرد، زیرا پرس و جو به عنوان بخشی از کد مربوطه بسته میشود و نقل قول اضافی تنها باعث می شود که گرامر SQL نادرست باشد. این خطا به ما می گوید که می توانیم پرس و جوهای SQL را با استفاده از پارامتر id به پایگاه داده سایت تزریق کنیم.
بیایید اینکار را با فرستادن پرس و جویی با پارامتر id 1' امتحان کنیم، همانطوریکه در اینجا نشان داده شده است.
همچنانکه انتظار می رود، برنامه یک صفحه خطا نشان میدهد، مبنی بر اینکه گرامر SQL ما نادرست است. این مطلب در تصویر زیر نشان داده شده است.
برنامه یک خطای SQL را شناسایی کرده است.
به طور خاص، به پیام "علامت نقل قول بسته نشده پس از رشته کاراکتر" در پرس و جوی SQL توجه داشته باشید.
لازم به ذکر است که برای تمام برنامه های کاربردی که برای تزریق SQL آسیب پذیرند، پیام های خطا واضح نیستند. در واقع، یک کلاس کامل از آسیب پذیری های تزریق SQL کور (blind) وجود دارد، که پیام های خطا در مورد تزریق نشان داده نمی شود، حتی اگر مشکل تزریق هنوز هم وجود داشته باشد.
بهره برداری از آسیب پذیری تزریق SQL
اکنون که میدانیم یک آسیب پذیری تزریق SQL در این سایت وجود دارد، ما میتوانیم از آن برای اجرای درخواستهای اضافی در پایگاه داده بهره برداری کنیم که البته برنامه نویس هرگز آنها را در نظر نگرفته است.
برای مثال می توانید نام اولین پایگاه داده را با استفاده از پرس و جوی زیر پیدا کنید:
پرس و جو یک پیام خطا نمایش می دهد:
Conversion Jailed when converting the nvarchar value 'BookApp' to data type int که به ما می گوید نام اولین پایگاه داده BookApp است، همانطور که تصویر زیر نشان داده شده است :
پیام خطا نام پایگاه داده را نشان میدهد
استفاده از SQlMap
ما می توانیم از ابزارهایی استفاده کنیم که به طور خودکار می تواند پرس و جوهای SQL را برای انجام کارهای مختلف در سایت با استفاده از تزریق SQL ایجاد کند. تنها چیزی که نیاز داریم یک نقطه تزریق است؛ این ابزار مابقی کار را انجام میدهد. به عنوان مثال، فهرست زیر نشان میدهد که چگونه با دادن یک آدرس تزریقی بالقوه به ابزاری در Kali SQLMap، آزمون SQLMap برای آسیب پذیری تزریق SQL انجام میشود و درخواستهای تزریق را انجام میدهد.
dumpکردن پایگاه داده با SQLMap URL را برای آزمون با آپشن -u مشخص کنید (1). آپشن --dump (2) محتویات پایگاه داده را کپی برداری (dump) میکند - در این مورد، منظور جزئیات کتابها است. همچنین می توانیم از SQLMap استفاده کنیم تا سعی کنیم دسترسی به فرمان shell را در سیستم پایهای بدست آوریم. پایگاه داده های MS SQL حاوی یک رویه ذخیره شده به نام xp_cmdshell است که به ما دسترسی command-shell می دهد، اما اغلب غیر فعال است. خوشبختانه SQLMap سعی میکند دوباره آن را فعال کند. فهرست زیر نشان می دهد که چگونه میتوان یک command-shell را بر روی سیستم مقصد سایت موردنظر با استفاده از SQLMap دریافت کرد.
دسترسی xp_cmdshell از طریق تزریق SQL
همانطور که در فهرست فوق مشاهده میکنید، ما یک shell را به عنوان سیستم میگیریم بدون اینکه نیازی به اعتبارسنجی پایگاه داده داشته باشیم. لازم به ذکر است که پایگاه داده MS SQL به هیچ وجه به پورت گوش نمیدهد. بنابراین ما نمی توانیم به طور مستقیم به آن دسترسی داشته باشیم.
یک مسئله تزریق SQL در وب سایت میزبان، به ما دسترسی کامل به سیستم را میدهد.
شرکت مهندس پیشگان آزمون افزار یاس، ابزارهای پیشرفته زیر را در حوزه تست نفوذ ارائه می دهد:
نویسنده : شرکت مهندس پیشگان آزمون افزار یاس
مراجع
[1]-Georgia Weidman, Penetration Testing A Hands-On Introduction to Hacking, 2014