تزریق کد یا Code injection که معمولاً به صورت اجرای ریموت کدها یا RCE به آن اشاره می‌شود، یکی از انواع اصلی حملات هکرهاست. هکر برای خرابکاری، دستوراتی را در یک اپلیکیشن یا سایت و نرم‌افزار، اجرا می‌کند و به این ترتیب می‌تواند به اطلاعات امنیتی دسترسی پیدا کند، بانک اطلاعاتی را معیوب یا ناقص کند و همین‌طور اطلاعات شخصی کاربران را برای سوء استفاده‌های بعدی، به دست آورد. در اغلب موارد هکر با تزریق کد مراحل لاگین و تأیید هویت را دور می‌زند.

در ادامه با تزریق کد یا Code Injection که از مقوله‌های مهم در عرصه‌ی هک و امنیت است، بیشتر آشنا می‌شویم.

معمولاً در مواردی که اپلیکیشن یا دستورات بدون عبور از مراحل تأیید اعتبار اجرا می‌شوند، تزریق کد به مراتب ساده‌تر است و احتمالاً خرابکاری هکرها بیشتر است. به عنوان مثال کدهای زیر که به زبان PHP نوشته شده، یک کد آسیب‌پذیر است:

آشنایی با هک از روش تزریق کد و روش‌های Script Injection و SQL Injection‌

در دستورات فوق، صفحه‌ی دریافت مشخصات PHP با دستور phpinfo، صفحه‌ای آسیب‌پذیر محسوب می‌شود.

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

انواع تزریق کد

در حالت کلی ۴ نوع تزریق کد وجود دارد. تزریق کد SQL، تزریق کد Script، تزریق کد Shell و تزریق کد Dynamic Evaluation.  اساس کار در هر ۴ نوع تزریق کد، یکسان است و همواره دستوراتی برای خرابکاری، به اپلیکیشن معرفی شده و توسط اپلیکیشن اجرا می‌شوند. در این مقاله به دو مورد اول یعنی تزریق کد برای خرابکاری‌ها در زمینه‌ی بانک داده یا SQL و تزریق کد اسکریپت بحث می‌کنیم.

روش کار تزریق کد SQL

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

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

به عنوان مثال کدهای زیر که در سمت سرور یک سایت اجرا می‌شود، ناامن است و هکر می‌کند با استفاده از عبارت‌های خاصی، خرابکاری انجام دهد:

آشنایی با هک از روش تزریق کد و روش‌های Script Injection و SQL Injection‌

در کدهای فوق، هکر می‌تواند از دستور زیر برای تنظیم فیلد رمز عبور استفاده کند:

password’ OR 1=1

همان‌طور که مشاهده می‌کنید، هکر می‌تواند در فیلد رمز عبور، عبارتی را وارد کند که در حقیقت یک دستور قابل استفاده برای کار با SQL Database است. قرار دادن عبارت OR 1=1 که به معنی "یا ۱ مساوی ۱" است در انتهای رمز عبور، باعث می‌شود که تمام آی‌دی‌های کاربران صرف‌نظر از رمز عبوری که تایپ شده، انتخاب شود! 

به دستور زیر توجه کنید که یک عبارت منطقی ساده است و شناسه یا id مربوط به کاربران را بدون توجه به پسورد تایپ شده که صحیح است یا خیر، انتخاب می‌کند:

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

با SQL Injection چه حملاتی امکان‌پذیر است؟

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

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

چگونه از تزریق کد SQL جلوگیری کنیم؟

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

در ثانی به نکات مهم زیر توجه کنید:

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

تزریق کد اسکریپت

آسیب‌پذیری دیگری که با عنوان Script injection به آن اشاره می‌شود، روشی است که هکر کدهای آلوده را مستقیماً از طریق فرم‌های تحت وب یا داخل اپلیکیشن، ارسال می‌کند. ممکن است در طراحی رابط کاربری موانعی برای نفوذ از این طریق پیش‌بینی نشده باشد. به این نوع حملات هکری، Cross-Sire Scripting یا به اختصار XSS نیز گفته می‌شود.

تگ‌های <script> و <meta> و <html> و <body> و <embed> و <frame> و <frameset> و <img> بیش از سایر تگ‌ها برای این روش نفوذ استفاده می‌شوند.

چگونه از ترزیق کد Script جلوگیری کنیم؟

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

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