SQL Injection چیست؟ و چگونه به شما آسیب می رساند
در یک حمله تزریق SQL یا SQL Injection، یک مهاجم اطلاعاتی را به وب سایت ارائه می دهد که به صورت آگاهانه به گونه ای تدوین شده است که منجر به تفسیر نادرست توسط وب سایت و انجام اقدامات ناخواسته می شود.
وب سایت، داده های ارسال شده توسط مهاجم را به عنوان دستور پایگاه داده تفسیر می کند و سپس آنها را اجرا می کنند. اگر دستور تغییر ورودی در یک پایگاه داده یا حتی حذف کل دیتابیس باشد، نتایج بدست آمده می توانند فاجعه بار باشند. به همین دلیل بسیار ضروری است که سازمانها برای جلوگیری از حملات تزریق SQL اقدامات لازم را انجام دهند.
نمونه SQL Injection
در اینجا مثالی از چگونگی انجام حمله تزریق SQL در عمل آورده شده است. این حمله برای دستیابی به کلیه داده های مربوط به کاربر از جدول داده های USERS بدون اطلاع از نام کاربری یا رمز عبورطراحی شده است.
کد برنامه SQL ممکن است چیزی شبیه به مثال زیر باشد:
SELECT * FROM Users WHERE Username=’$username’ AND Password=’$password’
با استفاده از یک رابط وب، در صورت درخواست نام کاربری و رمز عبور آنها، ممکن است یک حمله انجام شود(با توجه به میزان امنیت سیستم):
در نظر بگیرید که:
۱′ OR ‘1’ = ‘1
and
۱’ OR ‘1’ = ‘1
با وارد کردن این جفت نام کاربری و رمزعبور که عمداً به این شکل طراحی شده است شده است، مهاجمان به طور موثری دو شرط OR را به فرایند تأیید اعتبار تزریق کرده است. خوب حالا نگاهی دقیق تر بندازیم تا ببینیم این عمل چگونه انجام میشود.
کد برنامه SQL در انتظار یک رشته متن ساده مانند cynetco برای نام کاربری و رشته ساده دیگری مانند P@ssw0rd123 برای رمز عبور بود. حالا خط دستورات زیر ترجمه میشود:
SELECT * FROM Users WHERE Username=’$username’ AND Password=’$password’
به
SELECT * FROM Users WHERE Username=’cynetco’ AND Password=’ P@ssw0rd123
اگر رمز عبور آن کاربر P@ssw0rd123 است، به داده های کاربر cynetco (در صورت وجود) دسترسی پیدا میکند.
اما در اینجا یک مشکل وجود دارد. آنچه از برنامه انتظار نمی رفت این بود که یک مهاجم با استفاده هوشمندانه از apostrophe ها نام کاربری و رمز عبوری را به این روش وارد کند. پس نتیجه کد فوق به شکل زیر ترجمه میشود:
SELECT * FROM Users WHERE Username=’1′ OR ‘1’ = ‘1’ AND Password=’1′ OR ‘1’ = ‘1’
خوب حالا برنامه کاربردی به هر کاربری که پسوردش ‘۱’ OR ‘1’ = ‘1’ باشد اجازه دسترسی میدهد جالب اینجاست که جواب شرط ‘۱’ OR ‘1’ = ‘1’ همیشه درست است این SQL Query باعث میشود که فایند احراز هویت رمز عبود دور زده شود.
کد مورد نظر از OWASP گرفته شده است.
در مثال فوق دو شرط زمانی که برنامه در انتظار نام کاربری و رشته رمزعبور است تزریق می شود، اما یک حمله می تواند یک دستور بانک اطلاعاتی مانند DROP DATABASE را تزریق کند، که منجر به از بین رفتن تمام اطلاعات ذخیره شده در بانک اطلاعاتی می شود.
حالا فرض کنید که یک برنامه در یکی از فیلدهای ورودی منتظر گرفتن کد ملی میباشد تا آنرا در فیلد کد ملی ذخیره کند. این برنامه به احتمال زیاد یک فرم با کد خاصی در پشت آن دارد تا بتواند نام کاربر را در فرم ” نام خانوادگی” بپذیرد ممکن است یک کارمند مخرب (یا مهاجمین بیرونی) بتواند حمله تزریق SQL را انجام دهد و کد DROP DATABASE کد ملی را اجرا کند اینکار باعث از دست رفتن اطلاعات این دیتا بیش میشود. برای اینکار مهاجم با جای وارد کردن نام کاربری دستور DROP DATABASE کدملی را وارد میکند.
در نتیجه برنامه اینطور برداشت میکند:
‘cynet’); DROP DATABASE کدملی; — ?’
بخش اصلی این حمله، استفاده مجدد از یک apostrophe ‘ است. نتیجه این میشود که پس از cynet پایگاه داده فکر می کند نام کاربری تمام شده و از آنجا که کاراکترهای بیشتری وارد شده اند، تصمیم می گیرد که آنها باید به عنوان کد SQL تعبیر شوند و این به این معنی است که کد زیر بلافاصله اجرا میشود، بنابراین پایگاه داده یک فرمان DROP DATABASE کد ملی را اجرا می کند.
امنیت در SQL injection
حملات SQL injection فقط در صورتی کار می کنند که یک برنامه در اجرای کد وارد شده فریب خورده باشد زیرا ورودی کاربر را به شکلی که انتظار آن را ندارد دریافت می کند. این بدان معناست که یک اقدام امنیتی برای جلوگیری از اینگونه حملات اعتبار سنجی ورودی دریافت شده است. این به طور موثری لایه بازرسی را اضافه می کند تا اطمینان حاصل شود که هرگونه داده ارسالی غیر معمول نیست و ممکن است خطر SQL injection را ایجاد کند.
چک کردن داده های ورودی به این شکل است که دریافت هرگونه کد SQL در ورودی برای اطمینان از اینکه یک Query SQL اجرا نشود فیلتر خواهد شد. اعتبار سنجی دادهای ورودی در مرد ایمیل چک کردن داشتن @ و یک پسوند شناخته شده و برای کد ملی ۱۰ کاراکتر رقم به یک شیوه خاص میباشد. به عنوان مثال جهت چک کردن صحت فیلد وروردی کد ملی با توجه به فرمول زیر اطمینان حاصل میکنیم. روش اعتبار سنجی کد ملی:
دهمین رقم شماره ملی را ( از سمت چپ ) به عنوان A در نظر می گیریم.
یک مقدار B در نظر می گیریم و آن را برابر با =
(اولین رقم * ۱۰) + ( دومین رقم * ۹ ) + ( سومین رقم * ۸ ) + ( چهارمین رقم * ۷ ) + ( پنجمین رقم * ۶) + ( ششمین رقم * ۵ ) + ( هفتمین رقم * ۴ ) + ( هشتمین رقم * ۳ ) + ( نهمین رقم * ۲ )
قرار می دهیم.
مقدار C را برابر با = B – (B/11)*11 قرار می دهیم.
اگر مقدار C برابر با صفر باشد و مقدار A برابر C باشد کد ملی صحیح است.
اگر مقدار C برابر با ۱ باشد و مقدار A برابر با ۱ باشد کد ملی صحیح است.
اگر مقدار C بزرگتر از ۱ باشد و مقدار A برابر با ۱۱ – C باشد کد ملی صحیح است.
چک کردن صحت دریافت ورودی با دو روش انجام میشود بلاک لیست کردن کاراکترهای پر خطر و یا وایت لیست کردن کاراکترهای مجاز.
در پایان اشاره کنم که فایروالهای خاصی مانند فایروالهای شبکه و WAF برای امنیت دیتابیس دیتابیس نیز تولید شده اند مانند: FortiDB
مطالب زیر را حتما بخوانید
-
اکتیو دایرکتوری (Active Directory) چیست و چگونه کار می کند؟
26 بازدید
-
بخش بندی شبکه (Network Segmentation) چیست؟
103 بازدید
-
۸ راه برای افزایش امنیت شبکه
2.58k بازدید
-
۲۰ اصطلاح مهم امنیت شبکه که باید بدانید
3.01k بازدید
-
SOC چیست؟ تکنولوژی، اهداف و ابزارهای مرکز عملیات امنیت
6.23k بازدید
-
فیشینگ (Phishing) چیست؟ بررسی و نحوه پیشگیری از آن چگونه است
2.51k بازدید
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.