حمله تزریق SQL چیست؟
حمله تزریق SQL نوعی از حملات وب است که هکر با اجرای یک سری دستورات مخرب، عملیاتی را روی پایگاه داده آسیب پذیر انجام میدهد. در این نوع حملات، نفوذگر از نقصهای برنامه نویسی و امنیتی که در سایت یا نرم افزار وجود دارد، سوء استفاده میکند. در واقع این نوع سایتها و نرم افزارها هدف بسیاری از حمله کنندهها برای دستیابی به اطلاعات یک پایگاه داده خواهند بود. پرس و جوهای معمول دارای بخشهای مختلفی هستند که حملات تزریق SQL فقط در بخش شرطی Where اتفاق میافتد. حمله تزریق SQL به راحتی دادههای مهم موجود در پایگاه داده را افشاء کرده و هم چنین میتواند موارد دلخواه خود را به پایگاه داده اضافه کند و یا از آن حذف کند.
این حمله زمانی اتفاق میافتد که اپلیکیشن، دادههایی که توسط هکر دریافت میکند را بدون اعتبارسنجی و پاک سازی، پردازش میکند. در بدترین حالت هکر میتواند کنترل سروری که پایگاه داده را میزبانی میکند به دست بگیرد. اثر این حمله به عواملی مانند اینکه آسیب پذیری در کجای کد رخ داده، آسیب پذیری چقدر کار هکر را آسان کرده و اینکه تا چه سطحی دسترسی به پایگاه داده را به دست گرفته، بستگی دارد. هدف اصلی این حملات، دادههای ساکن در یک پایگاه داده است که از طریق Firewall محافظت میشوند.
به طور کلی به یک مهاجم اجازه میدهد تا دادههایی را که معمولاً قادر به بازیابی نیستند مشاهده کند. این موضوع ممکن است شامل داده های کاربران یا هر داده دیگری باشد که برنامه به آن دسترسی دارد.
در بسیاری موارد، یک مهاجم میتواند این دادهها را تغییر داده یا حذف کند و باعث ایجاد تغییرات مداوم در محتوا یا رفتار برنامه شود. همچنین یک مهاجم میتواند با حمله تزریق SQL، سرور اصلی یا سایر زیرساختهای back-end را به خطر بیاندازد یا یک حمله denial-of-service را انجام دهد.
تأثیرات حمله تزریق SQL
حمله تزریق SQL میتواند منجر به دسترسی غیر مجاز به دادههای حساس مانند گذرواژهها، اطلاعات کارت اعتباری یا اطلاعات شخصی کاربر شود. بسیاری از موارد نقض دادههای مشهور در سالهای اخیر نتیجه حملات حمله تزریق SQL بوده و منجر به صدمه به اعتبار آنها شده است.
در بعضی موارد، یک مهاجم میتواند یک پشتیبان مداوم را در سیستمهای سازمان بدست آورد و منجر به سازش طولانی مدت شود که میتواند برای مدت طولانی بدون اینکه شناسایی شود کار خود را ادامه دهد.
انواع تزریق SQL
تعداد زیادی از آسیب پذیریها، حملات و تکنیکهای حمله تزریق SQL وجود دارد که در شرایط مختلف ایجاد میشوند. برخی از نمونههای معمول تزریق SQL عبارتند از:
- بازیابی دادههای پنهان: جایی که میتوانید یک درخواست SQL را برای بازگشت نتایج اضافی اصلاح کنید.
- برهم زدن منطق برنامه:جایی که میتوانید یک سوال را برای تغییر در منطق برنامه تغییر دهید.
- حمله به UNION: در آن میتوانید دادهها را از جداول پایگاه دادههای مختلف بازیابی کنید.
- بررسی بانک اطلاعاتی: جایی که میتوانید اطلاعات مربوط به نسخه و ساختار بانک اطلاعات را استخراج کنید.
- تزریق کور SQL: در آن نتایج جستجوی شما کنترل شده و در پاسخ برنامه وجود ندارد.
- بازیابی دادههای پنهان
یک برنامه خرید را در نظر بگیرید که محصولات را در دسته های مختلف نمایش میدهد. وقتی کاربر بر روی دسته هدایا کلیک کند، مرورگر، URL را درخواست میکند:
این امر باعث میشود تا یک نرم افزار SQL برای بازگرداندن جزئیات مربوط به محصولات از پایگاه داده، از یک SQL Query استفاده کند:
SELECT * FROM products WHERE category = ‘Gifts’ AND released = 1
این پرس و جو (SQL query) از database اطلاعات زیر را درخواست میکند:
- all details
- from the products table
- where the category is Gifts
- and released is 1
“released = 1” برای مخفی کردن محصولاتی که عرضه نمیشوند، استفاده میشود. برای محصولات منتشر نشده “released = 0” استفاده میشود.
این برنامه هیچگونه دفاعی را در برابر حملات تزریق SQL پیاده سازی نمیکند، بنابراین یک مهاجم میتواند حملهای مانند:
“–‘https://insecure-website.com/products?category=Gifts”
نتیجه جستجوی SQL به صورت زیر میباشد:
SELECT * FROM products WHERE category = ‘Gifts’–‘ AND released = 1
نکته اصلی در اینجا این است که توالی دو خط “–” یک شاخص در SQL است و به این معنی است که بقیه پرس و جو به عنوان یک تفسیر تعبیر میشود.
این موضوع به طور تاثیر گذاری باقی مانده پرس و جو را از بین میبرد، بنابراین دیگر “1=AND released” منتشر نمیشود. این بدان معنی است که همه محصولات از جمله محصولات غیرمجاز نمایش داده میشوند.
2.برهم زدن منطق برنامه
برنامهای را در نظر بگیرید که به کاربران اجازه میدهد با یک نام کاربری و رمز عبور وارد شوند. اگر کاربر نام کاربری و رمز عبور را ارسال کند، برنامه با انجام SQL زیر، اعتبار نامه را بررسی میکند:
‘SELECT * FROM users WHERE username = ‘wiener’ AND password = ‘bluecheese
اگر پرس و جو، جزئیات یک کاربر را بازگرداند، ورود به سیستم موفقیت آمیز خواهد بود. در غیر این صورت درخواست پذیرفته نمیشود.
در این بخش، یک مهاجم میتواند مانند هر کاربر و بدون رمز ورود به سادگی با استفاده از”SQL comment–” وارد سیستم شود.
بخش چک کردن رمز عبور را از قسمت “WHERE” انجام میدهد و آن را حذف میکند. به عنوان مثال، ارسال نام کاربری ” –‘administrator “و یک رمز عبور خالی به صورت خط زیر:
”=SELECT * FROM users WHERE username = ‘administrator’–‘ AND password
میتواند کاربر را که نام کاربری آن administrator است از دیتابیس دریافت کند و هکر خود را به جای کاربر ثبت کند.
3.حمله به UNION
در مواردی که نتایج یک پرس و جو SQL در پاسخ برنامهها برگردانده شود، مهاجم میتواند از آسیب پذیری SQL Injection برای بازیابی دادهها از جداول دیگر در پایگاه داده استفاده کند.
این کار با استفاده از کلمه کلیدی UNION انجام میشود و به شما امکان میدهد “Select query” اضافی را نیز انجام دهید و نتایج را به پرس و جو اصلی اضافه کنید.
به عنوان مثال، اگر برنامهای درخواست زیر را که حاوی ورودی کاربر “gifts” است، اجرا کند:
‘SELECT name, description FROM products WHERE category = ‘Gifts
سپس هکر میتواند ورودی زیر را ارسال کند:
–UNION SELECT username, password FROM users
این امر باعث میشود برنامه تمام نامهای کاربری و کلمات عبور را به همراه نام و توضیحات محصولات بازگرداند.
4.بررسی بانک اطلاعاتی
پس از شناسایی اولیه آسیب پذیری SQL Injection، به طور کلی دستیابی به برخی اطلاعات در مورد خود پایگاه داده مفید است. این اطلاعات اغلب میتواند راه را برای بهره برداری بیشتر هموار کند.
میتوانید جزئیات نسخه مربوط به پایگاه داده را پرس و جو کنید. نحوه انجام این کار بستگی به نوع بانک اطلاعاتی دارد، بنابراین میتوانید نوع پایگاه داده را از هر تکنیک دیگری بدست آورید. به عنوان مثال، در Oracle می توانید این کار را انجام دهید:
SELECT * FROM v$version
همچنین میتوانید تعیین کنید که جداول بانک اطلاعاتی وجود دارد و کدام ستون ها را شامل میشود. به عنوان مثال، در اکثر بانکهای اطلاعاتی میتوانید عبارت زیر را برای لیست کردن جدولها اجرا کنید:
SELECT * FROM information_schema.tables
5.تزریق کور SQL
بسیاری از موارد تزریق SQL آسیب پذیری کور است. این بدان معناست که برنامه نتایج جستجوی SQL یا جزئیات هرگونه خطای پایگاه داده را در پاسخ های خود باز نمیگرداند.
از آسیبپذیریهای کور هنوز هم میتوان برای دسترسی به دادههای غیر مجاز استفاده کرد، اما تکنیکهای موجود عموماً پیچیده تر و دشوار هستند.
بسته به ماهیت آسیبپذیری و پایگاه داده، از تکنیکهای زیر میتوان برای سوءاستفاده از آسیبپذیریهای تزریق کور SQL استفاده کرد:
- شما میتوانید منطق پرس و جو را تغییر دهید تا بسته به حقیقت یک شرط واحد، اختلاف قابل تشخیص در پاسخ برنامه ایجاد شود. این ممکن است شامل تزریق یک شرایط جدید به برخی از منطق بولی و یا ایجاد مشروط مانند خطای تقسیم بر صفر باشد.
- شما میتوانید به طور مشروط یک تأخیر زمانی در پردازش پرس و جو ایجاد کنید که به شما این امکان را میدهد تا واقعیت شرط را بر اساس زمانی که برنامه پاسخ میدهد استنباط کنید.
- با استفاده از تکنیکهای OAST میتوانید تعامل خارج از باند شبکه را آغاز کنید. این روش بسیار قدرتمند است و در شرایطی کار میکند که تکنیکهای دیگر این کار را انجام ندهند. شما میتوانید مستقیماً دادهها را از طریق کانال خارج از باند، مجزا کنید، به عنوان مثال با قرار دادن دادهها در جستجوی DNS برای دامنهای که شما کنترل میکنید.
نحوه تشخیص آسیبپذیریهای تزریق SQL
اکثر آسیبپذیریهای تزریق SQL را میتوان با استفاده از اسکنر آسیب پذیری وب “Burp Suite” یافت.
SQL Injection میتواند به صورت دستی و با استفاده از یک مجموعه سیستماتیک از تست در برابر هر نقطه ورود به برنامه تشخیص داده شود. به طور معمول شامل موارد زیر است:
- ارسال شخصیت نقل قول واحد و به دنبال خطا یا ناهنجاریهای دیگر.
- ارسال برخی از نحوههای خاص SQL که به مقدار پایه (اصلی) از نقطه ورود و به یک مقدار دیگر ارزشیابی میکنند
- ارسال شرایط بولی مانند 1 = 1 و 1 = 2 و جستجوی تفاوت در پاسخ برنامه.
- ارسال بارهای با هدف ایجاد تأخیر در هنگام اجرای درخواست در SQL و به دنبال تفاوت در زمان لازم برای پاسخگویی هستید.
- ارسال بارهای OAST با هدف ایجاد تعامل شبکه خارج از باند هنگام اجرای یک پرس و جو SQL و نظارت بر هرگونه تعامل حاصل از آن، طراحی شده است.
تزریق SQL در قسمت های مختلف پرس و جو
بیشتر آسیبپذیریهای تزریق SQL در بند “WHERE” از “SELECT Query” بوجود میآیند. این نوع تزریق SQL معمولاً توسط آزمایش کنندگان باتجربه قابل درک است.
آسیبپذیریهای تزریق SQL میتوانند در هر مکانی از پرس و جو نمایش داده شود. رایجترین مکانها که در آن حمله تزریق SQL بوجود می آید یه شرح زیر میباشد:
- در بیانیه های UPDATE، در مقادیر به روز شده یا بند WHERE
- در عبارت INSERT، درون مقادیر درج شده
- در عبارت SELECT، در جدول یا نام ستون آمده است
- در بیانیه های SELEC، در بند ORDER BY
عوامل خاص در پایگاه داده
برخی از ویژگیهای اصلی زبان SQL به همان روش در سراسر سیستم عاملهای پایگاه داده محبوب اجرا میشود، بنابراین بسیاری از روشهای شناسایی و بهره برداری از آسیب پذیریهای تزریق SQL به طور یکسان در انواع مختلف بانک اطلاعاتی کار میکنند.
این بدان معنی است که تفاوتهای زیادی بین بانکهای اطلاعاتی مشترک نیز وجود دارد. و برخی از تکنیکهای تشخیص و بهره برداری از حمله تزریق SQL بر روی سیستم عاملهای مختلف کار میکنند. مثلا:
- ترکیب اتصال رشتهای
- نظرات
- پرسشهای دسته ای
- API های ویژه بستر های نرم افزاری.
- پیام خطا
روشهای جلوگیری از حمله تزریق SQL
1. Parameterization queries (پارامتری کردن پرس و جوها): برای جلوگیری از به وجود آمدن باگ، برنامهنویس باید از Queryهای پارامتر شده استفاده کند. به آن معنی که در آن Queryها یکبار بدون داشتن متغیر به سرور پایگاه داده ارسال شوند و در مرحله بعد به صورت جداگانه ارسال شوند. این موجب افزایش امنیت و سرعت کار با پایگاه داده میشود. زیرا متغیرهای ما به صورت مستقیم در دستور SQL که میفرستیم قرار نگرفته و به صورت جداگانه ارسال میشوند. بنابراین هکر نمیتواند به Query ما دستوری اضافه کند.
2. Stored Procedure: تا حد امکان از روشهای ذخیره شده استفاده کنیم. یک قسمتی از بانک اطلاعاتی SQL Server است که میتوان در آنها از دستورات Select، Insert Delete و … استفاده کرد و با استفاده از پارامترهای ورودی یا خروجی میتوان اطلاعاتی از آنها دریافت کرد.
4. Least privilege: به معنی کاهش اثر تزریق کد از طریق اعطای امتیاز کمتر به کاربران پایگاه داده است. به عنوان مثال به کاربران حق دسترسی read، view و … بدهیم.
5. White List Input Validation: به معنای تعریف دقیق ورودیهای معتبر، اعتبارسنجی آنها قبل از فرستادن به Query، ایجاد ساختار اعتبارسنجی برای ورودیهایی که فرمت خاصی دارند، مانند ایمیل و تاریخ، استفاده از توابع اعتبارسنجی ابزار ESAPI مانند getValidData()، getValidInput، getValidFileName و…
نتیجه: هنگام طراحی سایت بهتر است اطلاعات حیاتی مانند رمز عبور، شماره کارت اعتباری و… به صورت متن ساده یا Plain Text ذخیره نشوند. به صورت رمزنگاری در پایگاه داده ذخیره شوند. اگر به هر طریقی وب سایت مورد حمله قرار گرفت، هکر قادر به دستیابی به آنها نباشد. برای این منظور بهتر است از پسوردهای قوی استفاده شود، آسیبپذیریها بررسی شود، سایتها با کدها و برنامههای جدید بروز رسانی شوند.
منبع: سافت یاب
برای دریافت نسخه آزمایشی اینجا کلیک کنید