تزریق به پایگاه داده نوعی فن تزریق کد است که از نقص امنیتی نرمافزار وبسایت سوء استفاده میکند به این صورت که نفوذگر با یک سری دستورهای اسکیوال عملیاتی را (متفاوت با عملیات عادی موردنظر طراح وبسایت) در پایگاه داده وبسایت آسیبپذیر انجام میدهد.
این آسیبپذیری جزو ده آسیبپذیری رایج نرمافزارهای وب در سال ۲۰۰۷ و ۲۰۱۰ برشمرده شدهاست.
تزریق SQL یک روش حمله است که هدف آن دادههای ساکن در یک پایگاه داده میباشد که از طریق FireWall محافظت میشود. حمله معمولاً به علت مدیریت ضعیف در اعتبار سنجی کدها و یا ورودیهای برنامه (وب سایت) اتفاق میافتد. حمله تزریق SQL زمانی اتفاق میافتد که یک مهاجم قادر به قرار دادن یک سری از عبارتهای SQL در یک پرس و جو با دستکاری دادههای ورودی کاربر در یک برنامه مبتنی بر وب میباشد. البته این مسئله نیز مستقیماً با نحوه مدیریت کدها و ورودیهای وب سایت رابطه مستقیم دارد. یک حمله کننده میتواند از نقصهای برنامه نویسی و یا حفرههای امنیتی وب سایت و یا نرمافزار به راحتی برای دستیابی به اطلاعات یک پایگاه داده استفاده نماید.
حمله SQL Injection چگونه کار میکند؟
این آسیبپذیری از راههای گوناگونی پدید میآید. یک طریق فیلترنشدن کراکترهای Escape (,) است. برای مثال:
"SELECT * FROM users WHERE name = '" + userName + "';"
کار این کد استخراج اطلاعات یک نام کاربری (که به متغیر داده میشود) از جدول users است. اما نفوذگر میتواند با دادن مقدارهایی هوشمندانه به متغیر userName، سبب اجرای دستورهایی متفاوت از آنچه موردنظر کدنویس بودهاست بشود. برای مثال با وارد کردن این کد به عنوان ورودی:
' OR 'a'='a
کد نهایی اینچنین رندر میشود:
SELECT * FROM users WHERE name = '' OR 'a'='a';
همچنین میتوان با یکی از این سه روش، ادامهٔ کد را کامنت گرفت
' OR 'a'='a' --’
‘OR 'a'='a' ({ '
' OR 'a'='a' /* '
که نتیجه چنین است:
SELECT * FROM users WHERE name = '' OR 'a'='a' -- ';
مثلاً ممکن است در کدی، ادامه ی کد مربوط به بررسی گذرواژه باشد، در آن حالت با این کار آن بخش از کد کامنت گرفته میشود و پردازش نمیشود، و نفوذگر بدون واردکردن گذرواژه از مانع میگذرد. یا مثلاً واردشدن چنین عبارتی:
DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't’
سبب حذف جدول users و نیز استخراج تمام اطلاعات جدول userinfo میشود.
این ورودی به صورت دستور SQL زیر رندر و مشخص میشود:
SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM userinfo WHERE’t’ = 't';
در حالی که بسیاری از پیادهسازیهای SQL Server امکان اجرای چندین دستور را در یک فراخوان، مانند این مثال، فراهم می کنند، برخی از رابطهای برنامه کاربردی SQL مثل تابع؛ mysql_query() در زبان PHP به دلایل امنیتی اجازه این عملیات را نمیدهند. این محدودیت باعث جلوگیری از تزریق Queryهای کاملاً مجزا از هم توسط مهاجمان میشود، اما نمیتواند مانع تغییر Queryها شود.
6 روش برای مقابله با حملات SQL injection
استفاده رو به افزایش پایگاههای داده و برنامههایی که این پایگاهها را بهم متصل میکند، به معنای این است که SQL Injectionهنوز باید چزو نگرانیهای متخصصان حوزهی امنیتی IT باشد.
اخبار فراوانی پیرامون حملات سایبری و نفوذ امنیتی به شرکتهایی همچون Target ، Michaels ، Niemen Mrcus و هتلهای زنجیرهای همچون، هتل هیلتون و هتل ماریوت وجود دارد. مسئلهی مهمتری که بیش از کشف این حملات وجود دارد اینست که این شرکتهای بزرگ که قربانی این حملات بودهاند، هنوز دقیقاً نمیدانند که چگونه این حملات انجام شده است و درک درست وکاملی از عواقبی که به تبع این حملات به آنها تحمیلشدهاست ندارند.
1-چشم بسته به ورودیها اطمینان نکنید
به معنای سادهتر، اعتبار و صحت هرگونه دادهای که در موتور SQL قرار داده میشود باید بررسی شود که به معنای این خواهد بود که ارگانها و سازمانها باید چارچوبهای امنیتی را در موقع طراحی رعایت و اجرا کنند که نیازمند اینست کهSQL با استفاده از ورودیهای پارامتری شده ساخته شود، تکنیکی که نیاز به کدنویسی سنگینی دارد و از طریق آن حملات SQL Injection از طریق جداسازی کدهای اجرایی و اطلاعات ورودی از یک دیگر، مانع بروز این حملات میشود.
2-پیامهای خطایی که ایجاد میکنید با دقت بیشتری انتخاب کنید
معمولاً مهاجمان از پیامهای خطایی که در برنامه ایجاد شده است استفاده میکنند تا بفمند که بهتر است چگونه به پایگاه داده حمله کنند. برنامه نویسان و مدیران پایگاههای داده باید به خطاهایی که در هنگام ایجاد یک ورودی غیر معمول نمایش داده میشوند، توجه بیشتری داشته باشند. مثلاً خطای ‘نام کاربری نمیتواند شامل اعداد باشد’ را که توسط پایگاه داده برگردانده میشود در نظر بگیرید. همین اطلاعات کم می تواند به مهاجم این کمک را بکند که در قسمت نام کاربری اعداد را وارد نکند.
3-بستههای مکمل نرم افزارها و پایگاههای داده را به طور کامل تهیه و اجرا کنید
لازم به ذکر این نکته نیست که بستههای مکمل نرم افزاری باید به طور منظم به برنامه اعمال شوند. اعمال بستههای مکمل نرم افزاری یکی از تکنیکهای امنیتی مغفول است. دلیل این امر میتواند، ضعف مدیریتی، عدم اطلاع رسانی و یا ضعف اطلاع رسانی عرضه کننده و فروشندهی محصول و یا ترکیبی از این دو و دیگر عوامل باشد. بسیاری تنها راه برای حل این مشکل را استفاده از سیستم مدیریت بستههای مکمل میدانند که در اغلب موارد، با ایجاد یک مشکل کوچک، این برنامهها به شکست کشیده می شوند.
4-از ابزارهای رصد و مانیتورینگ شبکه استفاده کنید
رصد فعالیتهای مرتبط با دسترسی در سطح نرمافزارها، شاخصی است که میتواند شما را به سرعت از بروز حمله آگاه کند. راه حل ساده در این گونه موارد اینست که افزایش تعداد خطاها و یا افزایش در فعالیت، میتواند به عنوان ملاکی در نظر گرفته شود که به مدیر سیستم در مورد یک حملهی در حال انجام هشدار دهد.
5-ابزارهای فیلترینگ را فراموش نکنید
نرم افزارهای امنیتی بلادرنگ در کنار سیستمهای مانیتورینگ از طریق فیلترکردن ترافیکهای مشکوک و نادیده گرفتن دسترسی به پایگاه داده میتوانند برای دفع حملات در حین بروز آنها استفاده شوند.
6-امنیت پایگاه داده خود را ارتقاء دهید
استفاده از سیستمهای تصدیق هویت اضافی که از تکنولوژی امضای منفرد(SSO)، استفاده میکنند، در کنار استفاده از کنترلهای امنیتی از برنامهها و پایگاههای Backend میتواند موجب ارتقاء محافظت از پایگاههای دادهی آسیبپذیر شود. مطلب دیگری که وجود دارد اینست که استفاده از سیستمهای تصدیق هویت High end نیز در این مورد بسیار کارساز است. این سیستمها این قابلیت را دارند تا ورود به سیستم را به همراه بازرسی و اعطای امتیازات ویژه برای کاربران اصلی را درکنار یکدیگر هم ارائه کند. به عبارت دیگر دسترسی ویژه فقط برای مدیران سیستم و پایگاه داده امکان پذیر است و چناچه دیگران سعی کنند، تا از این قابلیتهای ویژه که برای مدیران در نظر گرفته شده استفاده کنند، این موضوع ثبت خواهد شد و به عنوان فعالیت مشکوک گزارش خواهد شد.
ترکیب بهترین شیوهها و استفاده از تکنولوژیهایی آتیای که پس از محصول فعلی به بازار ارائه میشوند، در کار یکدیگر ثابت کرده است که بهترین روش برای مقابله با حملات SQL Injection که هنوز جزو دغدغههای شرکتهای بزرگ و کوچک است، میباشد.