حملات تزریق (SQL Injection) یکی از رایجترین حملات در حوزه امنیت وب است که باعث آسیب رساندن به پایگاههای داده وبسایتها میشود. در این نوع حمله، هکرها از طریق درج یا تزریق کدهای مخرب SQL به فرم ورودیها یا پارامترهای درخواستهای HTTP، سعی در دسترسی به اطلاعات حساس در پایگاه داده دارند. با این حمله، آنها میتوانند اطلاعات مهمی مانند رمزهای عبور، اطلاعات کاربران، و حتی محتوای مخازن مهم را به دست آورند یا تغییرات ناخواسته ای در دادهها ایجاد کنند.
این حمله میتواند عواقب جدی برای وبسایتها و کاربرانشان داشته باشد، از جمله نشتی اطلاعات حساس، سوءاستفاده از حسابهای کاربری، آسیب به اعتبار وبسایت، و حتی اختلال در عملکرد وبسایت یا خدمات آن.
برای جلوگیری از حملات تزریق، ضروری است که توسعه دهندگان وبسایتها از روشهای مبارزه با این نوع حملات، مانند استفاده از استانداردهای امنیتی برای اجرای عملیات پایگاه داده، استفاده از استراتژیهای بررسی و فیلتر کردن ورودیها، و بروز رسانی منظم وبسایت، استفاده نمایند. همچنین آگاهی کاربران نیز از موارد اساسی است که میتواند به پیشگیری از حملات تزریق کمک کند.
نحوه عملکرد حملات تزریق SQL (SQL Injection):
حملات تزریق SQL (SQL Injection) یک نوع حملات حفره امنیتی در برنامههای وب و سیستمهای مدیریت پایگاه داده (DBMS) هستند. در این نوع حملات، حملهکننده با تزریق یا درج کد SQL بدون اعتبار سنجی یا فیلتر در ورودی های کاربر به برنامهها یا فرمها، سعی در اجرای دستورات SQL مخرب دارد. این حملات به حملات اینجکشن نیز مشهورند.
حملات تزریق (SQL Injection) با استفاده از ضعفها و آسیبپذیریهای موجود در ورودیها یا پارامترهای درخواستهای HTTP وبسایت، وارد پایگاه داده میشوند. این نوع حمله، اجازه میدهد تا هکرها کدهای SQL مخرب را به طور غیر مجاز در پایگاه داده وبسایت تزریق کنند.
زمانی که یک وبسایت دارای آسیبپذیری تزریق SQL است، هکرها میتوانند با وارد کردن دستورات SQL مخرب به صورت رشتههای مخرب در فرمها ورودی یا پارامترهای URL، اطلاعات محرمانه پایگاه داده را به دست آورند یا تغییرات ناخواستهای در دادهها ایجاد کنند.
بهعنوان مثال، با تزریق یک دستور SELECT مخرب، هکر میتواند اطلاعات محرمانه را از پایگاه داده بازیابی کند. همچنین، با تزریق دستورات UPDATE یا DELETE، میتواند اطلاعات را تغییر داده یا حذف کند. این حملات میتوانند به صورت خاموش و بدون اطلاع دادن به مدیران وبسایت صورت بگیرند، بنابراین شناسایی و پیشگیری از آنها بسیار حیاتی است.
مطالعه بیشتر: dns چیست؟ راهنمای جامع DNS برای کاربران
انواع حملات تزریق SQL:
تزریق در دستور WHERE:
تزریق در دستور WHERE یک روش حملهای است که حملهکننده با درج کد SQL مخرب در جمله WHERE یک کوئری، سعی در تغییر شرایط و دسترسی به اطلاعات محرمانه پایگاه داده دارد. این نوع حمله معمولاً در فرمهای ورودی یا جستجوی وبسایتها انجام میشود که از اطلاعات ورودی کاربر برای ساخت کوئریهای SQL استفاده میکنند.
به عنوان مثال، فرض کنید یک وبسایت فرمی برای جستجوی محصولات دارد و کاربران میتوانند با وارد کردن نام محصول مورد نظر، اطلاعات آن را جستجو کنند. حملهکننده میتواند با وارد کردن کد SQL مخرب مانند “‘ OR ‘1’=’1′” به جای نام محصول در فرم جستجو، شرطی که همیشه درست است را به کوئری اضافه کند. این باعث میشود که کوئری اصلی تبدیل به یک کوئری که همه رکوردها را بازیابی میکند، شود و حملهکننده به اطلاعات محرمانه پایگاه داده دسترسی پیدا کند.
بنابراین، با استفاده از تزریق در دستور WHERE، حملهکننده میتواند اطلاعات حساس مانند رمزعبورها یا اطلاعات کاربران را به طور غیرمجاز به دست آورد و از آنها برای اهداف مخربی استفاده کند.
تزریق در دستور UNION:
تزریق در دستور UNION یک روش حمله SQL Injection است که حملهکننده از آن برای دسترسی به اطلاعات محرمانه در پایگاه داده استفاده میکند. در این نوع حمله، حملهکننده با استفاده از دستور UNION در یک کوئری SQL، توانایی اجرای کوئریهای دیگر را کسب میکند و اطلاعات جدید را به نتایج اصلی اضافه میکند.
برای مثال، فرض کنید یک وبسایت دارای یک فرم جستجویی است که از یک پارامتر به نام “search” استفاده میکند. حملهکننده میتواند با وارد کردن یک کوئری تزریق شده مانند “1′ UNION SELECT 1,2,3,4 FROM users–“ در فیلد جستجو، کوئری را تغییر دهد. این کوئری با دستور UNION اطلاعاتی را از جدول کاربران به جستجوی اصلی اضافه میکند. این به حملهکننده امکان میدهد تا به اطلاعات حساس مانند رمزهای عبور کاربران دسترسی پیدا کند.
استفاده از دستور UNION باید با دقت انجام شود زیرا این دستور فقط زمانی کارآمد است که تعداد ستونها و نوع دادهها با نتایج اصلی مطابقت داشته باشد.
تزریق در دستورات دیگر:
تزریق در دستورات دیگر یک روش دیگر از حمله SQL Injection است که حملهکننده از آن برای دستکاری یا حذف اطلاعات در پایگاه داده استفاده میکند. در این نوع حمله، حملهکننده از دستورات مختلفی مانند INSERT، UPDATE یا DELETE برای انجام عملیات مخرب در پایگاه داده استفاده میکند.
برای مثال، فرض کنید یک وبسایت دارای یک فرم ثبت نام است که از پارامترهای مختلفی مانند نام کاربری، رمز عبور و ایمیل استفاده میکند. حملهکننده میتواند با استفاده از تزریق SQL در فیلدهای فرم، به سادگی اطلاعات را دستکاری کند یا اطلاعات جدیدی را به پایگاه داده اضافه کند.
برای مثال، حملهکننده ممکن است با وارد کردن یک کد تزریقی مانند “‘; DROP TABLE users; –“ در فیلد نام کاربری، توانایی داشته باشد جدول کاربران را حذف کند. یا با وارد کردن “‘; INSERT INTO users (username, password) VALUES (‘hacker’, ‘password’); –“، میتواند یک کاربر با نام کاربری و رمز عبور دلخواه را به پایگاه داده اضافه کند.
این نوع حمله بسیار خطرناک است زیرا میتواند به دسترسی غیرمجاز به اطلاعات حساس و افتادن وبسایت به خطر بیافتد.
تزریق دستورات تاریخی (Time-Based):
تزریق دستورات تاریخی، یک روش پیشرفته از حملات تزریق SQL است که حملهکننده از آن برای نفوذ به پایگاه داده و استخراج اطلاعات استفاده میکند. در این نوع حمله، حملهکننده دستورات SQL را طوری طراحی میکند که بر اساس تفاوت در زمان پاسخ داده شده توسط وبسایت، میتواند اطلاعات مورد نظر را به دست آورد.
برای مثال، حملهکننده ممکن است یک کوئری مانند “SELECT * FROM users WHERE username = ‘admin’ AND password LIKE ‘%a%’ AND SLEEP (5);” را ارسال کند. این کوئری یک عملیات بازیابی را انجام میدهد که مدت زمان آن به میزانی طولانیتر است که میتوان از طریق آن به دادههای مورد نظر دسترسی پیدا کرد.
با استفاده از این روش، حملهکننده میتواند اطلاعاتی مانند نام کاربری و رمز عبور را به صورت تدریجی و با تکرار ارسال کوئریها به دیتابیس برای تحلیل زمانی دریافتی از وبسرور استخراج کند. این اطلاعات میتواند برای کسب دسترسی غیرمجاز به سیستم و اطلاعات حساس، مانند اطلاعات کاربران یا رمزهای عبور، استفاده شود.
تزریق نوع مخرب (Blind SQL Injection):
تزریق نوع مخرب یا Blind SQL Injection یکی از روشهای حملات تزریق SQL است که در آن حملهکننده اطلاعات مورد نیاز خود را از پایگاه داده استخراج میکند بدون اینکه نتایج کوئری را مستقیماً ببیند. این حمله معمولاً در مواردی انجام میشود که خروجی کوئریها به حملهکننده نمایش داده نمیشود ولی میتواند با تحلیل رفتار و پاسخهای وبسایت انجام شود.
برای مثال، حملهکننده میتواند یک کوئری مخرب مانند “SELECT COUNT (*) FROM users WHERE username = ‘admin’ AND substring(password,1,1) = ‘a’;” را ارسال کند. این کوئری بازیابی را بررسی میکند که آیا کاربری با نام کاربری “admin” و رمز عبوری که حرف اول آن “a” است، وجود دارد یا خیر. اگر وبسایت پس از اجرای این کوئری با خطا یا تأخیر جواب دهد، حملهکننده میتواند فهمید که کاربری با نام کاربری “admin” و رمز عبوری که حرف اول آن “a” است، وجود دارد.
با ادامه این روند و ترکیب کوئریهای مختلف با تحلیل واکنشهای وبسایت، حملهکننده میتواند به طور پنهانی اطلاعات حساس مانند نام کاربری و رمز عبور را استخراج کند و از آنها برای دسترسی غیرمجاز به سیستم و اطلاعات استفاده کند.
فیلتر اشتباه کاراکتر های “”
این آسیب پذیری از راههای گوناگونی پدید میآید. یک طریق فیلتر نشدن کراکترهای (” و ‘) است. برای مثال:
statement = “SELECT * FROM users WHERE name = ‘” + userName + “‘;”
کار این کد استخراج اطلاعات یک نام کاربری (که به متغیر داده میشود) از جدول users است. اما نفوذگر میتواند با دادن مقدارهای هوشمندانه به متغیر userName، سبب اجرای دستورهایی متفاوت از آنچه موردنظر کدنویس بوده است بشود. برای مثال با وارد کردن این کد به عنوان ورودی:
‘ OR ‘a’=’a
کد نهایی اینچنین رندر میشود:
SELECT * FROM users WHERE name = ” OR ‘a’=’a’.
همچنین میتوان با یکی از این سه روش، ادامه کد را کامنت گرفت:
‘ OR ‘a’=’a’ — ‘
‘ OR ‘a’=’a’ ({‘
‘ OR ‘a’=’a’ /* ‘
که نتیجه چنین است:
SELECT * FROM users WHERE name = ” OR ‘a’=’a’ — ‘.
مثلاً ممکن است در کدی، ادامه کد، مربوط به بررسی گذرواژه باشد. در آن حالت با این کار آن بخش از کد، کامنت گرفته میشود و پردازش نمیشود. به این ترتیب نفوذگر بدون وارد کردن گذر واژه از مانع میگذرد.
یا مثلاً وارد شدن چنین عبارتی:
a’; DROP TABLE users; SELECT * FROM userinfo WHERE ‘t’ = ‘t
سبب حذف جدول users و نیز استخراج تمام اطلاعات جدول userinfo میشود.
این ورودی به صورت دستور SQL زیر رندر و مشخص میشود:
SELECT * FROM users WHERE name = ‘a’;DROP TABLE users; SELECT * FROM userinfo WHERE ‘t’ = ‘t’;
در حالی که بسیاری از پیادهسازیهای SQL Server امکان اجرای چندین دستور را در یک فراخوان، مانند این مثال، فراهم می-کنند، برخی از رابطهای برنامه کاربردی SQL مثل تابع؛ ()mysql_query در زبان PHP به دلایل امنیتی اجازه این عملیات را نمیدهند. این محدودیت باعث جلوگیری از تزریق Queryهای کاملاً مجزا از هم توسط مهاجمان میشود، اما نمیتواند مانع تغییر Queryها شود.
مدیریت نادرست نوع ورودی
این شکل از تزریق زمانی اتفاق میافتد که یک فیلد کاربر از نظر محدودیتهای نوع ورودی بررسی نشده باشد. این اتفاق زمانی میتواند رخ دهد که یک فیلد عددی در یک دستور SQL استفاده شده باشد، اما برنامهنویس هیچگونه بررسی برای تعیین نوع ورودی کاربر و تأیید ورودی عددی، فراهم نساخته باشد. برای مثال:
statement := “SELECT * FROM userinfo WHERE id = ” + a_variable + “;”
با توجه به این دستور واضح است که برنامهنویس a-variable را برای تعیین عدد مرتبط با فیلد id در نظر گرفتهاست. با این حال، اگر ورودی از نوع رشته تعیین شده باشد، کاربر نهایی میتواند دستور را به صورت دلخواه دستکاری کرده و به این وسیله نیاز به ورود کراکترهای Escape شده را دور بزند. برای مثال مقدار دهی a-variable به صورت زیر جدول “users” را از پایگاه داده حذف خواهد کرد:
1; DROP TABLE users
چرا که دستور SQL معادل آن به صورت زیر خواهد شد:
SELECT * FROM userinfo WHERE id=1; DROP TABLE users.
تزریق SQL کور
این اصطلاح زمانی استفاده میشود که یک برنامه تحت وب در برابر تزریق SQL آسیب پذیر است، اما نتایج تزریق برای مهاجمان قابل رؤیت نیست. صفحه دارای آسیبپذیری ممکن است آن صفحهای نباشد که دادهها را نمایش میدهد، اما تفاوتهای حاصل از نتایج یک دستور تزریق منطقی به درون یک دستور SQL مشروع را، که برای صفحه مورد نظر فراخوانی شدهاست، نمایش خواهد داد. این نوع حمله با افزایش زمان، ممکن است شدیدتر شود، زیرا برای هر بیت بازیابی شده، ساخت یک دستور نیاز است. ابزارهایی وجود دارد که پس از بهدست آوردن اطلاعات مربوط به هدف و مکان آسیب پذیری، امکان خودکار کردن این حمله را فراهم میکنند.
پاسخهای شرطی
نوعی از تزریق SQL کور است که پایگاه داده را مجبور به ارزیابی یک دستور منطقی بر روی صفحه یک برنامه معمولی میکند. به عنوان مثال یک وبسایت مرور کتاب از یک رشته Query برای مشخص کردن اینکه مرور کدام کتاب نمایش داده شود، استفاده میکند. بنابراین آدرس http://books.example.com/showReview.php?ID=5 باعث خواهد شد سرور Query زیر را اجرا کند:
SELECT * FROM bookreviews WHERE ID = ‘Value (ID)’.
که منجر به نمایش خلاصه مربوط به کتابی که با ID5 در جدول bookreview ذخیره شدهاست، خواهد شد.
Query بهطور کامل در سرور اتفاق میافتد. کاربر نامهای مربوط به پایگاه داده، جدول یا فیلدها را نمیداند و از رشته Query نیز اطلاع ندارد. کاربر فقط میبیند که آدرس بالا خلاصه یک کتاب را برمیگرداند. یک هکر میتواند آدرسهای
http://books.example.com/showReview.php?ID=5 AND 1=1 و http://books.example.com/showReview.php?ID=5 AND 1=2 را بارگذاری کند که به ترتیب به صورت دستورها SQL زیر تبدیل میشوند:
SELECT * FROM bookreviews WHERE ID = ‘5’ AND ‘1’=’1′;
SELECT * FROM bookreviews WHERE ID = ‘5’ AND ‘1’=’2′;
اگر با آدرس “۱=۱” خلاصه اصلی بارگذاری شود و با اجرای آدرس “۲=۱” صفحه خطا یا خالی برگردانده شود، سایت احتمالاً در مقابل حمله تزریق SQL آسیبپذیر است.
هکر میتواند با وارد کردن رشته Query زیر موفق به کشف شماره نسخه MySQL در حال اجرا بر روی سرور شود: http://books.example.com/showReview.php?ID=5 AND substring(@@version,1,1)=4که خلاصه کتاب را در صورتی که سرور بر روی MySQL 4 در حال اجرا باشد، نمایش خواهد داد و در غیر این صورت یک صفحه خطا یا خالی را نشان خواهد داد. هکر با استفاده از کد درون رشتههای Query میتواند به اطلاعات بیشتری از سرور دست یابد تا مسیر اصلی حمله را کشف کرده و به اهداف خود دست یابد.
تزریق SQL سطح دوم
این تزریق زمانی اتفاق میافتد که مقادیر ارائه شده شامل حملات تزریق SQL باشد که به جای برخی دستورها اجرایی ذخیره شدهاند. برنامه کاربردی ممکن است یک دستور SQL را به درستی رمزنگاری کرده و آن را به صورت یک دستور SQL معتبر ذخیره کند. سپس بخش دیگری از برنامه که بدون هیچگونه کنترلی برای محافظت در برابر تزریق SQL طراحی شدهاست، ممکن است دستور SQL ذخیره شده را اجرا کند. این حمله نیازمند آگاهی بیشتر در مورد این است که مقادیر ارائه شده، بعداً چگونه استفاده خواهند شد. اسکن کنندههای امنیت برنامههای کاربردی تحتوب خودکار به آسانی نمیتوانند این گونه حمله را تشخیص دهند و ممکن است نیاز باشد که به صورت دستی، برای بررسی علائم این حمله، دستورنویسی شود.
مطالعه بیشتر: هاست ابری چسیت ؟ مزایای استفاده از هاست ابری
عواقب حملات تزریق SQL:
حملات تزریق SQL میتوانند عواقب جدی برای وبسایت و سازمانها داشته باشند، از جمله:
دسترسی غیرمجاز به اطلاعات: حملهکننده میتواند با استفاده از تزریق SQL به اطلاعات محرمانه پایگاه داده دسترسی پیدا کند، از جمله اطلاعات کاربران، رمز عبورها، و اطلاعات مالی.
دزدی اطلاعات: حملهکننده میتواند اطلاعات حساس را دزدیده و برای اهداف مخربی مانند سرقت هویت، کلاهبرداری مالی، یا انتشار اطلاعات شخصی استفاده کند.
تخریب دادهها: از جمله حذف، تغییر یا تخریب دادهها در پایگاه داده، که میتواند به از دست رفتن اطلاعات مهم و عملکرد نامناسب وبسایت منجر شود.
آسیب به اعتبار: حملات تزریق SQL میتوانند به تخریب اعتماد کاربران به وبسایت و سازمان، و در نتیجه افت رتبه و شکست در کسب و کار منجر شود.
نفوذ به سیستمهای دیگر: اگر وبسایت دارای ارتباط با سیستمهای دیگر مانند سرورهای داخلی یا اپلیکیشنهای داخلی باشد، حملهکننده میتواند از طریق تزریق SQL به این سیستمها نفوذ کند و آنها را تخریب کند یا اطلاعات آنها را دزدیده و سوء استفاده کند.
به طور کلی، حملات تزریق SQL میتوانند به سرقت اطلاعات حساس، تخریب دادهها، آسیب به اعتبار، و نفوذ به سیستمهای دیگر منجر شوند که برای وبسایت و سازمان تبعیضناپذیر است.
مطالعه بیشتر: کشینگ چیست؟ افزایش سرعت وب با ذخیره سازی محتوا
راههای پیشگیری از حملات تزریق SQL:
اعتبارسنجی ورودیهای کاربر:
- بررسی دقیق ورودیهای کاربران برای حذف یا فیلتر کردن کاراکترهای مخرب مانند تگهای SQL.
استفاده از پارامترهای پرس و جو:
- ارسال ورودیهای کاربر به عنوان پارامترهای جداگانه به کوئریهای SQL به جای ادغام رشتهها. استفاده از Prepared Statements یا Parameterized Queries.
استفاده از دستورات SQL ایمن:
- انتخاب دقیق و استفاده از دستورات SQL ایمن مانند Prepared Statements برای اجتناب از تزریق کدهای مخرب.
بهروزرسانی نرمافزارها:
- نصب بهروزرسانیهای امنیتی برای نرمافزارها و دیتابیسها به منظور رفع آسیبپذیریها.
محدود کردن دسترسیها:
- اختصاص دسترسی حداقلی به پایگاه داده برای کاربران و اطمینان از اینکه فقط دسترسیهای لازم به آنها اعطا شده است.
رصد و ثبت لاگها:
- رصد فعالیتها و ثبت لاگها برای تشخیص ناهنجاریها و حملات ممکن.
آموزش و آگاهی:
- آموزش کاربران و توسعهدهندگان در مورد خطرات حملات تزریق SQL و اهمیت اعتبارسنجی ورودیها.
استفاده از فایروال:
- استفاده از فایروالها برای محدود کردن دسترسی به بخشهای غیرضروری و جلوگیری از حملات.
توصیه: با اجرای این تدابیر، میتوان امنیت سایت یا سیستم را در برابر حملات تزریق SQL تقویت نمود و اطلاعات محرمانه را محافظت کرد.
مطالعه بیشتر: حملات DDoS-یک تهدید جدی برای امنیت سایبری