هک از طریق تزریق کد (Injection) چگونه رخ می دهد؟ آموزش مقابله و 5 روش دفاعی موثر

 

تزریق کد (Injection)؛ کابوس دیتابیس‌ها و راهکارهای نفوذناپذیری

در دنیای امنیت سایبری، حملات تزریق کد (Injection) همچون اسب تروای دنیای دیجیتال عمل می‌کنند. این حملات نه تنها قدیمی نشده‌اند، بلکه با پیچیده‌تر شدن سیستم‌ها، همچنان جزو خطرناک‌ترین تهدیدات در لیست OWASP Top ۱۰ قرار دارند. اما واقعاً چه اتفاقی در پشت پرده این حملات رخ می‌دهد و چگونه می‌توان از آن جلوگیری کرد؟

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

حمله تزریق زمانی رخ می‌دهد که یک اپلیکیشن، داده‌های غیرقابل اعتماد (Untrusted Data) را به عنوان بخشی از یک دستور یا پرس‌وجو به مفسر ارسال می‌کند. مهاجم با وارد کردن کاراکترهای خاص (مانند ‘, ;, –) در فیلدهای ورودی (فرم‌ها، پارامترهای URL یا کوکی‌ها)، منطق برنامه را دستکاری می‌کند.

هسته اصلی اکثر آسیب‌پذیری‌های وب، «عدم تفکیک بین داده و کد» است. وقتی یک برنامه وب ورودی کاربر را می‌گیرد و آن را مستقیماً درون یک مفسر (Interpreter) مانند PHP، Python یا خط فرمان سیستم عامل (Shell) قرار می‌دهد، مهاجم می‌تواند با استفاده از کاراکترهای خاص، ساختار دستور اصلی را بشکند و دستورات مخرب خود را تزریق کند.

انواع رایج تزریق:

  1. SQL Injection (SQLi): تزریق دستورات SQL مخرب برای دسترسی غیرمجاز به دیتابیس.
  2. Command Injection: اجرای دستورات سیستمی روی سرور میزبان.
  3. Cross-Site Scripting (XSS): تزریق کدهای مخرب جاوا اسکریپت که در مرورگر کاربران دیگر اجرا می‌شود.

 

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

برای درک عمق فاجعه، نگاهی به سه پرونده واقعی می‌اندازیم:

  • سرقت ۱۳۰ میلیون کارت اعتباری (SQLi): در سال ۲۰۰۸، هکرها با تزریق کد در سایت Heartland Payment Systems، به دیتابیس نفوذ کرده و اطلاعات میلیون‌ها کارت را سرقت کردند.
  • نفوذ به زیرساخت‌های دولتی (Command Injection): مهاجمان با سوءاستفاده از پارامترهای ورودی در نرم‌افزارهای مدیریتی (مانند Citrix)، موفق شدند دستورات دلخواه خود را در کنسول سرور اجرا کنند.
  • کرم مای‌اسپیس (XSS): در سال ۲۰۰۵، سامی کامکار با تزریق یک کد ساده در پروفایل خود، توانست بیش از ۱ میلیون کاربر را آلوده کرده و آن‌ها را مجبور به دنبال کردن خود کند.

 

    انواع رایج حملات تزریق کد با مثال

    برای درک بهتر، دو نوع بسیار رایج از این حملات Injection را با مثال‌های مفهومی بررسی می‌کنیم.

    ۱. تزریق دستورات سیستم عامل (OS Command Injection)

    این حمله زمانی رخ می‌دهد که برنامه وب، ورودی کاربر را مستقیماً به خط فرمان سیستم عامل (مانند Bash در لینوکس یا CMD در ویندوز) پاس می‌دهد.
    فرض کنید یک فرم در سایت وجود دارد که از کاربر یک آدرس IP می‌گیرد تا سرور آن را Ping کند و نتیجه را نشان دهد.
    کد آسیب‌پذیر (مفهومی در PHP):
    $ip = $_POST['ip_address'];
    // اجرای دستور با استفاده از ورودی کاربر
    system("ping -c 4 " . $ip);
    حالت عادی:
    اگر کاربر ۱۹۲.۱۶۸.۱.۱ را وارد کند، دستور نهایی اینگونه اجرا می‌شود:
    ping -c 4 192.168.1.1
    حالت حمله (تزریق):
    مهاجم به جای IP، مقدار زیر را وارد می‌کند:
    127.0.0.1; cat /etc/passwd
    دستور نهایی که سرور اجرا می‌کند:
    ping -c 4 127.0.0.1; cat /etc/passwd
    نتیجه: سمی‌کالن (;) در سیستم‌های لینوکسی به عنوان جداکننده دستورات عمل می‌کند. سرور ابتدا دستور Ping را اجرا کرده و سپس بلافاصله دستور دوم (cat /etc/passwd) را اجرا می‌کند که منجر به لو رفتن اطلاعات حساس کاربران سیستم عامل می‌شود.

    ۲. تزریق کد از طریق توابع ارزیابی‌کننده (Eval Injection)

    بسیاری از زبان‌های برنامه‌نویسی توابعی دارند که می‌توانند یک رشته متنی (String) را به عنوان کد اجرا کنند (مانند eval() در PHP، JavaScript یا Python). استفاده از این توابع با ورودی کاربر، فاجعه‌بار است.
    مثال: یک ماشین‌حساب ساده تحت وب که عبارت ریاضی را از کاربر می‌گیرد و محاسبه می‌کند.

    کد آسیب‌پذیر (مفهومی در PHP):

    $user_input = $_POST['math_expr'];
    eval("return " . $user_input . ";");
    حالت عادی:
    کاربر ۵ + ۵ را وارد می‌کند. کد return ۵ + ۵; اجرا شده و عدد ۱۰ برگردانده می‌شود.
    حالت حمله (تزریق):
    مهاجم ورودی زیر را ارسال می‌کند:
    1; system('whoami');
    کد نهایی که اجرا می‌شود:
    return 1; system('whoami');
    نتیجه: تابع eval کد مخرب را اجرا کرده و نام کاربری که وب‌سرور با آن در حال اجراست را به مهاجم نشان می‌دهد. مهاجم اکنون می‌تواند هر کد دلخواهی (مانند ایجاد یک وب‌شِل برای کنترل کامل سرور) را روی سرور شما اجرا کند.

    ۳. تزریق SQL (SQL Injection) – زیرمجموعه‌ای از تزریق کد

    اگرچه SQLi معمولاً در دسته‌بندی جداگانه‌ای قرار می‌گیرد، اما ماهیت آن دقیقاً تزریق کد (این بار به مفسر پایگاه داده) است. اگر ورودی کاربر بدون استفاده از Prepared Statements در کوئری SQL قرار گیرد، مهاجم می‌تواند جداول را حذف کند یا اطلاعات دیتابیس را استخراج نماید (مثلاً با تزریق ‘ OR ‘۱’=’۱).

    راهنمای اختصاصی تیم وب‌مستر (رویکرد مدیریتی)

    تیم‌های وب‌مستر اغلب مسئول نگهداری سیستم‌ها هستند. برای کاهش ریسک:

    ۱-مدیریت وصله‌ها (Patch Management): اغلب حملات از طریق باگ‌های اصلاح شده در افزونه‌های وردپرسی رخ می‌دهد. سیستم را همیشه آپدیت نگه دارید.

    اخیراً یک آسیب‌ پذیری امنیتی به شدت بحرانی در هسته وردپرس شناسایی و منتشر شده است. این باگ امنیتی به هکرها اجازه می‌دهد تا از راه دور و بدون نیاز به تایید، بالاترین سطح دسترسی پیشخوان (مدیر کل / Admin) سایت شما را به دست آورده و کنترل کامل وب سایت را در اختیار بگیرند. پس آپدیت کردن وردپرس به نسخه جدیدتر (۷.۰.۲) شما را از مشکلات بعدی دور میکند.

    ۲-محدودیت دسترسی‌ها: فایل‌های پیکربندی سرور (مثل wp-config.php) را غیرقابل نوشتن کنید.

    می توانید با اضافه کردن قطعه کد زیر به ابتدای فایل htaccess.، از فراخوانی wp-config توسط اشخاص دیگر، جلوگیری نمایید.

    <files wp-config.php>
    order allow,deny
    deny from all
    </files>

    ۳-پایش و لاگ‌گیری: اگر رفتار غیرعادی در ترافیک سایت دیدید (مثل درخواست‌های حاوی کاراکترهای غیرمعمول)، لاگ‌های سرور را بررسی کنید.

    این بررسی لاگ در هاست های اشتراکی می تواند از طریق فایل های error-log و debug.php (مربوط به کدهای سایت) و از بخش AWSTAT سیپنل و Webalizer در حد ممکن انجام شود و یا با ارتباط گرفتن با پشتیبان هاست درخواست بررسی لاگ های سمت سرور انجام شود.

     

    ۴-امنیت فایل‌های آپلودی: به هیچ وجه اجازه اجرای فایل‌های آپلود شده (مثل اسکریپت‌های .php یا .py) را در دایرکتوری‌های آپلود ندهید.

    این نوع امنیت تا حدودی قابل پیاده سازی با کمک فایل پیکربندی هاست مانند htaccess  در دایرکتوری های حساس مانند plugins، uploads , themes و wp-include  است. به این شکل که کد زیر را در این فایل قرار دهید:

    <Files *.php>
    deny from all
    </Files>

    این کد مانع اجرای فایل های php در مسیرهای اشاره شده می شود.

     

    ۵-تست نفوذ مداوم: استفاده از ابزارهایی مثل OWASP ZAP برای اسکن خودکار سایت، می‌تواند نقاط ضعف را قبل از هکرها به شما نشان دهد.

     

    حملات تزریق کد

    راهکارهای دفاعی چندلایه (برای تیم‌های فنی)

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

    ۱. پرهیز از توابع خطرناک (Avoid Dangerous Functions)

    تا حد امکان از توابعی مانند eval(), system(), exec(), passthru() و shell_exec() استفاده نکنید. اگر مجبور به استفاده از آن‌ها هستید، هرگز ورودی مستقیم کاربر را به آن‌ها پاس ندهید.

    ۲. اعتبارسنجی و پاک‌سازی ورودی‌ها (Input Validation & Sanitization)

    • لیست سفید (Whitelisting): به جای اینکه بررسی کنید چه کاراکترهایی ممنوع هستند، بررسی کنید چه کاراکترهایی مجاز هستند. مثلاً اگر ورودی فقط باید یک عدد باشد، با توابعی مانند is_numeric() یا intval() مطمئن شوید که ورودی دقیقاً یک عدد است.
    • Escape کردن: اگر مجبورید ورودی را به خط فرمان بفرستید، از توابع امن مانند escapeshellarg() یا escapeshellcmd() در PHP استفاده کنید تا کاراکترهای مخرب خنثی شوند.

    ۳. استفاده از Prepared Statements (برای دیتابیس)

    برای جلوگیری از SQL Injection، هرگز متغیرها را مستقیماً درون رشته کوئری قرار ندهید. همیشه از کوئری‌های آماده (Prepared Statements) و Parameterized Queries استفاده کنید تا دیتابیس، داده و کد را از هم تفکیک کند.
    تفاوت این دو کوئری را در ادامه ببینید:
    INSERT INTO products (name, price) VALUES (?, ?);
    
    INSERT INTO products (name, price) VALUES ('bike', '10900');
    کوئری اول امن تر است البته به شرطی که حتما بهینه سازی مانند کد زیر هم انجام شده باشد:
    $stmt = $pdo->prepare("INSERT INTO products (name, price) VALUES (?, ?)");
    $stmt->execute(['bike', 10900]);
    نکته: دیتابیس، کوئری و داده‌ها را کاملاً جدا از هم می‌بیند. حتی اگر کاربر در قسمت name کد مخرب بنویسد، دیتابیس آن را به عنوان یک متن ساده (نه دستور SQL) ذخیره می‌کند و اجرا نمی‌شود.
    ۴. اصل حداقل دسترسی (Principle of Least Privilege)
    وب‌سرور و دیتابیس خود را با کاربر root یا admin اجرا نکنید. یک کاربر اختصاصی با محدودترین دسترسی‌های ممکن برای وب‌سایت بسازید. اگر مهاجمی موفق به تزریق کد شود، تنها به همان دسترسی‌های محدود محدود خواهد شد و نمی‌تواند کل سرور را تصاحب کند.

    ۵. استفاده از فایروال برنامه‌های وب (WAF)

    استفاده از یک WAF (مانند Cloudflare WAF یا ModSecurity) می‌تواند به عنوان یک لایه دفاعی اضافی عمل کند و الگوهای رایج تزریق کد را قبل از رسیدن به سرور اصلی شناسایی و مسدود کند.
    سخن پایانی:

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

    در عمل، امنیت باید به‌صورت چرخه‌ای و مداوم دنبال شود: هم‌زمان با تغییرات کد، به‌روزرسانی کتابخانه‌ها و سرویس‌ها، تغییر الگوهای حمله و حتی اصلاحات سمت کاربر یا سرور. حملات تزریق می‌توانند در قالب‌های مختلف بروز کنند (از تزریق در ورودی‌ها گرفته تا تزریق در کوئری‌ها یا حتی تزریق از مسیرهای غیرمنتظره مثل لاگ‌ها، قالب‌های تولید HTML یا وابستگی به داده‌های خارجی). همین تنوع باعث می‌شود دفاع مؤثر فقط یک “راه‌حل ثابت” نباشد، بلکه مجموعه‌ای از کنترل‌های لایه‌ای و قابل‌اتکا باشد که مدام ارزیابی و تقویت می‌شوند.

    برای دوری از هک و حملات گوناگون مرتبط با code injection، باید به‌روزترین سیاست‌های امنیتی و تاکتیک‌های عملی را به شکل مستمر در وب‌سایت یا اپلیکیشن اجرا کرد؛ از اصول پایه‌ای مثل اعتبارسنجی دقیق ورودی، حذف یا کاهش اعتماد به داده‌های کاربر، و استفاده صحیح از پارامترهای امن در تعامل با پایگاه‌داده، تا پیاده‌سازی دفاع‌های مکمل مثل اصل حداقل دسترسی، مدیریت امن خطاها، محدودسازی سطح اجرا و کنترل‌های نگهدارنده (مانند سیاست‌های سخت‌گیرانه Content Security Policy در سناریوهای وب). علاوه بر این، پایش مداوم، لاگ‌گیری هدفمند، تست‌های امنیتی دوره‌ای (شامل بررسی آسیب‌پذیری‌ها و سناریوهای تزریق) و بازنگری در کدهای جدید، بخشی از این رویکرد همیشگی هستند.

    امنیت واقعی یعنی هر بار که سیستم تغییر می‌کند دوباره “بازآزمایی” شود؛ چون شکاف‌های تزریق غالبا در نقاطی ظاهر می‌شوند که در نسخه‌های قبلی وجود نداشته‌اند یا در اثر تغییرات جدید، شرایط برای سوءاستفاده فراهم شده است. در نتیجه، نگاه به امنیت به‌عنوان یک فرآیند پیوسته و سازگار با زمان—نه یک اقدام یک‌باره—کلید کاهش ریسک در برابر code injection و سایر حملات پیچیده است.

    ثبت رای
    جستجو

    سرفصل های مقاله

    نظرات کاربران
    دیدگاهتان را بنویسید

    لطفا علاوه بر متن نظر، نام و ایمیل خود را نیز وارد کنید. (ایمیل شما منتشر نخواهد شد)