آسیب پذیری XXE چیست و چگونه باعث نفوذ به سرور می‌شود؟ بررسی XML External Entity به زبان ساده
XXE یکی از آسیب پذیری‌های مهم XML است که می‌تواند باعث نشت اطلاعات و حملات SSRF شود.

آسیب پذیری XXE چیست و چگونه باعث نفوذ به سرور می‌شود؟ بررسی XML External Entity به زبان ساده

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

آسیب پذیری XXE چیست؟

آسیب پذیری XXE یا XML External Entity Injection نوعی ضعف امنیتی در تجزیه‌ کننده‌های XML است که در صورت تنظیم نادرست، به مهاجم اجازه می‌دهد تا درخواست‌های غیرمجاز را از درون سرور ارسال کند یا اطلاعات حساس را استخراج نماید. در واقع یک فایل XML می‌تواند شامل تعاریفی از “Entity”‌ باشد که در اصل متغیرهایی هستند و اگر برنامه اجازه دهد، این Entityها می‌توانند از منابع خارجی (مثل فایل‌های روی سیستم یا آدرس‌های URL) داده دریافت کنند.

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

آسیب پذیری XXE چیست؟

XXE چگونه به وجود می‌آید؟

۱. پردازش ناامن فایل‌های XML

زمانی که یک برنامه برای دریافت داده از کاربر از فرمت XML استفاده می‌کند، اگر XML Parser بدون محدودیت پیکربندی شده باشد، می‌تواند عناصر خارجی (External Entities) را پردازش کند. یعنی هر کاربر قادر است درون XML، ارجاعی به فایل‌های سیستمی یا آدرس‌های اینترنتی درج کند.

۲. تعریف یا تزریق External Entity مخرب

مهاجم معمولاً یک Entity خارجی تعریف می‌کند که به فایل‌های داخلی سیستم مانند /etc/passwd اشاره دارد یا به یک URL مخرب می‌رود. سپس XML را برای سرور ارسال می‌کند. اگر پارسر این ورودی را معتبر بداند، داده‌ها را از آن منبع می‌خواند و ممکن است برای مهاجم ارسال کند.

۳. پردازش و تفسیر خودکار توسط XML Parser

در مرحله بعد، Parser داده را بدون بررسی امنیتی پردازش می‌کند. این پردازش می‌تواند باعث نشت فایل‌های حساس، اجرای درخواست HTTP ناخواسته یا حتی مصرف بیش از حد منابع (در سناریوهای DoS مانند Billion Laughs) شود.

۴. بازگشت پاسخ آلوده به کاربر

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

انواع حملات XXE

XXE برای افشای فایل‌ها (File Disclosure)

یکی از رایج‌ترین اشکال حمله XXE زمانی است که مهاجم بتواند از طریق تعریف یک موجودیت خارجی (External Entity) به فایل‌های داخلی سرور دسترسی پیدا کند. برای مثال، مهاجم ممکن است در XML ورودی، ارجاعی به مسیرهایی مانند /etc/passwd در سیستم‌های لینوکسی قرار دهد. هنگام پردازش Parser محتوای فایل را می‌خواند و در پاسخ خروجی برمی‌گرداند؛ در نتیجه فایل‌های حساس سرور، شامل رمزها، کلیدها یا داده‌های پیکربندی، در اختیار مهاجم قرار می‌گیرد.

XXE برای افشای فایل‌ها (File Disclosure)

XXE برای SSRF (Server-Side Request Forgery)

در نوع دیگر از XXE برای اجرای حملات SSRF استفاده می‌شود. در این سناریو مهاجم Entity را به گونه‌ای تعریف می‌کند که XML Parser هنگام پردازش، درخواستی به یک آدرس داخلی یا بیرونی ارسال کند. این آدرس می‌تواند مربوط به سرویس‌های داخلی شبکه یا منابع خارجی کنترل‌شده توسط مهاجم باشد. به کمک این روش مهاجم می‌تواند بدون داشتن دسترسی مستقیم، ساختار شبکه داخلی را کشف کرده یا از سیستم هدف برای حمله به سایر سرویس‌ها استفاده کند. SSRF مبتنی بر XXE یکی از خطرناک‌ترین نوع‌هاست چون از دید سرور یک درخواست قانونی به نظر می‌رسد.

XXE برای SSRF (Server-Side Request Forgery)

XXE برای DoS (Billion Laughs Attack)

در حالت DoS یا حمله Billion Laughs، هدف نفوذگر استفاده از خاصیت بازگشتی Entityها برای مصرف غیرعادی منابع سیستم است. در این روش XML به گونه‌ای طراحی می‌شود که هر موجودیت (Entity) چندین بار از موجودیت پیشین خود استفاده کند، و این زنجیره به‌شکل تصاعدی افزایش یابد. Parser هنگام تفسیر، باید تمامی این Entityها را باز کند که باعث پرشدن حافظه و پردازنده می‌شود. نتیجه آن اختلال در سرویس و در برخی موارد کرش کامل برنامه است. هرچند این حمله باعث نشت داده نمی‌شود اما می‌تواند سیستم را عملاً از دسترس خارج کند.

XXE برای DoS (Billion Laughs Attack)

Blind XXE (XXE نابینا)

در حمله Blind XXE مهاجم قادر نیست مستقیماً نتیجه‌ی حمله را در خروجی پاسخ مشاهده کند. با این حال از رفتار غیرمستقیم سیستم (مانند زمان پاسخ‌دهی یا ارسال درخواست‌های ناخواسته به یک سرور کنترل‌شده) داده‌های لازم را استخراج می‌کند. به طور مثال مهاجم Entity را طوری تعریف می‌کند که هنگام پردازش، درخواست DNS یا HTTP به دامنه‌ای ارسال شود که او مالک آن است؛ سپس با مشاهده آن درخواست، می‌فهمد که سرور هدف آسیب پذیر است. Blind XXE یکی از پیچیده‌ترین شکل‌های این حمله است و معمولاً فقط با تحلیل دقیق ترافیک شبکه قابل شناسایی است.

نمونه ساده از یک حمله XXE

فرض کنید یک وب‌سایت وجود دارد که برای ثبت سفارش یا ارسال اطلاعات کاربر، از XML استفاده می‌کند. این وب‌سایت یک API دارد که اطلاعات دریافتی را مستقیماً با یک XML Parser پردازش می‌کند، بدون اینکه قابلیت External Entity را غیرفعال کرده باشد. در نگاه اول همه‌چیز عادی به نظر می‌رسد و سیستم انتظار دارد فقط داده‌های ساده کاربر را دریافت کند.

در مرحله بعد مهاجم متوجه می‌شود که ورودی این API از نوع XML است. او به جای ارسال یک XML معمولی، ساختار XML را به‌گونه‌ای تغییر می‌دهد که در آن یک Entity خارجی تعریف شده باشد. این Entity به یک فایل داخلی روی سرور اشاره می‌کند؛ فایلی که نباید هیچ‌گاه از بیرون قابل دسترسی باشد. از دید سرور، این هنوز یک XML معتبر است و خطایی رخ نمی‌دهد.

وقتی درخواست به سرور می‌رسد، XML Parser شروع به پردازش آن می‌کند. چون Parser به‌درستی ایمن‌سازی نشده Entity خارجی را باز می‌کند و محتوای فایل داخلی را می‌خواند. در این لحظه سرور ناخواسته اطلاعات محرمانه را وارد فرآیند پردازش می‌کند، درست مثل اینکه بخشی از داده‌ی عادی XML بوده است.

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

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

غیرفعال‌سازی External Entity در XML Parser

مهم‌ترین و مؤثرترین راه جلوگیری از XXE غیرفعال کردن پردازش External Entity در تنظیمات XML Parser است. بسیاری از Parserها به‌صورت پیش‌فرض اجازه بارگذاری Entityهای خارجی را می‌دهند که همین موضوع ریشه اصلی آسیب پذیری XXE محسوب می‌شود. با بستن این قابلیت حتی اگر مهاجم XML مخرب ارسال کند، Parser آن را نادیده می‌گیرد و امکان دسترسی به فایل‌ها یا منابع خارجی از بین می‌رود.

استفاده از XML Parserهای امن و به‌روز

کتابخانه‌ها و Parserهای قدیمی معمولاً تنظیمات ناامن یا آسیب پذیری‌های شناخته‌شده دارند. استفاده از نسخه‌های جدید و امن XML Parserها باعث می‌شود بسیاری از مشکلات امنیتی از جمله XXE به‌صورت پیش‌فرض مدیریت شوند. همچنین برخی Parserهای مدرن گزینه‌های امنیتی داخلی دارند که پردازش Entityهای خارجی را محدود یا کاملاً مسدود می‌کنند.

اعتبارسنجی و محدودسازی ورودی‌های XML

هر داده‌ای که از کاربر دریافت می‌شود باید قبل از پردازش بررسی و محدود شود. اعتبارسنجی ساختار XML و جلوگیری از پذیرش بخش‌هایی مانند تعریف Entity یا DOCTYPE، نقش مهمی در پیشگیری از XXE دارد. این کار باعث می‌شود تنها داده‌های مورد انتظار پردازش شوند و بخش‌های غیرضروری یا مشکوک به‌طور کامل حذف شوند.

استفاده از JSON به‌جای XML در صورت امکان

در بسیاری از APIها، استفاده از JSON جایگزین مناسب و امن‌تری نسبت به XML است. JSON فاقد مفاهیمی مانند External Entity است و همین موضوع سطح حمله را به‌طور چشمگیری کاهش می‌دهد. اگر نیازی به XML وجود ندارد، مهاجرت به JSON می‌تواند یکی از ساده‌ترین و مؤثرترین راهکارهای حذف ریسک XXE باشد.

استفاده از JSON به‌جای XML در صورت امکان

محدودسازی دسترسی سرور به فایل‌ها و شبکه داخلی

حتی اگر XXE رخ دهد، می‌توان با اعمال محدودیت‌های سیستمی اثر آن را کاهش داد. محدود کردن دسترسی برنامه به فایل‌های حساس سیستم و جلوگیری از ارتباطات خروجی غیرضروری، باعث می‌شود مهاجم نتواند از XXE برای افشای اطلاعات یا اجرای SSRF استفاده کند. این اصل بر پایه POLP بنا شده است.

انجام تست امنیتی و بررسی دوره‌ای آسیب پذیری‌ها

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

جمع‌بندی…

آسیب پذیری XXE یکی از نمونه‌های رایج ضعف‌های امنیتی ناشی از پیکربندی نادرست است که با وجود سادگی، می‌تواند خسارت‌های جدی مانند نشت اطلاعات، حملات SSRF و از کار افتادن سرویس‌ها ایجاد کند. شناخت نحوه شکل‌گیری این آسیب پذیری، انواع حملات آن و به‌کارگیری راهکارهای پیشگیرانه مانند ایمن‌سازی XML Parser و اعتبارسنجی ورودی‌ها، نقش مهمی در افزایش امنیت برنامه‌های مبتنی بر XML دارد.

سوالات متداول

۱. آسیب پذیری XXE چیست؟

XXE یا XML External Entity Injection ضعفی امنیتی است که به مهاجم اجازه می‌دهد از طریق XML مخرب، به فایل‌ها یا منابع داخلی سرور دسترسی پیدا کند.

۲. آیا XXE فقط در XML اتفاق می‌افتد؟

بله، این آسیب پذیری مخصوص سیستم‌هایی است که از XML و XML Parserها برای پردازش داده استفاده می‌کنند.

۳. XXE چه خطراتی برای سرور دارد؟

XXE می‌تواند باعث نشت فایل‌های حساس، اجرای حملات SSRF، اسکن شبکه داخلی و حتی حملات DoS شود.

۴. Blind XXE چیست؟

Blind XXE نوعی حمله است که در آن نتیجه مستقیماً در پاسخ سرور دیده نمی‌شود و مهاجم از رفتار غیرمستقیم سیستم برای تشخیص آسیب پذیری استفاده می‌کند.

۵. آیا استفاده از JSON می‌تواند XXE را حذف کند؟

در بیشتر موارد بله؛ زیرا JSON مفهومی به نام External Entity ندارد و سطح حمله را کاهش می‌دهد.

۶. XXE بیشتر در چه سیستم‌هایی دیده می‌شود؟

در وب‌سرویس‌ها، SOAP APIها، سیستم‌های قدیمی Java و PHP و برنامه‌هایی که از XML به‌صورت مستقیم استفاده می‌کنند.

۷. آیا XXE هنوز هم یک تهدید جدی است؟

بله، به‌ویژه در برنامه‌های قدیمی یا سیستم‌هایی که به‌روزرسانی و پیکربندی امنیتی مناسبی ندارند.

موارد اخیر

برترین ها

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

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

دیدگاه