SQL injection

SQL injection نوعی فن تزریق کد است که نقص امنیتی نرم‌افزار وب‌سایت را اکسپلویت می‌کند به این صورت که نفوذگر با یک سری دستورهای اس‌کیوال عملیاتی را (متفاوت با عملیات عادی موردنظر طراح وبسایت) در پایگاه داده وب‌سایت آسیب‌پذیر انجام می‌دهد.این آسیب‌پذیری جزو ده آسیب‌پذیری رایج نرم‌افزارهای وب در سال ۲۰۰۷ و ۲۰۱۰ برشمرده شده‌است.در ادامه به بررسی این موضوع میپردازیم.

تزریق SQL یک روش حمله است که هدف آن داده‌های ساکن در یک پایگاه داده می‌باشد که از طریق FireWall محافظت می‌شود. حمله معمولاً به علت مدیریت ضعیف در اعتبار سنجی کدها و یا ورودیهای برنامه (وب سایت) اتفاق می‌افتد. حمله تزریق SQL زمانی اتفاق می‌افتد که یک مهاجم قادر به قرار دادن یک سری از عبارتهای SQL در یک Query با دستکاری داده‌های ورودی کاربر در یک برنامه مبتنی بر وب می‌باشد. البته این مساله نیز مستقیماً با نحوه مدیریت کدها و ورودیهای وب سایت رابطه مستقیم دارد. یک حمله کننده می‌تواند از نقصهای برنامه نویسی و یا حفره‌های امنیتی وب سایت و یا نرم‌افزار به راحتی برای دستیابی به اطلاعات یک پایگاه داده استفاده نماید.

پرس و جوی معمول دارای چند بخش مختلف به شرح ذیل می‌باشد:

  1. Select : با استفاده از این دستور ستونهایی که مورد نظرمان است را انتخاب می نمائیم.
  2. From : که مشخص می‌نماید که ستونهای مورد نظر ما از کدام جدول انتخاب شوند
  3. Where : که در آن شروطی را مشخص می نمائیم.
  4. و یک سری دستورات و عبارها و متدهای دیگر. . .

حملات تزریق از طریق SQL فقط در بخش شرطی Where اتفاق می‌افتند. در ادامه توضیح خواهیم داد که این مساله چگونه رخ می‌دهد.

statement = “SELECT * FROM users WHERE name = ‘” + userName + “‘;”

کار این کد استخراج اطلاعات یک نام کاربری (که به متغیر داده می‌شود) از جدول users است. اما نفوذگر می‌تواند با دادن مقدارهایی هوشمندانه به متغیر userName، سبب اجرای دستورهایی متفاوت از آنچه موردنظر کدنویس بوده‌است بشود. برای مثال با وارد کردن این کد به عنوان ورودی:

‘ OR ‘a’=’a

کد نهایی اینچنین رندر می‌شود:

SELECT * FROM users WHERE name = ” OR ‘a’=’a’;

دستور بالا همیشه درست خواهد بود و عامل حمله کننده میتواند بدون هیچ دردسری به کار خود ادامه دهد.(مثلا بدون وارد کردن رمز عبور وارد حساب کاربری شود)

مثالی دیگر را با هم بررسی میکنیم:

statement := “<source lang=”sql” enclose=”none”>SELECT * FROM userinfo WHERE id = </source>” + a_variable + “;”

با توجه به این دستور واضح است که برنامه‌نویس a-variable را برای تعیین عدد مرتبط با فیلد id در نظر گرفته است. با این حال، اگر ورودی از نوع رشته تعیین شده باشد، کاربر نهایی می‌تواند دستور را به صورت دلخواه دستکاری کرده و به این وسیله نیاز به ورود کراکترهای Escape شده را دور بزند. برای مثال مقداردهی a-variable به صورت زیر جدول “users” را از پایگاه داده حذف خواهد کرد:

۱;DROP TABLE users

چرا که دستور SQL معادل آن به صورت زیر خواهد شد:

SELECT * FROM userinfo WHERE id=1;DROP TABLE users;

و با اجرای این دستور جدول کاربران شما حذف خواهد شد.

برخی راه های جلوگیری از حملات تزریق SQL:

یک راه ساده اما مستعد خطا برای جلوگیری از تزریق، Escape کردن کراکترهایی است که در SQL معنای خاصی دارند. راهنمای پایگاه داده SQL توضیح می‌دهد که کدام کراکترها معنی خاص دارند، بنابراین این امکان را فراهم می‌کند که یک فهرست سیاه جامع از کراکترهایی که نیاز به ترجمه دارند تهیه شود. برای مثال، هر رخداد از نقل قول تکی (‘) در یک پارامتر، باید توسط دو نقل قول (”) جایگزین شود تا به شکل یک رشته SQL معتبر تبدیل شود. برای مثال، در PHP  معمولاً پارامترها قبل از ارسال Query، به کمک تابع mysql_real_escape_string();، Escape می‌شوند

 

$ mysqli = new mySqli(‘hostname’, ‘db_username’, ‘db_password’, ‘db_name’);

$ query = sprintf(“SELECT * FROM Users WHERE UserName=’%s’ AND Password=’%s’”,

                  $ mysqli->real_escape_string($ Username),

                  $ mysqli->real_escape_string($ Password));

$ mysqi->query($ query);

مجوزهای پایگاه داده

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

deny select on sys.sysobjects to webdatabaselogon;

deny select on sys.objects to webdatabaselogon;

deny select on sys.tables to webdatabaselogon;

deny select on sys.views to webdatabaselogon;

deny select on sys.packages to webdatabaselogon;

در ژوئیهٔ ۲۰۱۲ گروهی تحت عنوان D33D با نفوذ به زیردامنه‌ای از یاهو، Yahoo Voices، به همین شیوه، گواهی‌نامه‌های لاگین بیش از ۴۵۰۰۰۰ کاربر این وب‌گاه را ربودند.

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

نکته مهم دیگر این است که هیچ وقت به ورودی های کاربر اعتماد نکنید.حتی در ساده ترین و جزئی ترین اطلاعاتی که از کاربر دریافت میکنید.

نوشته SQL injection اولین بار در LeanFiles.Com Academy – Online Training Courses پدیدار شد.

مبنع این خبر (برای مشاهده متن کامل خبر لینک زیر را بزنید):
LeanFiles.Com Academy – Online Training Courses