تزریق اس‌کیو‌ال چیست و چگونه با آن مقابله کنیم؟

تزریق اس‌کیو‌ال (SQLi[1]) یکی از انواع حملات تزریق کد[2] است که امکان اجرای دستورات مخرب اس‌کیوال را برای مهاجمان فراهم می‌کند. با این دستورات می توان سرور پایگاه داده‌ای که از آن به منظور ذخیره داده های یک برنامه کاربردی تحت وب استفاده می شود را تحت کنترل گرفت. مهاجمان از آسیب‌پذیری تزریق اس‌کیو‌ال برای دور زدن سازوکارهای امنیتی برنامه‌های کاربردی استفاده می‌کنند. آنها می‌توانند با این روش، فرایندهای صدور مجوز یا احراز هویت یک صفحه وب را فیلتر نموده و محتوای کل پایگاه داده اس‌کیوال آن را استخراج کنند. هکرها همچنین می‌توانند از تزریق اس‌کیو‌ال (SQL Injection) برای اضافه کردن، تغییر یا حذف رکوردهای پایگاه داده نیز استفاده نمایند.آسیب‌پذیری تزریق کد بر روی هر وب سایت یا برنامه کاربردی وب که از پایگاه‌های داده اس‌کیوال استفاده می‌کند از جمله مای‌اس‌کیوال، اس‌کیوال سرور و غیره تأثیرگذار است. مجرمان سایبری با بهره برداری از آسیب پذیری ها امکان دسترسی غیرمجاز به داده‌های حساسی همچون اطلاعات مشتریان و کاربران، اطلاعات شخصی کارکنان، اسرار تجاری، اطلاعات مالکیت معنوی و غیره را به دست می آورند.
حملات تزریق اس‌کیو‌ال یکی از قدیمی‌ترین، رایج‌ترین و خطرناک‌ترین آسیب‌پذیری‌های برنامه‌های کاربردی تحت وب محسوب می‌شوند. مؤسسه «پروژه امنیت برنامه‌های کاربردی تحت وب باز» (OWASP[3]) در سندی که در سال 2017 میلادی در رابطه با رایج‌ترین تهدیدات این حوزه منتشر کرد، تزریق اس‌کیو‌ال را تهدید اصلی امنیت برنامه‌های کاربردی تحت وب معرفی نموده است. 

حمله تزریق اس‌کیو‌ال، چگونه و به چه دلیلی انجام می‌شود؟

مهاجم برای اجرای حمله اس‌کیوال ابتدا باید ورودی‌های آسیب‌پذیر را در برنامه‌های کاربردی تحت وب یا صفحات وب پیدا کند. صفحه یا برنامه کاربردی تحت وبی که آسیب‌پذیری تزریق اس‌کیو‌ال دارد، از چنین ورودی‌هایی در یک کوئری اس‌کیوال استفاده می‌کند. مهاجم می‌تواند محتوای ورودی را چنان که خود می خواهد، ایجاد نماید. به چنین محتوایی معمولاً «پی‌لود مخرب» گفته می‌شود که تولید آن بخش مهمی از فرایند حمله را به خود اختصاص می‌دهد. پس از ارسال این محتوا توسط مهاجم، فرمان‌های اس‌کیوال مخرب در پایگاه داده اجرا خواهند شد.

اس‌کیوال یک زبان کوئری است که برای مدیریت داده‌های ذخیره شده در پایگاه‌های داده‌ رابطه‌ای[4] طراحی شده است. از این زبان می‌توان برای دسترسی به داده‌ها، تغییر یا حذف آنها استفاده کرد. بسیاری از برنامه‌های کاربردی و وب سایت‌ها تمامی داده‌ها را در پایگاه‌های داده اس‌کیوال ذخیره می‌کنند. در بعضی از موارد از فرمان‌های اس‌کیوال می‌توان برای اجرای فرمان‌های سیستم عامل هم استفاده کرد. از این رو یک حمله SQL Injection که با موفقیت اجرا شود پیامدهای مخرب تأثیرگذاری به همراه خواهد داشت که بعضی از آنها شامل موارد زیر هستند:

  • مهاجمان می‌توانند از تزریق اس‌کیو‌ال برای پیدا کردن اعتبارنامه‌های سایر کاربران که در پایگاه داده ذخیره شده‌اند، استفاده نموده و به جای آنها وارد سیستم ها شوند. ممکن است چنین کاربری، مدیر پایگاه داده و دارای همه دسترسی‌های مدیریتی باشد!
  • اس‌کیوال به شما امکان می‌دهد داده‌های دلخواه را از پایگاه داده، انتخاب کرده و از آنها خروجی بگیرید. هکرها با استفاده از آسیب‌پذیری تزریق اس‌کیو‌ال می‌توانند به تمام داده‌های ذخیره شده در یک سرور پایگاه داده دسترسی پیدا کنند.
  • با اس‌کیوال می‌توان داده‌های موجود در پایگاه داده را تغییر داده و داده‌های جدیدی را وارد آن کرد. مثلاً در یک برنامه کاربردی مالی، مهاجم می‌تواند از تزریق اس‌کیو‌ال برای تغییر موجودی‌ها، لغو تراکنش‌ها یا انتقال وجه به حساب خود استفاده کند.
  • از اس‌کیوال می‌توانید برای حذف رکوردهای پایگاه داده و حتی جداول آن استفاده کنید. حتی اگر مدیر پایگاه داده از آن پشتیبان‌گیری کرده باشد، حذف داده‌ها می‌تواند مانع دسترسی به برنامه کاربردی تا زمان بازیابی پایگاه داده شود. ممکن است این نسخه‌های پشتیبان حاوی داده‌های جدید نباشند.
  • در بعضی از سرورها می‌توانید با استفاده از سرور پایگاه داده، به سیستم عامل دسترسی پیدا کنید. احتمال دارد این کار به صورت عمدی یا تصادفی انجام شده باشد. در چنین مواقعی، مهاجم می‌تواند از تزریق اس‌کیو‌ال به عنوان مسیر حمله اولیه استفاده نموده و سپس به شبکه‌ای که در پشت فایروال قرار دارد، حمله کند.

حملات تزریق SQL انواع مختلفی داشته که مهمترین آنها عبارتند از:

  • مدل درون باندی (in-band) که با استفاده از خطاهای پایگاه داده یا فرمان‌های UNION انجام می‌شود.
  • مدل کورکورانه
  • مدل برون باندی

 

مثالی ساده از تزریق اس‌کیو‌ال

اولین نمونه مورد بررسی، بسیار ساده است. این مثال نشان می‌دهد که مهاجم چگونه می‌تواند از آسیب‌پذیری تزریق اس‌کیو‌ال برای دور زدن سازوکارهای امنیتی استفاده نموده و خودش را به عنوان مدیر جا بزند.

شبه کدی که در زیر مشاهده می‌کنید بر روی یک سرور تحت وب اجرا شده است. این شبه کد، نمونه ساده ای از احراز هویت با استفاده از نام کاربری و کلمه عبور می‌باشد. در این مثال، پایگاه داده دارای جدولی با عنوان “users” و همچنین ستون‌هایی با نام‌های “username” و “password” است.

# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']
# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”
# Execute the SQL statement
database.execute(sql)

فیلدهای ورودی در برابر تزریق کدهای اس‌کیوال آسیب‌پذیر هستند. مهاجم می‌تواند از فرمان‌های اس‌کیوال در ورودی استفاده کرده و با این کار، فرمان اس‌کیوال اجرا شده توسط سرور را تغییر دهد. برای مثال مهاجم می‌تواند ترفندی مثل استفاده از یک تک کوتیشن و تنظیم فیلد passwd (به صورت زیر) را به کار بگیرد:

password’ OR 1=1
در نتیجه، پایگاه داده اس‌کیوال این کوئری را اجرا می‌کند:

SELECT id FROM users WHERE username=’username’ AND password=‘password’ OR 1=1

به دلیل وجود جمله “OR 1=1″، نام کاربری (username) و کلمه عبور (password) هر چه که باشد، عبارت WHERE اولین id را از جدول users برمی‌گرداند. اولین id در یک پایگاه داده، معمولاً مربوط به مدیر است. به این ترتیب مهاجم علاوه بر دور زدن سازوکار احراز هویت، امتیازهای دسترسی مدیریتی را هم به دست خواهد آورد. مهاجم همچنین می‌تواند برای کنترل هر چه بیشتر اجرای کوئری اس‌کیوال، سایر بخش‌های دستور اس‌کیوال را به عنوان کامنت علامت‌گذاری کند:

— MySQL, MSSQL, Oracle, PostgreSQL, SQLite’ OR ‘1’=’1′ ‘ OR ‘1’=’1′ /*— MySQL’ OR ‘1’=’1′ #— Access (using null characters)’ OR ‘1’=’1′ %00‘ OR ‘1’=’1′ %16

مثالی از تزریق اس‌کیو‌ال بر اساس عملگر Union

یکی از رایج‌ترین انواع حملات تزریق اس‌کیو‌ال، استفاده از عملگر UNION است. مهاجم با استفاده از این عملگر می‌تواند نتیجه دو یا چند دستور SELECT را با هم ترکیب کند. به این روش «تزریق اس‌کیو‌ال بر اساس UNION» گفته می‌شود.

در ادامه، مثالی از این تکنیک را مشاهده می‌کنید. در اینجا از سایت testphp.vulnweb.com استفاده شده که یک آسیب‌پذیری به صورت عمدی در آن قرار گرفته است. درخواست HTTP زیر، یک درخواست عادی است که کاربر مجاز می‌تواند آن را ارسال کند:

GET http://testphp.vulnweb.com/artists.php?artist=1 HTTP/1.1Host: testphp.vulnweb.com
مثالی از تزریق اس‌کیو‌ال بر اساس عملگر Union

پارامتر artist در برابر حملات تزریق اس‌کیو‌ال آسیب‌پذیر است. پی‌لود بعدی، کوئری را به‌ گونه‌ای تغییر می‌دهد که یک رکورد ناموجود را جستجو کند. مقدار موجود در رشته کوئری URL، منفی یک “1-” تنظیم شده است. البته این مقدار می‌تواند هر مقداری که در پایگاه داده وجود ندارد، باشد اما مقدار منفی مناسب‌تر است چون معمولاً شناسه‌های پایگاه داده منفی نیستند.

در تزریق اس‌کیو‌ال، از عملگر UNION برای پیوست یک کوئری اس‌کیوال مخرب به کوئری اصلی که قرار است توسط برنامه کاربردی تحت وب اجرا شود، استفاده می‌شود. نتیجه کوئری تزریق شده، با نتیجه کوئری اصلی ترکیب می‌شود. به این ترتیب مهاجم می‌تواند مقادیر ستون‌های سایر جدول‌ها را به دست آورد:

GET http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1, 2, 3 HTTP/1.1Host: testphp.vulnweb.com

مثال زیر نشان می‌دهد چگونه می‌توان از پی‌لود تزریق اس‌کیو‌ال برای به دست آوردن داده‌های معنادار در این سایت که یک آسیب‌پذیری به صورت عمدی در آن قرار داده شده است، استفاده کرد:

GET http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1,pass,cc FROM users WHERE uname=’test’ HTTP/1.1

Host: testphp.vulnweb.com

چگونه از اجرای حملات تزریق اس‌کیو‌ال جلوگیری کنیم؟

تنها راهی که برای اطمینان از جلوگیری اجرای حملات تزریق اس‌کیو‌ال وجود دارد، اعتبارسنجی ورودی‌ها و پارامتری کردن کوئری‌ها از جمله استفاده از دستورات آماده است. هرگز نباید در کد برنامه کاربردی، از ورودی به صورت مستقیم استفاده شود. توسعه‌دهنده باید همه ورودی‌ها را که شامل ورودی‌های فرم‌های تحت وب مثل فرم‌های لاگین هستند، بررسی کند. همچنین توسعه‌دهنده باید تمام عناصر مخرب در کد، مثل تک کوتیشن را حذف نموده و قابلیت مشاهده خطاهای پایگاه داده در سایت‌ها را غیرفعال نماید. لازم به ذکر است مهاجمان می‌توانند با تزریق کد، از خطاهای پایگاه داده جهت به دست آوردن اطلاعات لازم درباره آن پایگاه داده سوءاستفاده کنند.

ممکن است اگر آسیب‌پذیری تزریق اس‌کیو‌ال را با استفاده از پویشگر Acunetix شناسایی کردید شاید نتوانید آن را بلافاصله برطرف کنید. مثلاً ممکن است این آسیب‌پذیری در یک کد متن باز وجود داشته باشد. در چنین مواقعی می‌توانید از فایروال برنامه‌های کاربردی تحت وب برای پالایش موقت ورودی ها استفاده نمایید.

 

نکات کلی برای جلوگیری از تزریق اس‌کیو‌ال

مقابله با حملات تزریق اس‌کیو‌ال کار چندان ساده‌ای نیست. روش‌هایی که توسط مهاجمان مورد استفاده قرار می‌گیرند با توجه به نوع آسیب‌پذیری، موتور پایگاه داده و زبان برنامه‌نویسی از الگوهای متفاوتی پیروی می‌کنند. با این وجود در تمام این روش‌ها اصول راهبردی مشابهی وجود دارد که برای حفظ امنیت برنامه‌های کاربردی تحت وب باید آنها را رعایت کرد.

 

گام اول: آموزش و افزایش آگاهی سایبری

برای حفظ امنیت برنامه‌های کاربردی تحت وب، همه افرادی که در طراحی این برنامه‌ها دخیل هستند باید از مخاطره تزریق اس‌کیو‌ال آگاهی‌های لازم را داشته باشند. از این رو باید آموزش‌های امنیتی مناسب را برای همه توسعه‌دهندگان، تیم ارزیابی کیفیت نرم افزار، مدیران سیستم و تیم توسعه عملیات برگزار کنید.

گام دوم: هرگز به ورودی‌های کاربران اعتماد نکنید.

همه کاربران را غیرقابل اعتماد در نظر بگیرید. هر گونه ورودی کاربر که در کوئری‌های اس‌کیوال استفاده می‌شود می‌تواند مخاطره تزریق اس‌کیو‌ال را در پی داشته باشد. با ورودی‌های کاربران داخلی و احراز هویت شده، همچون ورودی‌های کاربران عمومی برخورد کنید.

گام سوم: به جای فهرست‌های سیاه[5] از فهرست‌های سفید[6] استفاده کنید.

ورودی‌های کاربران را بر اساس فهرست‌های سیاه فیلتر نکنید. یک مهاجم باهوش، تقریباً همیشه راهی برای دور زدن فهرست‌های سیاه پیدا می‌کند. در صورت امکان با استفاده از فهرست‌های سفید، ورودی‌های کاربران را اعتبارسنجی و فیلتر کنید.

گام چهارم: از جدیدترین فناوری‌ها استفاده کنید.

فناوری‌های توسعه قدیمی، فاقد سازوکارهای حفاظتی لازم در برابر تزریق اس‌کیو‌ال هستند. بنابراین از جدیدترین نسخه زبان، محیط توسعه و نوین ترین فناوری‌های مربوط به آن زبان یا محیط استفاده کنید. مثلاً در زبان PHP به جای MySQLi از PDO استفاده نمایید.

گام پنجم: از سازوکارهای تأیید شده استفاده کنید.

سعی نکنید راهکارهای حفاظت در برابر این حملات را از صفر بسازید. فناوری‌های توسعه مدرن معمولاً سازوکارهای حفاظت در برابر تزریق اس‌کیو‌ال را در اختیار شما قرار می‌دهند. به جای تلاش برای طراحی دوباره این سازوکارها می‌توانید از راهکارهای آماده (مثلاً از کوئری‌های پارامتری شده[7] یا رویه‌های ذخیره شده[8]) استفاده کنید.

گام ششم: تجزیه و تحلیل دائم با استفاده از پویشگرها را فراموش نکنید.

ممکن است آسیب‌پذیری تزریق اس‌کیو‌ال توسط توسعه‌دهندگان داخلی شما یا از طریق نرم‌افزارها، ماژول‌ها و کتابخانه‌های بیرونی ایجاد شود. به صورت منظم، برنامه‌های کاربردی تحت وب را با استفاده از یک پویشگر مخصوص مثل Acunetix بررسی کنید. اگر از Jenkins استفاده می‌کنید باید افزونه Acunetix را جهت اجرای خودکار اسکن برای هر نسخه نصب نمایید.

 

[1] SQL Injection

[2] تزریق کد به معنای سوءاستفاده از سیستم‌های رایانه‌ای است که منجر به اجرای کدهای ناخواسته در این سیستم‌ها می‌شود. مجرمان سایبری با اجرای حملات تزریق کد می توانند مسیر برنامه را به سمتی که خودشان می‌خواهند، تغییر دهند.

[3] Open Web Application Security Project

[4] پایگاه داده رابطه‌ای (Relational Database) نوعی پایگاه داده بر اساس مدل رابطه‌ای (Relational Model) داده‌ها است. در این مدل، داده‌ها در قالب تعدادی جدول (Table) نگهداری می‌شوند. به این جداول، رابطه (Relation) نیز گفته می‌شود. هر جدول شامل تعدادی ستون (Column) و ردیف (Row) است. به ستون‌ها، ویژگی (Attribute) و به ردیف‌ها رکورد (Record) یا چندتایی (Tuple) هم گفته می‌شود.

[5] فهرست سیاه در علم رایانه، یک روش کنترل دسترسی پایه است که به همه به جز اعضای فهرست سیاه اجازه دسترسی می دهد.

[6] به معنی اجازه دادن به هیچ‌ کس، به جز اعضای فهرست سفید است.

[7] یکی از ساده‌ترین و مفیدترین کوئری‌ها است که به راحتی به‌روزرسانی شده و عبارت جستجوی جدید را در خود جای می‌دهد.

[8] رویه ذخیره شده در پایگاه‌های داده، رویه‌ای است که توسط برنامه‌هایی که به یک پایگاه داده رابطه‌ای دسترسی دارند، قابل دسترسی می باشد.

خروج از نسخه موبایل