
در این بخش از دوره آموزشی تست نفوذ سطح متوسط که برگرفته از دوره SEC642 می باشد به مبحث آشنایی با SQL Injection می پردازیم.
SQL Injection: Injection Points
از بسیاری جهات، به عنوان تسترهای نفوذ، ما باید Developer هم باشیم. برای اجرای موفقیتآمیز حمله تزریق SQL، پرس و جوی نهایی ارسالشده به پایگاهداده باید یک پرس و جوی معتبر باشد که پایگاهداده آن را بپذیرد.
با توجه به اینکه ما به احتمال زیاد نیاز به انجام تعداد زیادی از Query ها در مقابل پایگاهداده بک اند داریم، ایجاد یک متدولوژی برای اجرای دلخواه و بازیابی خروجی هر Query که انتخاب میکنیم به نفع ما خواهد بود.
یکی از این روشها شامل انتخاب یک ترکیب پیشوند و پسوند است، که به طور انعطافپذیر اجازه میدهد تقریبا هر Query در بین آن قرار گیرد و هنوز هم به عنوان یک عبارت SQL معتبر عمل میکند.
پیشوند و پسوند براساس SQL بکار رفته در برنامه آسیبپذیر انتخاب میشوند. تصویر زیر چند نقطه تزریق نمونه را نشان میدهد که هر کدام به یک پیشوند و پسوند متفاوت برای ایجاد یک Query معتبر نیاز دارند.

SQL Injection: Discovery
فرآیند انتخاب یک پیشوند و جفت پسوند با ایجاد یک Baseline شروع میشود. هدف ما در این فرآیند شناسایی آن چیزی است که به عنوان ورودی کاربر تزریق میشود که حاوی یک پیشوند و پسوند است و به عنوان یک Query معتبر توسط پایگاهداده بک اند تفسیر میشود.
برای انجام این کار، ما باید ابتدا مشخص کنیم که چه پاسخی از برنامه کاربردی وب مربوط به یک Query معتبر بوده و چه پاسخی مربوط به یک Query نامعتبر میباشد.
در مثال ما، یک مقدار id برابر ۱ یک پاسخ معتبر را باز میگرداند و یک مقدار id برابر -۹۹۹۹ یک پاسخ نامعتبر را باز میگرداند. ما این پاسخها را به عنوان Baseline خود ذخیره میکنیم.

سپس، ما تغییرات تزریق بسیاری را امتحان میکنیم و تعداد زیادی از ترکیبات پیشوند و پسوند ممکن را آزمایش میکنیم. ما آزمایش خود را بر پایه پاسخ معتبر با یک id برابر ۱ قرار میدهیم. اگر ترکیب یک پسوند/پیشوند معتبر باشد مانند 1 AND 1=1، پاسخ معتبر را در بر دارد.
در عوض اگر از ترکیباتی مانند 1 AND ‘a’=’a استفاده شود، پاسخ نامعتبر را برمی گرداند. ما میدانیم که پاسخ نامعتبر ناشی از خطای نحوی است.

توجه داشته باشید که هر جفت پیشوند/پسوند شامل یک منطق است. یک پاسخ معتبر Baseline ما میباشد، در صورتی که از Query هایی مانند 1 AND 1=2 استفاده نمایید، پاسخ نامعتبر را در بر خواهد داشت. به همین ترتیب ما میتوانیم بر دادههای ورودی تسلط داشته باشیم و آن را کنترل کنیم.

SQL Injection: Prefix and Suffix
هر ترکیب پیشوند و پسوند معتبر باید طوری طراحی شود که تعداد زیادی Query، نشاندهنده انواع بازیابی داده و سایر وظایف، در صورت قرار گرفتن در میان آنها، بتوانند به درستی کار کنند.
در تصویر زیر، میتوانید تعدادی از نقاط تزریق، پیشوندها، پسوندها و انطباق آنها را ببینید.

در پایین تصویر، شما تعدادی از سوالات نمونه را برای پایگاههای داده مختلف و دستیابی به اهداف مختلف مشاهده میکنید. هر یک از این پرسشها، اگر با هر یک از جفتهای پیشوند و پسوند بالا ترکیب شوند، هنوز یک عبارت SQL معتبر ایجاد میکنند.
پیمانهای بودن و انعطافپذیری، کلید این روش است و به ما این امکان را میدهد که به راحتی تعداد زیادی از Query ها را به صورت خودکار تزریق کنیم. این امر برای Blind SQL Injection بسیار مهم است که نیاز به صدها Query برای بازیابی حتی مقدار کمی از دادهها دارد.