آسیبپذیری SQL Injection نوع Boolean-Based در وبسایتها
یکی از رایجترین و خطرناکترین حملات به اپلیکیشنهای تحت وب، تزریق SQL یا همان SQL Injection است. در این حمله، مهاجم میتواند با دستکاری ورودیهای برنامه، کوئریهای پایگاه داده را تغییر داده و اطلاعات حساس را استخراج یا تغییر دهد.
در روش Boolean-Based، مهاجم از پاسخهای درست یا غلط (True یا False) سرور برای حدس زدن ساختار پایگاه داده استفاده میکند. برخلاف SQLi معمول، این روش معمولاً زمانی استفاده میشود که پاسخهای سرور مستقیماً حاوی اطلاعات دیتابیس نیستند، اما تفاوت در رفتار پاسخ (مثلاً نمایش یا عدم نمایش یک بخش از صفحه) سرنخهایی میدهد.
Boolean-Based SQLi چیست؟
در این روش، مهاجم با تزریق عبارات منطقی به پارامترهای ورودی، رفتار صفحه را بررسی میکند. اگر تزریق باعث شود خروجی صفحه تغییر کند یا پیام متفاوتی ظاهر شود، مهاجم میتواند نتیجه بگیرد که کوئری موفق یا ناموفق بوده است.
مثال عملی از آسیبپذیری Boolean-Based SQLi
فرض کنید یک وبسایت دارای آدرس زیر است که اطلاعات کاربر را بر اساس شناسه نمایش میدهد:
درخواست GET آسیبپذیر
GET /profile.php?id=5 HTTP/1.1
Host: hackmelocal.com
مهاجم میتواند به صورت زیر ورودی را دستکاری کند:
GET /profile.php?id=5 AND 1=1 HTTP/1.1
GET /profile.php?id=5 AND 1=2 HTTP/1.1
تست دستی کوئریهای SQL (Test SQL Query)
شما میتوانید با استفاده از ابزار آنلاین SQL Fiddle کوئریهای SQL را بنویسید، اجرا کنید و تأثیر آنها را بررسی کنید:
تست با ابزار ghauri
ابزار ghauri یکی از ابزارهای قدرتمند تست خودکار SQL Injection است که میتوانید برای بررسی آسیبپذیری از آن استفاده کنید. در ادامه نحوه تست پارامترها در هر دو روش GET و POST شرح داده شده است.
تست پارامتر GET
اگر پارامتر ورودی در آدرس (GET) قرار دارد، میتوانید به صورت زیر تست را انجام دهید:
ghauri -u 'https://hackmelocal.com/profile.php?id=1' --batch --flush-session --dbs
در این دستور:
--batch
: اجرای خودکار بدون نیاز به تایید کاربر--flush-session
: پاک کردن اطلاعات کش قبلی--dbs
: درخواست لیست پایگاههای داده
تست پارامتر POST
اگر پارامترها در یک فرم POST ارسال میشوند، میتوانید مانند مثال زیر تست را انجام دهید:
ghauri -u 'https://hackmelocal.com/login' --data 'username=admin&password=test' --batch --flush-session --dbs
همچنین برای تست یک پارامتر خاص در درخواست POST مانند mobile
میتوانید از علامت * استفاده کنید:
ghauri -u 'https://hackmelocal.com' --data "mobile=*&password=test" --batch --flush-session --dbs
در این حالت فقط پارامتر mobile
توسط ghauri بررسی خواهد شد.
هدف چالش (Goal)
هدف شما این است که با استفاده از روش Boolean-Based، ساختار پایگاه داده یا اطلاعات حساس را استنتاج کنید، بدون اینکه مستقیماً محتوای دیتابیس در خروجی ظاهر شود.
ابزارهای مورد نیاز (Tools Needed)
- مرورگر وب
- نرمافزار Burp Suite برای رهگیری و ویرایش درخواستها
- ابزارهای اتوماتیک مانند ghauri یا SQLMap
- افزونههای مرورگر مانند Tamper Data
- ابزار آنلاین SQL Fiddle برای آزمایش کوئریها
مراحل انجام چالش (Walkthrough)
- یک پارامتر ورودی مانند
id
را پیدا کنید که در کوئری SQL استفاده میشود - با تزریق عبارات منطقی مانند
AND 1=1
وAND 1=2
واکنش سرور را بررسی کنید - اگر تفاوت محسوسی در خروجی مشاهده شد، آسیبپذیری تأیید میشود
- با تکنیکهای منطقی، مرحله به مرحله ساختار پایگاه داده را استنتاج کنید
- در صورت نیاز میتوانید از ابزارهای خودکار مانند ghauri یا SQLMap برای بهرهبرداری استفاده کنید
راهکار و روش جلوگیری (Prevention)
مهمترین راهکار برای جلوگیری از این حمله، استفاده از تکنیکهای امنسازی کوئریهای پایگاه داده است. برخی از بهترین روشها عبارتند از:
اصول کلی پیادهسازی امن
- استفاده از کوئریهای آماده یا Prepared Statements
- استفاده از ORMهای امن برای مدیریت پایگاه داده
- اعتبارسنجی و فیلتر ورودیهای کاربر در سمت سرور
- استفاده از حداقل سطح دسترسی برای کاربران پایگاه داده
- مانیتورینگ و لاگبرداری دقیق فعالیتهای مشکوک
منابع مفید برای مطالعه بیشتر
- PayloadsAllTheThings - SQL Injection
- HackTricks - SQL Injection
- PortSwigger Web Security - SQL Injection Guide
- OWASP - SQL Injection
سلب مسئولیت: این چالش صرفاً با اهداف آموزشی و پژوهشی در محیط کنترل شده آزمایشگاه hackmelocal.com طراحی شده است. هرگونه سوءاستفاده از این اطلاعات در سیستمهای واقعی غیرقانونی و غیراخلاقی است.