آسیبپذیری SQL Injection چیست؟
SQL Injection (تزریق SQL) یک آسیبپذیری امنیتی در برنامههای تحت وب است که به مهاجم اجازه میدهد دستورات SQL مخرب را به پایگاه داده ارسال کند. این حمله میتواند باعث نشت اطلاعات، تغییر یا حذف دادهها و حتی دسترسی غیرمجاز به سیستم شود.
انواع SQL Injection
SQL Injection به چندین نوع تقسیم میشود:
- Classic SQL Injection (کلاسیک یا مستقیم)
- Blind SQL Injection (کور)
- Time-Based SQL Injection (بر پایه زمان)
- Error-Based SQL Injection (بر پایه خطا)
- Union-Based SQL Injection (بر پایه UNION)
۱. Blind SQL Injection (تزریق SQL کور)
Blind SQL Injection زمانی رخ میدهد که برنامه خطاهای پایگاه داده را مستقیماً نمایش نمیدهد، اما هنوز هم میتوان از طریق پاسخهای غیرمستقیم (مانند تفاوت در پیامهای نمایش دادهشده یا تأخیر در پاسخ) اطلاعاتی استخراج کرد.
مکانیزم حمله Blind SQL Injection
- مهاجم یک ورودی آسیبپذیر را شناسایی میکند (مثلاً یک فیلد ورود یا جستجو).
- برنامه اطلاعات خطای SQL را نمایش نمیدهد، اما بر اساس پاسخها (درست/نادرست) یا زمان پاسخگویی میتوان نتیجه گرفت که آیا تزریق موفق بوده است یا نه.
- از تکنیکهای خاصی برای استخراج اطلاعات پایگاه داده استفاده میشود.
انواع Blind SQL Injection
-
Boolean-Based Blind SQLI (بر پایه مقدار درست/نادرست)
مهاجم با ارسال کوئریهایی که نتیجه آن "درست" یا "نادرست" است، رفتار پاسخ سرور را تحلیل میکند.
-
مثال: فرض کنید یک وبسایت از کوئری زیر برای ورود استفاده میکند:
SELECT * FROM users WHERE username = '$user' AND password = '$pass';
اگر مهاجم مقدار زیر را وارد کند:
' OR 1=1 --
کوئری به این تبدیل میشود:
SELECT * FROM users WHERE username = '' OR 1=1 -- ' AND password = '';
چون
1=1
همیشه درست است، سیستم اجازه ورود میدهد.
-
Time-Based Blind SQLI (بر پایه تأخیر زمانی)
وقتی پاسخ سرور تغییر نمیکند، مهاجم از دستورات تأخیری مثل
SLEEP()
در MySQL استفاده میکند.-
مثال:
' OR IF(1=1, SLEEP(5), 0) --
اگر سرور ۵ ثانیه تأخیر داشته باشد، یعنی آسیبپذیری وجود دارد.
چگونه Blind SQL Injection را جلوگیری کنیم؟
-
استفاده از Prepared Statements: تمام ورودیها باید پارامترسازی شوند.
-
مثال در PHP:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?"); $stmt->execute([$user, $pass]);
-
-
محدود کردن سطح دسترسی پایگاه داده: کاربران پایگاه داده نباید سطح دسترسی مدیریت داشته باشند.
فیلتر کردن و اعتبارسنجی ورودیها: کاراکترهای خاص مانند
'
,--
,;
,/* */
نباید در ورودیها مجاز باشند.استفاده از Web Application Firewall (WAF): فایروالهای اپلیکیشنی میتوانند حملات را تشخیص داده و مسدود کنند.
جمعبندی
Blind SQL Injection زمانی رخ میدهد که برنامه خطاهای مستقیم نمایش نمیدهد، اما همچنان میتوان با روشهایی مانند تحلیل پاسخها یا تأخیر در زمان پاسخ، دادهها را استخراج کرد. جلوگیری از این حمله نیازمند استفاده از Prepared Statements، محدود کردن دسترسی پایگاه داده و فیلتر کردن ورودیها است.