
در این بخش از دوره آموزشی تست نفوذ سطح متوسط که برگرفته از دوره SEC642 می باشد به ادامه مبحث آشنایی با Blind SQL Injection می پردازیم.
query timing as output
در حال حاضر برخی از تکنیکهای رایج برای تزریق SQL کور مبتنی بر بولین را پوشش دادهایم. اکنون یک محدودیت دیگر هم اضافه میکنیم، که استخراج دادهها را حتی برای ما سختتر میکند، اما هنوز هم غیر ممکن نیست.
گاهی اوقات، یک آسیبپذیری تزریق SQL وجود دارد، اما در صورت وارد نمودن یک ورودی معتبر یا نامعتبر، به نظر میرسد که تفاوتی در خروجی صفحه برنامه کاربردی وب وجود نداشته باشد. هیچ نشانهای از موفقیت یا شکست وجود ندارد. در این شرایط، ما میتوانیم از یک کانال جانبی، غیر مرتبط با خروجی صفحه، برای تعیین اینکه آیا پرس و جوی ما موفق شدهاست یا نه، استفاده کنیم.
این تکنیک به زمانبندی درخواست HTTP و پاسخ آن بستگی دارد. تقریبا به طور عمومی، پرس وجوهای SQL مورد استفاده در برنامههای کاربردی وب به طور همزمان اتفاق میافتد تا به طور غیر همزمان. این بدان معنی است که ما، به عنوان یک مرورگر وب که درخواست صفحه را دارد، هیچ خروجی را از برنامه وب دریافت نمیکنیم تا زمانی که پرس وجوی SQL اجرای آن را به پایان برساند.
با قرار دادن مصنوعی تاخیر در پرس وجوی SQL براساس یک شرط، ما میتوانیم تعیین کنیم که آیا شرایط درست است یا خیر. ما از زمانی که طول میکشد تا پاسخ را به عنوان شاخص خود دریافت کنیم، استفاده خواهیم کرد.
در MySQL، این کار با یک عبارت IF شرطی انجام میشود که اگر درست باشد، تابع SLEEP اجرا شده و تاخیر زمانی اعمال میگردد و اگر غلط باشد، بدون هیچ گونه تاخیر زمانی، صفحه بارگذاری می شود. این ترکیب از اظهارات را می توان در هر جایی که انتظار میرود قرار داد.
در MSSQLs برای قرار دادن تاخیر زمانی از عبارت WAITfor DELAY ‘0:0:10’ استفاده می شود. این عبارت، همراه با یک شرط IF، میتواند تنها در انتهای یک عبارت SQL قرار داده شود. این کار اغلب با انباشت دو پرسش در یک درخواست(تزریق SQL مبتنی بر Stack)، یا با استفاده از Comment به عنوان Suffix به منظور حذف موثر هر چیزی که به انتهای ورودی کاربر اضافه میشود، انجام میشود.
این تکنیک میتواند کندتر از روشهای پیشین میباشد([s]/2 * QPL * Number_of_Characters) اما زمانی که تمام موارد دیگر با شکست مواجه میشوند، یک پشتیبان عالی خواهد بود.
side – channel data retrieval
علاوه بر تکنیکهایی که در حال حاضر پوشش داده شدهاند، در این بخش مروری کوتاه بر بعضی از دیگر حملات کانال جانبی موجود خواهیم داشت. این حملات با جزئیات پوشش داده نمیشوند زیرا ضرورت آنها بسیار کمتر از تکنیکهایی است که ما تا کنون پوشش دادهایم. هر یک از این تکنیکها در مورد استفاده از منابعی به غیر از خروجی خود برنامه برای بازیابی محتوای یک نتیجه پرسوجوی SQL بحث میکنند.
تاکنون مشاهده کردهایم که کانال جانبی زمانی (Time Based) مورد استفاده برای بازیابی خروجی مبتنی بر Boolean، به عنوان یکی از رایجترین حملات کانال جانبی، مورد استفاده قرار میگیرد. یک کانال جانبی دیگر که میتوانید از آن استفاده کنید، سیستمفایل و عملیاتهای مربوط به OS است.
برای مثال، اگر امکان اجرای فرمان دارید، میتوانید نتایج اجرای دستورات را به یک فایل ارسال کرده و از Netcat یا FTP برای انتقال دادهها استفاده کنید. همچنین میتوانید به همان روشی که از زمانبندی به عنوان شاخصی از موفقیت یا شکست استفاده میکنید، از ping نیز استفاده کنید. همچنین اگر شما اجازه نوشتن در دایرکتوری ریشه وب را دارید، میتوانید به سادگی نتایج را به یک فایل متنی در آن جا بنویسید و آن را از خود سرور وب دانلود نمایید.
همچنین، سامبا را فراموش نکنید. اگر شما توانایی نوشتن داخل یک فایلها را دارید، میتوانید از یک SMB Share که امکان نوشتن در آن وجود دارد و بر روی ماشین دیگری است که کنترل آن در اختیار شماست، استفاده نمایید.
حملات کانال جانبی بسیاری وجود دارد که به شدت به محیطی بستگی دارد که در آن عملیات Exploitation رخ میدهد. همانند دیگر بردارهای حمله، خلاقیت نیز یک دارایی ارزشمند برای تست کنندگان نفوذ است. ICMP، DNS،HTTP یا دیگر ترکیبات عملیات یا پروتکلهای فایل ممکن است برای پیاده سازی حملات کانال جانبی استفاده شود.
sqlmap tips
Sqlmap گزینههای بسیار مفیدی دارد و بررسی آنها بسیار ارزشمند است. در اینجا به چند نکته اشاره میکنیم که sqlmap را در شناسایی و همچنین بهرهبرداری از آسیبپذیریها کارآمدتر و بهتر میکنند.
علاوه بر کشف سنتی مبتنی برURL،sqlmap میتواند از دادههای جمعآوریشده با Burp Suite بهره ببرد. مشخص کردن دامنه میتواند مقدار درخواستها را محدود کند و میزبان یا دامنه مورد اسکن را مشخص کند.

پارامترهای خط فرمان میتوانند sqlmap را کارآمدتر کنند، که باعث میشود از پرس وجوهای کمتر با مجبور کردن آن برای تست تنها نقاط تزریق معتبر برای یک پایگاهداده خاص و / یا OS استفاده کند. Sqlmap همچنین گزینههای خط فرمان را برای مشخص کردن پیشوند و پسوند سفارشی فراهم میکند.
در جایی که sqlmap نمیتواند به طور خودکار این کار را انجام دهد، میتوانید از گزینههای –string یا –regex برای مشخص کردن اینکه کدام متن یا عبارت منظم نشاندهنده یک پرس وجوی معتبر است، استفاده کنید. این امر برای صفحاتی که شامل عناصر پویا، مانند یک Timestamp هستند، مهم است.
برای بهینه کردن آزمایش میتوانید انتخاب کنید که از کدام تکنیکها استفاده کنید. تکنیکهای موجود عبارتند از:
• (B)ooleanbased
• (E)rror-based
• (U)nion query
• (S)tacked query
• (T)ime based
• (Q)Inline
level انواع دیگری از تستها و پارامترها را برای اجرا مشخص میکند.
مقدار ریسک ۲، آزمونهای مبتنی بر زمان سنگین اضافی و ۳ آزمون مبتنی بر OR اضافی را به بررسی ها اضافه میکند، که ممکن است بر برنامه تاثیر بگذارد.
یک ستاره (*) برای مشخص کردن نقطه تزریق، به ویژه برای URL ها، REST API ها یا جایی که قابلیتMod_rewrite در حال اجرا است، استفاده میشود.
جهت مشاهده مستندات کامل مربوط به برنامه SQLmap به لینک زیر مراجعه نمایید:
github.com/sqlmapproject/sqlmap/wiki
sql injection tips
چند نکته برای انجام حمله تزریق SQL را همواره در نظر داشته باشید:
همیشه از ترکیبی از ابزارها و تستهای دستی استفاده کنید. اغلب یک نقطه ظاهرا واضح تزریق توسط ابزارهای خودکار از دست میرود. این امر برای برنامههای متن باز که در آن میتوان به طور مستقیم آسیبپذیری Injection را مشاهده کرد، مهم است.
False Negative میتواند رایج باشد و گاهی اوقات دور زدن آن آسان است. صفحات پویا یا پیچیده، تشخیص تفاوت بین یک پاسخ معتبر و نامعتبر برای تزریق مبتنی بر Boolean را برای ابزارهای خودکار دشوار میسازد. اگر به نظر میرسد که آسیبپذیری وجود دارد ولی یک ابزار آن را گزارش نکرده است، آن را به صورت دستی بررسی نمایید.
اگر یک آسیبپذیری SQL Injection به صورت دستی یافت میشود، از گزینههای sqlmap مانند –suffix، –prefix،–string و –regex استفاده کنید تا ابزار خودکار را برای دیدن آسیبپذیری هدایت کنید. بهرهبرداری اغلب نیازمند اجرای صدها Query است. حتی اگر اکتشاف به صورت دستی انجام شود، بهرهبرداری باید تقریبا همیشه به ابزارهای خودکار واگذار شود.