
حملات تزریق SQL
تزریق به پایگاه داده (به انگلیسی: SQL injection) نوعی فن تزریق کد است که نقص امنیتی نرمافزار وبسایت را اکسپلویت میکند. به این صورت که نفوذگر با یک سری دستورهای اسکیوال، عملیاتی را (متفاوت با عملیات عادی موردنظر طراح وبسایت) در پایگاه داده وبسایت آسیبپذیر انجام میدهد.
تزریق SQL یک روش حمله است که هدف آن دادههای ساکن در پایگاه داده ای است که از طریق Firewall محافظت میشود. حمله معمولاً به علت مدیریت ضعیف در اعتبار سنجی کدها یا ورودیهای برنامه (وب سایت) اتفاق میافتد. حمله تزریق SQL زمانی اتفاق میافتد که یک مهاجم قادر به قرار دادن یک سری از عبارتهای SQL در یک Query (پرس و جو) با دستکاری دادههای ورودی کاربر در یک برنامه مبتنی بر وب میباشد. البته این مسئله نیز مستقیماً با نحوه مدیریت کدها و ورودیهای وب سایت رابطه مستقیم دارد. یک حملهکننده میتواند از نقصهای برنامهنویسی یا حفرههای امنیتی وب سایت یا نرمافزار به راحتی برای دستیابی به اطلاعات یک پایگاه داده استفاده نماید.
پرس و جوی معمول دارای چند بخش مختلف به شرح ذیل میباشد:
دستور Select: با استفاده از این دستور ستونهایی که مورد نظرمان است را انتخاب می نمائیم.
From: که مشخص مینماید که ستونهای مورد نظر ما از کدام جدول انتخاب شوند.
Where: که در آن شروطی را مشخص می نمائیم.
و یک سری دستورات و عبارها و متدهای دیگر . . .
حملات تزریق از طریق SQL فقط در بخش شرطی Where اتفاق میافتند.
SQL Injection در واقع یک آسیب پذیری امنیتی وب است که به مهاجم اجازه میدهد از طریق query هایی که یک برنامه تحت وب به پایگاه داده اش ارسال مینماید به اطلاعات پایگاه داده دسترسی یابد. این اطلاعات ممکن است، اطلاعات مربوط به کاربران دیگر باشد یا هر اطلاعات دیگری که مهاجم در حالت عادی اجازه دسترسی به آنها را ندارد. همچنین در بسیاری موارد مهاجم میتواند اطلاعاتی که به آنها دست یافته است را تغییر دهد یا پاک کند. همچنین در مواردی موفق به دسترسی به سرور و یا سایر تجهیزات back-end شده و حملات انکار سرویس به راه بیندازد. مهاجم از طریق فرمهای سایت و یا به طور کل هر نقطهای که میتواند اطلاعات را وارد نماید، کدهای مخرب SQL را وارد مینماید و کدها در سمت پایگاه داده اجرا خواهند شد و مهاجم را به مقاصدش میرسانند. این کدهای ورودی نیز بنا به نوع سرویس میزبانی و پایگاه داده متفاوت است. با ما باشید تا در ارتباط با حمله تزریق SQL و راهکارهای جلوگیری از آن به شما بیشتر توضیح دهیم.
انواع حملات تزریق SQL
در ادامه در پنج دسته و با مثال در هر دسته حمله تزریق SQL را به شما توضیح خواهیم داد:
- حملاتی که منجر به افشای اطلاعات پنهان میگردد
- حملاتی که منطق برنامه کاربردی را به هم میریزد
- حملاتی که به منظور استخراج داده از دیگر جداول پایگاه داده انجام میپذیرد
- حملاتی که به منظور سنجش پایگاه داده صورت میپذیرد
- حملات کورکورانه تزریق SQL
حملات تزریق SQL که منجر به افشای اطلاعات پنهان میگردد
با یک مثال این نوع از حمله تزریق SQL را توضیح میدهیم. یک برنامه کاربردی فروشگاهی را در نظر بگیرید به نام OnlineShop. کاربر بر روی دستهبندی هدیه کلیک کرده مرورگرش این URL را ارسال مینماید:
https://shoponline.com/products?category=Gifts
بعد از آن این SQL query ارسال میگردد تا جزئیات محصولات مرتبط از پایگاه داده استخراج شود.
SELECT * FROM products WHERE category = ‘Gifts’ AND released = 1
موارد زیر از پایگاه داده درخواست میگردد:
تمامی جزئیات از جدول محصولات جایی که دسته بندی هدیه است و released = 1 میباشد. در واقع released=1 برای کالاهای عرضه شده است و مقدار صفر برای کالاهای عرضه نشده است، پش فروشگاه کالاهایی که عرضه نشده است را نمیخواهد به کاربران نشان دهد. پس در این سناریو اطلاعات پنهان پایگاه داده که به کاربر نبایستی نمایش داده شود، کالاهای عرضه نشده است. حملهای که میتواند صورت پذیرد میتواند بدین صورت باشد:
https://shoponline/products?category=Gifts’–
نتایج SQL query به صورت زیر است:
SELECT * FROM products WHERE category = ‘Gifts’–‘ AND released = 1
خب نکته کلیدی در”–” یا به اصطلاح double dash میباشد. زیرا بعد از “–” هر چه که بیاید به عنوان comment برداشت میشود. در نتیجه پایگاه داده released=1 را در نظر نگرفته و در خروجی تمام موارد چه عرضه شده و چه عرضه نشده را ارسال مینماید.
یا میتواند سناریوی هوشمندانهتری نیز باشد:
https://onlineshops.com/products?category=Gifts’+OR+1=1–
حاصل آن SQL query زیر خواهد بود.
SELECT * FROM products WHERE category = ‘Gifts’ OR 1=1–‘ AND released = 1
در نتیجه چه محصولاتی که عرضه شدهاند و چه محصولاتی که عرضه نشدهاند نمایش داده خواهند شد. البته این سناریو ساده در حالتی است که هیچگونه ارزیابی امنیتی در سمت پایگاه داده وجود ندارد که در اکثر موارد بدین سادگی نیست. همچنین در بحث تزریق SQL خلاقیت مهاجم عامل بسیار موثری است تا بتواند از کوچکترین آسیبپذیریای به نحو احسن استفاده نماید.
حملات تزریق SQL که منطق برنامه کاربردی را به هم میریزد
این حمله را نیز با یک سناریو توضیح خواهیم داد. حالتی را در نظر بگیرید که کاربر در وب سایت یا برنامه کاربردی مورد نظرش میتواند نام کاربری و گذرواژه وارد کند. نام کاربری را “اپل” و گذرواژه را “۱۲۳” در نظر بگیرید. SQL query زیر به سمت پایگاه داده فرستاده خواهد شد:
SELECT * FROM users WHERE username = ‘اپل’ AND password = ‘۱۲۳’
حال مهاجم میتواند دوباره از همان دابل دش در این بار در قسمت نام کاربری استفاده نماید و بررسی گذرواژه را دور بزند.
SELECT * FROM users WHERE username = ‘administrator’–‘ AND password = ”
همانطور که میبینید به صورت هوشمندانهای نام کاربری administrator انتخاب شده است.
حملات تزریق SQL که دادهها از دیگر جداول پایگاه داده استخراج مینماید
مورد بعدی مربوط به زمانی است که به اطلاعات جداول دیگر مهاجم دست مییابد. در این حمله از کلیدواژه UNION استفاده میشود، کلید واژه ای که اجازه میدهد تا یک SELECT query اجرا شده و نتایج به query اصلی اضافه گردد. به طور مثال اگر یک برنامه کاربردی query زیر را اجرا نماید
SELECT name, description FROM products WHERE category = ‘Gifts’
و در آن مهاجم به جای ورودی Gifts ورودی زیر را قرار دهد:
‘ UNION SELECT username, password FROM users—
برنامه کاربردی در خروجی تمامی نامهای کاربری و گذرواژهها را همراه با اسامی و توضیح محصولات برمیگرداند.
منبع مقاله: آرمان داده پویان