- موضوع نویسنده
- #1
SQL Injection چیست و چرا یکی از خطرناکترین روشهای هک سایت است؟
SQL Injection یا به اختصار SQLi به روشی از حملههای سایبری گفته میشود که هکر با سوءاستفاده از ضعفهای امنیتی در سایتهای مبتنی بر پایگاه داده، کدهای مخرب یا دستورات دلخواه خود را به پایگاه داده ارسال میکند. هدف این حمله، دسترسی غیرمجاز به اطلاعات، سرقت دادهها، خرابکاری، یا حتی دسترسی کامل به سرور است. ضعف در اعتبارسنجی و پاکسازی دادههای ورودی باعث بروز این آسیبپذیری میشود که بسیاری از سایتها، بهویژه سایتهای قدیمی یا آنهایی که به صورت غیرحرفهای کدنویسی شدهاند، به آن مبتلا هستند.
مکانیزم SQL Injection؛ حمله چگونه انجام میشود؟
روش انجام SQL Injection معمولا شامل مراحل زیر است:
- یافتن نقاط آسیبپذیر: هکر ابتدا تلاش میکند قسمتهایی از سایت (مثلا فرم لاگین، جستجو، url یا پارامترهای GET/POST) که با دیتابیس در ارتباط هستند، بررسی کند.
- تزریق کد مخرب: وقتی ورودی سایت به طور صحیح فیلتر نشده باشد، هکر دستورات SQL را مستقیماً وارد کرده و این دستورات اجرا میشوند.
- دریافت یا تخریب دادهها: نتیجه اجرای این دستورات میتواند نمایش اطلاعات، تغییر رمز عبور، حذف یا تغییر دادهها و حتی دسترسی به سطح مدیریتی دیتابیس سایت باشد.
کد:
SELECT * FROM users WHERE username = '$username' AND password = '$password'
' OR 1=1--
در نهایت کوئری به شکل زیر میشود:
کد:
SELECT * FROM users WHERE username = '' OR 1=1--' AND password = ''
OR 1=1
همیشه درست است و پسورد نیز نادیده گرفته میشود! حال هکر به راحتی وارد حساب خواهد شد.نمونههای رایج حملات SQL Injection
- بررسی آسیبپذیری با افزودن علامت نقل قول: مثلا استفاده از
'
یا"
در انتهای پارامتر URL یا فرمها، اگر سایت پیغام خطا یا پاسخ عجیبی دهد، احتمال SQLi وجود دارد. - دریافت اطلاعات جدول کاربران: استفاده از کوئریهای ترکیبی مثل:
' UNION SELECT username, password FROM users--
- تغییر یا حذف دادهها: مثلا:
1; DROP TABLE users--
- بایپس کردن ورود یا جستجو: مثلا با عبارت
' or '1'='1'
چگونه میتوان سایت را در برابر SQL Injection ایمن کرد؟
- استفاده از Prepared Statements و پارامترهای امن: به جای قرار دادن مقادیر مستقیماً در کوئریها.
[CODE php]
// شیوۀ امن در PHP (PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
[/CODE] - اعتبارسنجی و پاکسازی دادههای ورودی: هرگز به دادهای که کاربر ارسال میکند اعتماد نکنید! فیلتر دادههای متنی، عددی، و حروف خاص الزامی است.
- محدود کردن سطح دسترسی کاربر بانک اطلاعاتی: کاربر دیتابیس سایت نباید سطح دسترسی
root
داشته باشد! - مخفی کردن جزئیات خطاها: نمایش خطاهای دقیق به کاربر مهاجم سرنخ میدهد.
- استفاده از افزونهها و فریمورکهای معتبر: اکثر CMSهای جدید و فریمورکهای مدرن (لاراول، وردپرس، جوملا) ابزارهای مقابله با SQL Injection را دارند؛ آنها را بهروزرسانی کنید.
- تست امنیت سایت به صورت مستمر: از ابزارهای اسکن امنیت سایت مانند Acunetix یا SQLMap برای تست آسیبپذیری بهره بگیرید.
نشانههای شناسایی سایت هکشده توسط SQL Injection
- دسترسی غیرمجاز به پنلهای مدیریتی
- تغییر ناگهانی دادهها یا اطلاعات سایت
- مشاهده خطاهای غیرعادی یا پیغامهای مرتبط با دیتابیس
- لو رفتن اطلاعات کابران و نمایش در سایتهای دیگر
- ثبت لاگهای مشکوک در سرور یا هاست
آموزش تست اولیه SQL Injection به صورت دستی
- در آدرس سایت بعد از متغیر id یا user عدد یا علامتهای
'
،"
،;
وارد کنید؛ اگر خطا داد، احتمال SQLi وجود دارد. - در فرمهای جستجو یا ورود، سعی کنید ورودی مثل
' or 1=1--
را ارسال کنید. - اگر سایت نتایج غیرمنتظره میدهد یا اطلاعات دیگری نمایان شد، سریعاً اقدام به رفع باگ کنید.
بررسی SQL Injection در سیستمهای مدیریت محتوا
CMSهایی مثل وردپرس، جوملا و حتی دروپال نیز گاهی باگ SQL Injection در برخی افزونه یا قالبها دارند. افزونههای غیررسمی یا کرکشده مهمترین عامل ایجاد این آسیبپذیریهاست. همیشه سایت را به کمک افزونههای امنیتی (مثل
Wordfence
) کنترل و از نصب پلاگینهای پراشکال بپرهیزید.پاکسازی و اقدامات بعد از هک SQL Injection
اگر احساس کردید سایت به SQLi آلوده شده:
- بکاپ سالم را بازگردانید.
- تمام رمزعبورها (دیتابیس، پنلها و کاربران) را تغییر دهید.
- فایلها و دیتابیس را اسکن و مرور کنید تا اثری از کدهای مخرب وجود نداشته باشد.
- سورس و افزونهها را به آخرین نسخه آپدیت کنید.
- قطعهکدهای ناشناس داخل قالب و افزونه را حذف کنید.
جمعبندی و توصیه پایانی
SQL Injection یکی از اصلیترین دلایل هک شدن سایتها است که معمولاً با رعایت چند اصل ساده امنیتی میتوان از وقوع آن جلوگیری کرد. هیچوقت دادههای کاربر را بدون بررسی دریافت نکنید و همواره به کمک ابزارهای امنیتی سایت خود را تست و بهروز نگه دارید. برای اطلاعات بیشتر و مشاوره امنیتی به انجمن تخصصی احمدرضا کریمی مراجعه کنید.