مبحث یکم : مقدمه و تاریخچه
مبحث دوم: مراحل نفوذ کردن / جلوگیری از نفوذ
مبحث سوم: حملات شبکه ای
مبحث چهارم - کار عملی
مبحث پنجم - DHCP
مبحث ششم - وب و حملات مطرح در آن
مبحث هفتم - حملات DoS
مبحث هشتم - سیستم عامل
مبحث نهم - مهندسی اجتماعی
مبحث دهم - Vulnerability (آسیب پذیری)

SQL Injection چیست؟

نوعی حمله که علیه DBهای موجود در سایت های اینترنتی می باشد. در این نوع حملات، دستورات یک DB (مانند Oracle، PostgreSQL، My SQL و ….)، به نحوی زیرکانه توسط نفوذگر و از طریق فرم های ورود اطلاعات، به سیستم هدف تزریق می شود. یعنی نفوذگر به جای وارد کردن نام کاربری خود، یک سری دستورات sql وارد می کند.

سیستم هایی با تنظیمات پیش فرض، سیستم های استفاده کننده از معماری نامناسب (مثلاً معماری یک لایه که همه سرویس ها در کنار هم هستند)، سیستم های بدون اعمال تنظیمات امنیتی در سطح برنامه کاربردی تحت وب و پایگاه داده در مقابل اینگونه حملات آسیب پذیرند.

چگونگی شکل گیری حمله: نفوذگر با تکمیل فرم های ورود اطلاعات با دستورات پایگاه داده ای query ارسالی از Web Server به Database Server را آلوده کرده و بدین وسیله، DB Server را وادار به اجرای دستورات خود می نماید.

شکل 12 اجرای عادی یک query را نشان می دهد.

شکل 12

زمانی که در سایت login انجام می دهیم عملاً برای بررسی صحت این login، یک query مانند شکل 13 ارسال می شود. کلمه ‘admin’ و ‘letmein’ چیزهایی هستند که کاربر در فرم login وارد کرده است پس چیزی که در فرم ورود نوشته می شود بین ‘  ‘ قرار می گیرد.

شکل 13

همان طور که در شکل 13 می بینیم چون چنین نام کاربری و کلمه عبور متناظر آن در جدول وجود داشت DBMS خروجی query را به وب سرور می دهد. وب سرور هم می فهمد که چنین کاربری وجود دارد.

حمله: نفوذگر با وارد کردن دستورات sql به جای اطلاعات واقعی سرویس دهنده را مجبور به اجرای دستورات خود می نماید. مثال: حمله کننده نام کاربری را admin و کلمه عبور را ‘=’ ‘or’ وارد می کند. این روش یکی از پایه ای ترین روش های SQL- Injection است که به آن Master SQL Injection می گویند. در شکل 14 چگونگی کارکرد عبارت وارد شده به جای کلمه عبور را می بینید.

شکل 14

بررسی query

name=’admin’ درست است. اما ارزیابی عبارت pass= ‘ ’ or “=”.

این عبارت می گوید فیلد pass مقدار خالی است که خوب غلط است یا خالی برابر خالی است که درست است پس نتیجه or آن در عبارت درست می شود پس نتیجه کل عبارت درست می شود. اتفاقی که افتاد این بود که بدون دانستن پسورد admin و صرفاً با وارد کردن عبارت ‘or’ ‘=’ توانست یک login موفق انجام دهد. چرا نفوذگر این عبارت را وارد می کند؟ نفوذگر حدس می زند که احتمالاً چنین query ساخته می شود. پس از تحلیل آن یک عبارت می­سازد تا سیستم را bypass کند. دقت کنید که اگر عبارت sql به صورت مثلاً name=”admin” and pass=”letmein” بود، (یعنی از دابل کوتیشین (double quotation) به جای single quotation استفاده شده بود) آن وقت شما باید عبارت را به صورت “ or” “=” وارد کنید تا با خطای ساختاری (syntax) مواجه نشوید. علت آن را خودتان بررسی کنید.

به صورت عملی با DB که ساختیم کار می­کنیم.

دستور زیر اطلاعات کاربر با نام کاربری MAGMAG را برمی گرداند.

;(“Select * from user where (uname=”MAGMAG

(فرض کنید query بالا از طرف وب سایتمان آمده است به DBMS. پس مقدار uname=”  “ (داخل double quotation) را کاربر در فیلد نام کاربری وارد کرده است). هدف کاربر خرابکار این است که اطلاعات تمام کاربران را بیرون بکشد. برای این منظور کافی است عبارتی را به جای نام کاربری وارد کند که حاصل ارزیابی آن در قسمت where، صحیح باشد.

عبارت select * from user where 1=1 مشخصات تمام کاربران را می دهد.

حال برای سناریوی بالا یک عبارت sql بنویسید که کاربر خرابکار را به هدفش برساند. دقت کنید که فقط قابلیت تغییر مقدار داخل double quotation را دارید و نمی توانید مثلاً uname را از query حذف کنید. چون query درون کد و کد، درون وب سرور است که هدف ما این نیست که اصل کد را عوض کنیم.

عبارات مختلفی را می توان وارد کرد که یکی از آنها عبارت “or”  “=” است. این عبارت را به جای MAGMAG در query بالا وارد کنید و نتیجه را مشاهده کنید.

;(“ “ = “ “ Select * from user where (uname= “ “  or

 کمی پیچیده تر این گونه است که query که از وب سرور به DBMS فرستاده می شود دارای چند شرط باشد. مثال:

;(” “= Select * from user where (uname= “ “) and (email

که در عبارت بالا دو شرط داریم که and شده اند.

اسکرول به بالا