SQL Injection
این مطلب توسط جناب آقای «حسین نفیسی اصل» نوشته شده و به دست ما رسیده است. از ایشان بابت نگارش این مطلب سپاسگزاریم.
سرخط مطلب
با توجه به آمار سایت معتبر OWASP ، مهمترین خلا امنیتی سایتها نقوذپذیری از طریق پایگاه داده بوده است. جزئیات روش نفوذ کردن از این طریق همیشه مورد توجه هکرها و مسولین آیتی شرکتها بوده است. امن کردن سایت در مقابل این نوع از حملات مبحث مهم و بهروزی به شمار میرود.
چکیده
حملات SQL Injection در طی ۱۰ سال اخیر پرکاربردترین حملات سایبری بوده است و بیشترین تعداد نفوذ را به خود اختصاص داده است. امن کردن این نفوذپذیری امروزه اهمیت بسیار زیادی در بین سایتها پیدا کرده است و حتی توسعهدهندگان زبانهای برنامهنویسی سمت سرور نیز برای حل این مورد توابع و کتابخانههایی را به زبان خود اضافه کردهاند. نقطه شروع این حملات جایی است که وبسرور تلاش میکند با پایگاه داده ارتباط برقرار کند. دقیقا در این زمان است که هکر میتواند نفوذ کند و به اطلاعات سایت دست پیدا کند.
مقدمه
نفوذ از طریق تزریق کردن کدهای SQL زمانی شروع میشود که وبسرور تلاش میکند با پایگاه داده ارتباط برقرار کند. در صورتی که برنامهنویس ملاحظات لازم را انجام نداده باشد، هکر میتواند از این طریق به تمام اطلاعات پایگاه داده دست پیدا کند و یکی کپی از آنها را به سیستم خود منتقل کند. این اطلاعات میتواند شامل نام کاربری و رمزهای عبور به صفحه مدیریت سایت نیز باشد و در این صورت تمام سایت در کنترل هکر قرار خواهد گرفت. اگر سری به سایت OWASP بزنیم، میبینیم که خطر این حملات بسیار جدی است و آمار بیشترین حملات متعلق به همین روش است. این روش انواع مختلفی دارد که در ادامه به بررسی آنها و نهایتا راهکار بستن این راه نفوذ پرداخته میشود.
SQL Injection چیست؟
اغلب سایتها در کنار وبسرور خود از یک پایگاه داده برای ذخیره و بارگذاری اطلاعات استفاده میکنند. در کاربردهای بسیار زیادی نیاز است که مطابق با ورودی کاربر تغییراتی در پایگاه داده انجام گیرد. به عنوان مثال در زمان ثبتنام کردن یک کاربر. در کاربردهای بسیاری نیز با توجه به ورودی کاربر در پایگاه داده جستجو انجام میشود، مانند جستجوی یک کلمه در سایتهای خبری.
در این کاربردها در برنامهنویسی سمت سرور) در فایل php یا asp یا … (نیاز است که یک رشته شامل دستور پایگاه داده) به زبان SQL (و ورودی کاربر به پایگاه داده فرستاده و در پایگاه داده اجرا شود. نحوه ترکیب کردن ورودی کاربر و دستور SQL میتواند به گونهای باشد که به هکرها اجازه بدهد دستورات را مطابق میل خود تغییر دهند و وارد پایگاه داده کنند. در صورتی که برنامهنویس در زمان ترکیب کردن این دو رشته دقت لازم را به کار نبرد، سایت حاصل از طریق SQL Injection نفوذ پذیر خواهد بود.
یک مثال ساده از SQL Injection
فرض کنید در سمت سرور کد php زیر در حال اجرا باشد.
SELECT accountNumber, balance FROM accounts WHERE account_owner_id = 984
984 ورودی کاربر است. حال فرض کنید کاربر ورودی زیر را وارد کند.
0 OR 1=1
در این صورت رشته زیر به پایگاه داده ارسال میشود.
SELECT accountNumber, balance FROM accounts WHERE account_owner_id = 0 OR 1=1
همانطور که مشخص است پایگاه داده با گرفتن دستور فوق اطلاعات تمامی کاربران را برمیگرداند. در صورتی که کاربر مجاز به داشتن چنین اطلاعاتی نیست.
بررسی تخصصیتر SQLI
همانطور که در مثال فوق مشاهده شد، نقطهای که نسبت به SQLI نفوذپذیر است، زمانی است که ورودی کاربر بدون هیچ فیلتری وارد دستور پایگاه داده میشود. تمامی راههای امنسازی در مقابل این نوع حمله، زیر مجموعه این ایده کلی است که ورودی باید اعتبارسنجی (Validate) شود. حال این اعتبارسنجی میتواند با استفاده از توابعی باشد که کاربر خود پیادهسازی کرده است یا توابعی که به طور سیستمی در زبان برنامهنویسی برای این کار تعبیه شده است. به شدت توصیه میشود که از توابع سیستمی استفاده شود.
به طور مرسوم چهار روش برای انجام حمله SQL Injection وجود دارد. هر یک از این روشها کاربردهای خاص خود را دارد. این که کدام از روشها قابل استفاده است بستگی به برنامهنویسی سمت سرور دارد. این چهار روش شامل موارد زیر است:
- Boolean-based SQLi : در این روش، اشتباه برنامهنویس موجب شده است که هکر بتواند درستی یا نادرستی گزارهای را بدست بیاورد. در این موارد معمولا هکر با استفاده از ابزارهای اتوماتیک موجود (SQLmap و Havij) ابتدا سعی میکند تعداد حروف نام دیتابیس و سپس حروف آن را پیدا کند. در مرحله بعدی اسم جداول و در مرحله بعد اسم ستونها و نهایتا دیتاها را.
- Eror-based SQLi : در این روش هکر با وارد کردن دستوراتی عمدا باعث ایجاد خطا در پایگاه داده میشود. حال هکر میتواند با این روش درستی گزارههای مورد نظر خود را بررسی کند و مشابه روش Boolean-based ادامه دهد.
- Union-based SQLi : در این روش، برنامهنویس تمام چیزی که هکر نیاز دارد را در اختیار او گذاشته است و هکر به راحتی دیتای داخل جداول را تخلیه میکند. محور این دستور کلیدواژه Union است که اجازه میدهد دیتاهای حاصل از یک دستور Select به دیتاهای دستور Select دیگری متصل شود و به صورت یکپارچه نمایش داده شود.
- Time-based SQLi : در این روش، هکر با اعمال دستورات تاخیر میتواند بررسی کند گزارههایی که وارد کرده است درست است یا نادرست. از این جا به بعد هکر مشابه روش Boolean-based عمل میکند.
امن کردن سایت نسبت به SQLi
برای شناسایی این نفوذپذیری، ابزارهای اتوماتیکی وجود دارند. بعد از شناسایی محلهای نفوذپذیری میتوان با استفاده از توابع سیستمی این نفوذپذیری را رفع کرد. از این روشها میتوان به Preapared Statemaent و Stored Precedures اشاره کرد. برای کسب اطلاعات بیشتر میتوان به منابع مراجعه کرد.
جمعبندی
نفوذپذیری SQL Injection پراستفادهترین نفوذپذیری در ۱۰ سال گذشته بوده است و شناسایی و امن کردن این نفوذپذیری در سایتها یکی از مهمترین و بهروزترین مباحث امنیت وب است. با توجه به فراگیری استفاده از پایگاه داده در سایتها وجود چنین نفوذپذیری در سایتها بسیار محتمل است و اشراف به این نفوذپذیری بسیار حائز اهمیت است. برای شناسایی این نفوذپذیری و رفع آن، ابزارهای اتوماتیکی وجود دارد که کار با آنها نیاز به تسلط دارد. ضمن اینکه تسلط برنامهنویس و بررسی شخص او قطعا امنیت بیشتری را برای سایت ایجاد خواهد کرد و به عنوان نکته آخر میتوان گفت با پوشش زبانهای برنامهنویسی، این نفوذپذیری به طور کامل قابل رفع شدن است، البته به شرط توانایی و تسلط برنامهنویس سایت.
مراجع و منابع
https://www.acunetix.com/websitesecurity/sql-injection2/
https://www.veracode.com/security/sql-injection
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
با ما همراه باشید:
آدرس کانال تلگرام: IranianJavaDevelopers@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers