حمله تزریق SQL یا به اختصار SQLI در واقع اکسپلوید کردن نقاط ضعف تکنیکهای توسعه وب است. بدین صورت که نفوذگر با یکسری دستورات SQL، عملیاتی را در پایگاه داده وبسایت آسیبپذیر انجام میدهد. نتیجه یک حمله موفقیت آمیز تزریق SQL میتواند از جعل هویت کاربر تا بدست گرفتن پایگاه داده یا سرور مربوطه باشد.
در این مطلب قصد داریم با مثالهای روشن و سادهای به چگونگی انجام این نوع حمله و روشهای جلوگیری از آن بپردازیم; پس با ما باشید.
حمله تزریق SQL چگونه انجام میشود :
هر زمانی که با نام کاربری و رمزعبور خود وارد یک حساب کاربریتان شوید، احرازهویت برنامه وبسایت ممکن است کوئری زیر را اجرا کند :
SELECT UserID FROM Users WHERE UserName='myuser' AND Password='mypass';
ترکیب نام کاربری و رمزعبور وارد شده باید با یکی از دادههای جدول Users یکی باشد تا UserID برگردانده شود. و اگر همچین دادههایی در جدول نباشد، هیچ IDای برگردانده نمیشود و احراز هویت نامعتبر است. در نظر داشته باشید ممکن است پیاده سازیها متفاوت باشند.
حالا بیایید نگاهی به کوئری احراز هویت زیر بیندازیم که دادههای کاربر را در قالب وب وارد کردهایم:
SELECT UserID FROM Users WHERE UserName='[user]’ AND Password='[pass]’
کوئری فوق در نگاه اول ممکن است یک اعتبارسنجی کاربر به حساب آید. اگر همچین ورودی هایی اجرا شوند، وبسایت مورد نظر نسبت به حمله تزریق SQL آسیبپذیر است.
برای مثال فرض کنید myuser’ – – را در فیلد نام کاربری و wrongpass را در فیلد رمزعبور وارد کرده باشیم. در اینصورت کوئری زیر را خواهیم داشت :
SELECT UserID FROM Users WHERE UserName='myuser'--' AND Password='wrongpass'
کلید این عبارت اضافه کردن تک کوتیشن و داشتن دو خط ( – – ) است. تک کوتیشن به معنی اتمام رشته و هر چیزی بعد از آن به عنوان عبارت SQL در نظر گرفته میشود. دو خط ابتدای توضیح (comment) برای عبارتهای SQL است، بنابراین بعد از دو خط هر چیزی آورده شود خوانده نمیشود. در اینصورت کوئری فوق بصورت زیر در پایگاه داده اجرا میشود :
SELECT UserID FROM Users WHERE UserName='myuser'
بدین ترتیب کوئریای اجرا میشود که پارامتر رمزعبور را چک نمیکند. یعنی ما عامل رمزعبور را با آن دو خط حذف کردیم. بنابراین قادر هستیم فقط با داشتن نام کاربری وارد حساب شویم. به این عمل دستکاری پرسوجو برای رسیدن به نتایج, حمله تزریق SQL یا SQL injection میگویند.
حمله تزریق SQL چه آسیبهایی میتواند وارد کند؟
یک حمله تزریق SQL در نتیجه مسامحه کاری برنامه نویس یا کدنویس امکان پذیر است و کاملا قابل پیشگیری نیز میباشد. شدت آسیبی که وارد میشود بستگی به تنظیمات پایگاه داده دارد. برای اینکه نرمافزار وب با پایگاه داده در ارتباط باشد، نیاز دارد که به پایگاه داده وارد شود. بر حسب اینکه نرمافزار وب به چه دسترسی نیاز دارد، حساب پایگاه داده مربوطه میتواند درخواست خواندن/نوشتن در ورودیهای جدول تا دسترسی کامل به پایگاه داده را داشته باشد.
با توجه به مثال بالا ما با نام کاربری youruser’- – یا admin’- – یا هر نام کاربری مشابه دیگری بدون دانستن و وارد کردن رمزعبور میتوانیم وارد سیستم شویم. هنگامی که وارد حساب کاربری شدیم، سیستم تشخیص نمیدهد که ما در واقع همان صاحب اصلی حساب کاربری نیستیم و به ما دسترسی کامل به حساب کاربری را میدهد. احتمالا کمترین دسترسی که به پایگاه داده داریم مجوز خواندن و نوشتن است.
فرض کنید وبسایت کنترل کاملی نسبت به پایگاه داده مربوطه دارد که میتواند رکوردی را پاک کند، جدول ایجاد یا حذف کند، حساب کاربری جدید اضافه کند و غیره. در نظر داشته باشید این نوع دسترسی لزوما بد نیست و برخی اپلیکیشنها باید دسترسی کامل به پایگاه داده داشته باشند.
برای نشان دادن شدت آسیبپذیری در چنین شرایطی یک مثالی را ارائه میدهیم. اینبار در فیلد نام کاربری عبارت Robert’; DROP TABLE Users;- – و در فیلد رمزعبور wrongpass را وارد میکنیم. در نتیجه کوئری زیر را خواهیم داشت :
SELECT UserID FROM Users WHERE UserName='Robert'; DROP TABLE Users;--' AND Password='wrongpass'
کوئری فوق در پایگاه داده به شکل زیر اجرا میشود :
SELECT UserID FROM Users WHERE UserName='Robert' DROP TABLE Users
و بدین ترتیب ما با وارد شدن به حساب کاربری جدول Users را پاک کردیم. البته شدت آسیب وارده در یک حمله تزریق SQL میتواند از این هم بدتر باشد.
جلوگیری از حمله تزریق SQL
همانطور که قبلا گفتیم، این حمله قابل پیشگیری است. یکی از قانونهای اساسی در توسعه وب این است که هرگز کورکورانه به ورودیهای کابر اعتماد نکنید. به مثالهای بالا برگردید که چطور توانستیم با اضافه کردن یک تک کوتیشن و دو خط، رمزعبور را دور بزنیم.
حمله تزریق SQL میتواند به راحتی با اعتبارسنجی و پاکسازی دادههای ورودی خنثی شود که به عمل پاکسازی داده sanitize کردن هم میگوییم. عمل پاکسازی دادههای ورودی چیزی نیست به جز کنترل کردن هر تک کوتیشن (Single quotation) که در دادهها وارد میشود.
برای مثال اگر یکی از دادههای ورودی O’neil باشد، آن را بصورت O\’neil به پایگاه داده ارسال میکنیم. ( اگر برای مشخص کردن هر تک کوتیشن در ورودی کاربر علامت / را مشخص کرده باشیم )
این عمل ساده پاکسازی دادههای ورودی جلوی حمله تزریق SQL را میگیرد. برگردیم به مثال قبلی و پاکسازی را روی آنها اجرا کنیم:
myuser’– / wrongpass:
SELECT UserID FROM Users WHERE UserName='myuser\'--' AND Password='wrongpass'
به دلیل اینکه تک کوتیشن بعد از myuser به عنوان یکی از حروف نام کاربری در نظر گرفته شده است، پایگاه داده به دنبال نام کاربری myuser’- – میگردد. بعلاوه به دلیل اینکه دو خط داخل رشته نام کاربری هستند، به عنوان عبارت SQL به حساب نمیآیند.
در مورد مثال Robert’; DROP TABLE Users;– / wrongpass:
SELECT UserID FROM Users WHERE UserName='Robert\'; DROP TABLE Users;--' AND Password='wrongpass'
به سادگی با گذاشتن علامت / بعد از تک کوتیشن و در نظر گرفتن آن به عنوان یکی از حروف نام کاربری، تمام حروف بعد از آن نیز به عنوان رشته نام کاربری در نظر گرفته میشوند. بنابراین پایگاه داده نام کاربری Robert’; DROP TABLE Users;- – را جستجو خواهد کرد.
در نظر داشته باشید که حملات نفوذگرها و ابزارهایشان روزبروز متنوعتر و گستردهتر میشوند. جلوی برخی حملات را با رعایت نکات امنیتی مهم در برنامه نویسی، توسعه وب، مدیریت سرور و غیره میتوان گرفت.
منبع : http://www.howtogeek.com/97971/htg-explains-how-hackers-take-over-web-sites-with-sql-injection-ddos/
[…] امنیت آنلاین این هفته وبسایت کنشتک به موضوع حمله تزریق SQL اختصاص دارد. در این اینفوگرافیک میخوانیم که حمله […]