تزریق نهادهای خارجی XML‏ (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 و موجودیت‌ها را غیرمجاز کرد.

منابع