XML External Entities Injections (XXE)

رده OWASP: MASVS-CODE: کیفیت کد

نمای کلی

تزریق موجودیت خارجی XML (XXE) حمله‌ای علیه برنامه‌هایی است که ورودی XML را تجزیه می‌کنند. حمله XXE زمانی رخ می‌دهد که ورودی XML نامعتبر با ارجاع به یک موجودیت خارجی توسط یک تجزیه‌کننده XML با پیکربندی ضعیف پردازش شود. این حمله می‌تواند برای صحنه‌سازی چندین حادثه، از جمله انکار سرویس، دسترسی به سیستم فایل یا استخراج داده‌ها، مورد استفاده قرار گیرد.

تأثیر

وقتی یک برنامه یک سند XML را تجزیه می‌کند، می‌تواند هر DTD (تعاریف نوع سند، که به عنوان موجودیت‌های خارجی نیز شناخته می‌شوند) موجود در سند را پردازش کند. یک مهاجم می‌تواند با تزریق کد مخرب به عنوان DTD از این رفتار سوءاستفاده کند. سپس این کد می‌تواند به بخش‌هایی از سیستم فایل دستگاه دسترسی پیدا کند که فقط برای برنامه قابل دسترسی هستند و احتمالاً حاوی داده‌های حساس هستند. علاوه بر این، این کد مخرب می‌تواند درخواست‌هایی را از دستگاه ارسال کند و به طور بالقوه اقدامات امنیتی پیرامونی را دور بزند.

در نهایت، اگر برنامه DTD ها را گسترش دهد، این می‌تواند وضعیتی را با تکرارهای متعدد از موجودیت‌های ارجاع شده ایجاد کند، منابع دستگاه را به شدت مصرف کند و منجر به انکار سرویس شود.

کاهش‌ها

غیرفعال کردن DTD ها

امن‌ترین راه برای جلوگیری از XXE این است که همیشه DTDها (موجودیت‌های خارجی) را به طور کامل غیرفعال کنید. بسته به تجزیه‌گر مورد استفاده، این روش می‌تواند مشابه مثال زیر برای کتابخانه XML Pull Parser باشد:

جاوا

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

کاتلین

val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)

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

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

انجام عملیات پاکسازی ورودی

برنامه باید طوری پیکربندی مجدد شود که به کاربران اجازه تزریق کد دلخواه در مقدمه سند XML را ندهد. این امر باید در سمت سرور تأیید شود، زیرا کنترل‌های سمت کلاینت قابل دور زدن هستند.

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

اگر کتابخانه یا روش مورد استفاده را نمی‌توان به شیوه‌ای امن پیکربندی کرد، باید روش دیگری در نظر گرفته شود. XML Pull Parser و SAX Parser هر دو می‌توانند به شیوه‌ای امن پیکربندی شوند و DTDها و موجودیت‌ها را مجاز نمی‌دانند.

منابع