انواع حمله تزریق به پایگاه داده
مقالات تخصصی IT و هاستینگ

حمله تزریق به پایگاه داده یا SQL Injection چیست و چگونه عمل می کند؟

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

SQL چیست؟

Structured Query Language به اختصار SQL، یک سیستم مدیریت پایگاه‌ داده رابطه‌ ای است که به کاربران امکان می‌ دهد داده‌ های متنوعی را در سیستم‌ های کامپیوتری ذخیره، بازیابی و مدیریت کنند. SQL به طور گسترده‌ در CMS هایی همچون وردپرس مورد استفاده قرار می‌ گیرد. با افزایش محبوبیت این زبان در حوزه تحقیقات علمی، حمله تزریق به پایگاه داده به عنوان یک آسیب‌ پذیری جدی مطرح گردید.

حمله تزریق به پایگاه داده یا SQL Injection چیست؟

حمله تزریق به پایگاه داده یا SQL Injection 

تصویر(1)

حمله تزریق به پایگاه داده به مهاجم اجازه می‌ دهد تا از یک کوئری SQL آسیب‌ پذیر سوء استفاده کرده و دستور خود را اجرا نماید. حملات SQL Injection (اختصارا SQLi) زمانی رخ می‌ دهند که مهاجم قادر به اجرای کد SQL دلخواه خود روی یک سرور باشد. این موضوع می‌ تواند بر هر سیستمی که از SQL یا مشتقات آن برای مدیریت داده استفاده می‌ کند، مانند سایت های وردپرس، تاثیرگذار باشد.

اهداف اصلی یک حمله تزریق به پایگاه داده عبارتند از:

  • دسترسی غیرمجاز به اطلاعات محرمانه
  • تغییر و دستکاری ورودی های پایگاه داده
  • حملات DoS (ایجاد اختلال در سرویس) با حذف یا خراب کردن داده‌ ها

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

از وب‌ سایت خود به‌ طور منظم نسخه پشتیبان تهیه نمایید

توسعه‌ دهندگان باتجربه، به طور منظم از تمامی پایگاه داده‌های SQL وب‌ سایت‌ های وردپرسی خود نسخه پشتیبان تهیه کرده و آنها را خارج از سرور اصلی نگهداری می‌ نمایند. ذخیره فایل‌ های SQL با پسوند sql. در مکانی امن و استفاده از افزونه‌ های پشتیبان‌ گیری وردپرس، تضمینی بر حفظ اطلاعات حیاتی وب‌ سایت در صورت بروز هرگونه حادثه امنیتی می باشد. افزونه‌ هایی مانند BackupBuddy، از کل پایگاه داده و فایل‌ های وردپرس، پشتیبان‌ گیری می‌ کنند.

انواع حمله تزریق به پایگاه داده

شناخت دقیق انواع SQL Injection، پیش‌ نیازی ضروری برای درک عمیق این تهدید و تدوین استراتژی‌ های دفاعی موثر محسوب می‌ شود. در لیست زیر به تشریح فنی انواع مختلف حملات SQLi پرداخته خواهد شد.

1. حمله تزریق به پایگاه داده کلاسیک (Classic SQL Injection)

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

در این نوع حمله، مهاجمان اغلب با دستکاری کوئری های SQL، بخش اول آنها را غیرفعال کرده و سپس یک query سفارشی وارد می‌ نمایند. این کوئری سفارشی به گونه‌ ای طراحی و توسط سرور اجرا می‌شود که گویی برنامه‌ نویس اصلی آن را نوشته است.

انواع حمله تزریق به پایگاه داده

تصویر(2)

2. حمله تزریق به پایگاه داده کور (Blind SQL Injection)

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

3. حمله تزریق به پایگاه داده ترکیبی (Compounded SQL Injection)

SQL Injection ترکیبی زمانی رخ می دهد که یک حمله مجزای دیگر با SQLi ادغام گردد تا نتیجه دلخواه حاصل شود. به عبارت دیگر، مهاجم ابتدا از طریق یک نفوذ (exploit)، مانند نقض احراز هویت، حمله DDoS، هک DNS و cross-site scripting، راهی برای اجرای دستورات دلخواه خود در سیستم باز می نماید، سپس از آن جهت تزریق کدهای مخرب SQL استفاده می‌ کند. شناسایی و مقابله با حملات SQLi ترکیبی به دلیل پیچیدگی بیشتر، دشوارتر است.

چرا وب سایت‌ های وردپرسی در برابر حمله تزریق به پایگاه داده آسیب‌پذیر هستند؟

وردپرس، با پشتیبانی حدود 43% از کل وب سایت‌ ها، یک هدف جذاب برای مهاجمان احتمالی است. دلایل آسیب‌ پذیری وب سایت‌ های وردپرسی مقابل SQL Injection، در ادامه بررسی خواهد شد.

وردپرس برای ذخیره و مدیریت داده‌ های متنوعی همچون پست‌ های وبلاگ، نظرات کاربران، اطلاعات حساب‌ های کاربری و فروشگاه، از ترکیب زبان برنامه‌ نویسی PHP و پایگاه داده MySQL بهره می‌ برد. این وابستگی به پایگاه داده، علیرغم مزایای فراوانی که برای وردپرس دارد، می‌ تواند آسیب‌ پذیری‌ هایی از جمله امکان وقوع حمله تزریق به پایگاه داده را نیز ایجاد کند.

آسیب‌ پذیری‌ های رایج در وب‌ سایت‌ های وردپرسی معمولا ناشی از موارد زیر است:

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

جهت توضیح بیشتر، چند سناریوی واقعی در لیست زیر بررسی می گردد:

  1. فرم‌ های ورود: یک مهاجم می‌ تواند با تزریق کدهای مخرب SQL به فیلدهای نام کاربری یا رمز عبور، از مکانیزم احراز هویت عبور کرده و سیستم را مورد نفوذ قرار دهد. 
  2. تابع جستجو: عدم ایمن‌ سازی مناسب این تابع می‌ تواند منجر به سوء استفاده مهاجمان از کوئری‌ های جستجو، برای استخراج غیرمجاز داده‌ های حساس پایگاه داده شود.
  3. فرم‌ های تماس: این فرم‌ ها اغلب هدف حملات SQL Injection هستند، به خصوص در سایت‌ هایی که اخیرا بروزرسانی نشده‌ اند.

به طور کلی، هسته اصلی وردپرس در برابر حملات ابتدایی SQL Injection مقاوم است. با این حال، امکان ایجاد آسیب‌ پذیری‌ ها از طریق موارد زیر همچنان وجود دارد:

  • کدهای سفارشی فاقد استانداردهای امنیتی.
  • افزونه‌ ها و قالب‌ های جانبی که به طور کامل مورد ارزیابی قرار نگرفته‌ اند.
  • نصب‌ وردپرس قدیمی که بروزرسانی‌ های امنیتی را دریافت نکرده‌ است.

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

جلوگیری از حملات SQL Injection

تصویر(3)

هشدارهای مهم در مورد SQL injection

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

مثال هایی از حمله تزریق به پایگاه داده

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

SQL دستورات متنوعی را برای مدیریت پایگاه‌ داده ها استفاده می‌ نماید. از جمله این دستورات می‌ توان به SELECT برای انتخاب داده‌ ها، DROP TABLE جهت حذف کامل جداول و DELETE که امکان حذف سطرهای مشخصی از جدول را فراهم می کند، اشاره کرد. همچنین، کاراکتر "*" در SQL برای انتخاب تمامی سطرها به کار می‌ رود. ساده‌ ترین این دستورات، SELECT * FROM TABLE_NAME است که تمامی داده های موجود در جدولی به نام TABLE_NAME را نمایش می‌ دهد.

هنگامی که کاربر اطلاعات ورود خود را در فرم مربوطه وارد می‌ کند، این اطلاعات به یک اسکریپت PHP ارسال می‌ شود. اسکریپت مذکور، اطلاعات ارسالی را با داده‌ های موجود در یک جدول پایگاه داده مقایسه می‌ کند. در مثال فوق، جهت تشریح بهتر مفاهیم، فرض می‌ شود که این جدول فاقد هرگونه مکانیزم رمزنگاری بوده و اطلاعات به صورت ساده تحت ستون‌ هایی با نام‌ های USER و PASS وجود دارند.

آماده سازی کوئری

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

SELECT * FROM BADLY_DONE_TABLE WHERE USER = ‘[username from form]’ AND PASS = ‘[password from form]

همانطور که مشاهده می‌ کنید، هدف از این کوئری SQL، بازیابی اطلاعات کاربر در صورت تطابق نام کاربری و رمز عبور وارد شده با مشخصات ذخیره شده درون پایگاه داده است. انتظار می‌ رود که کوئری فوق حداکثر یک رکورد را برگرداند. شایان ذکر است که زبان SQL امکان استفاده از عملگرهای منطقی مختلفی مانند AND و OR را برای ترکیب شرایط فراهم می‌ کند.

حال زمان آن رسیده است که از این طریق نفوذ صورت گیرد.

نحوه انجام حمله تزریق به پایگاه داده

تصویر(4)

نفوذ به کوئری SQL آسیب‌ پذیر 

کوئری فوق به گونه‌ ای طراحی شده است تا در صورتی که نام کاربری و رمز عبور وارد شده مطابقت داشته باشند، اطلاعات کاربر را برگرداند. علامت نقل قول تکی، در SQL پایان‌ دهنده یک رشته است، بنابراین می‌ توان "Blahblahblah" را به عنوان نام کاربری و سپس ‘OR ‘1’=’1 را اضافه نمود.

در این مثال فرض شده است که کوئری به صورت پویا ساخته می‌ شود و ورودی‌ ها قبل از اجرا، اعتبارسنجی نمی‌ شوند. در واقع با وارد کردن یک عبارت منطقی همواره صحیح مانند "1=1"، صرف‌ نظر از صحت مشخصات وارد شده، می‌ توان تمامی داده‌ های جدول را استخراج نمود. در سال ۱۹۹۸، اجرای چنین حمله‌ ای به نسبت ساده‌ تر بود اما با پیشرفت‌ های امنیتی، امروزه نفوذ به سیستم‌ های وردپرس نیازمند تخصص بسیار بالاتری در زمینه SQL و تکنیک‌ های SQL injection است.

برای مطالعه آسیب پذیری های فعلی و قبلی SQL injection در وردپرس، می‌ توانید به دیتابیس CVE مراجعه کنید. این پایگاه داده، فهرست کاملی از تهدیدات امنیتی را ارائه می‌ دهد که شامل نام محصول، نسخه‌ های آسیب‌ پذیر و شرح دقیق نحوه عملکرد آسیب پذیری استاکثر آسیب پذیری های موجود در این پایگاه داده، با انتشار پچ های امنیتی برطرف شده‌ اند اما منبع ارزشمندی برای یادگیری و درک بهتر تهدیدات امنیتی هستند.

نحوه بررسی آسیب‌ پذیری‌ های SQL injection

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

  • بسیار مراقب فایل‌ های PHP که توسعه می‌ دهید یا از منابع خارجی دریافت و در وب‌ سایت خود نصب می‌ کنید (مخصوصا افزونه‌ های وردپرس)، باشید. یک اسکریپت PHP با کدنویسی ضعیف که ورودی‌ های کاربران را درست اعتبارسنجی نمی‌ کند، می‌ تواند امنیت وب‌ سایت وردپرس شما را به خطر انداخته و موجب رخنه‌ های امنیتی جدی شود.
  • جهت شناسایی و جلوگیری به موقع از تلاش‌ های نفوذ و حملات سایبری، توصیه می‌ شود یک افزونه امنیتی معتبر استفاده کنید. این افزونه ها با نظارت مداوم بر فعالیت‌ وب‌ سایت، در صورت تشخیص هرگونه تهدید یا تلاش برای حملات SQLi، به شما هشدار داده و امکان انسداد فوری مهاجم را فراهم می‌ آورد.
  • بروزرسانی منظم وردپرس به آخرین نسخه، یک اقدامات امنیتی مهم برای حفاظت وب‌ سایت شما محسوب می‌ شود. متاسفانه، اکثر مدیران وب‌ سایت‌ ها به دلایل مختلف از انجام این کار خودداری می‌ کنند.
  • بروزرسانی مداوم افزونه‌ ها و قالب‌ های وردپرس از اهمیت بسیار بالایی برخوردار است. نسخه‌ های قدیمی و آسیب‌ پذیر این ابزارها، اصلی‌ ترین عامل نفوذ هکرها به سایت‌ های وردپرسی محسوب می‌ شوند.

روش‌ های جلوگیری از حمله تزریق به پایگاه داده

تصویر(5)

بهترین روش‌ های جلوگیری از حمله تزریق به پایگاه داده

پیشگیری از حملات SQLi امری حیاتی برای تضمین امنیت وب‌ سایت‌ های وردپرسی می باشد. در لیست زیر، بهترین روش‌ های مقابله با این تهدیدات امنیتی ارائه شده است:

1. روش‌ های کدنویسی

  • اعطای حداقل دسترسی های ضروری به پایگاه داده

  • استفاده از کوئری‌ های پارامتری (parameterized queries) به جای الحاق مستقیم ورودی کاربر درون دستورات SQL

  • استفاده از کتابخانه‌ های ORM برای محافظت خودکار در برابر حمله تزریق به پایگاه داده

  • مدیریت دقیق خطاها به منظور جلوگیری از افشای ساختار پایگاه داده در پیغام ها

2. استفاده از دستورات آماده جهت مقابله با حمله تزریق به پایگاه داده

دستورات آماده‌ یک روش‌ موثر برای جلوگیری از حمله تزریق به پایگاه داده هستند:

  • توسط دستورات آماده‌، منطق SQL از داده‌ های ورودی جدا می‌ شود و امکان نفوذ یا تغییر در هدف کوئری توسط ورودی‌ های مخرب به حداقل می‌ رسد.
  • مثالی در PHP:
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$stmt->execute(['username' => $username, 'password' => $password]);
  • ارتقا عملکرد: دستورات آماده می‌ توانند مجددا استفاده شوند و عملکرد کوئری را بهبود بخشند.

3. پاک‌ سازی داده‌ های ورودی (Input sanitization)

اگرچه استفاده از دستورات آماده توصیه می‌ شود اما پالایش دقیق ورودی‌ ها همچنان یک اقدام امنیتی ضروری است.

  • به جای تلاش برای شناسایی و دفع ورودی‌ های نامعتبر، بهتر است تنها به مواردی که پیش تر معتبر تعریف شده‌ اند، اجازه ورود داده شود.
  • از توابع داخلی PHP مانند ()mysqli_real_escape_string یا فانکشن های وردپرس مانند ()esc_sql استفاده نمایید.
  • اطمینان حاصل کنید که ورودی کاربر با نوع داده مورد انتظار مطابقت دارد (به عنوان مثال، اعداد صحیح برای شناسه‌ ها).
  • محدود کردن طول ورودی کاربر، جهت جلوگیری از حملات سرریز بافر (buffer overflow)

4. اقدامات جانبی

  • پیاده‌ سازی WAF برای فیلتر کردن درخواست‌ های مخرب پیش از رسیدن به برنامه.
  • بروزرسانی مداوم هسته وردپرس، پوسته‌ ها و افزونه‌ ها جهت رفع آسیب‌ پذیری‌ های شناخته‌ شده.
  • استفاده از افزونه‌ های امنیتی معتبر وردپرس، بررسی مداوم کدهای سفارشی و پلاگین های متفرقه برای شناسایی و رفع آسیب‌ پذیری‌ های SQL Injection.

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

نتیجه گیری

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

اشتراک گذاری:

نظرات

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *