آسیب پذیری 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 چگونه به وجود میآید؟
۱. پردازش ناامن فایلهای 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 برای SSRF (Server-Side Request Forgery)
در نوع دیگر از XXE برای اجرای حملات SSRF استفاده میشود. در این سناریو مهاجم Entity را به گونهای تعریف میکند که XML Parser هنگام پردازش، درخواستی به یک آدرس داخلی یا بیرونی ارسال کند. این آدرس میتواند مربوط به سرویسهای داخلی شبکه یا منابع خارجی کنترلشده توسط مهاجم باشد. به کمک این روش مهاجم میتواند بدون داشتن دسترسی مستقیم، ساختار شبکه داخلی را کشف کرده یا از سیستم هدف برای حمله به سایر سرویسها استفاده کند. SSRF مبتنی بر XXE یکی از خطرناکترین نوعهاست چون از دید سرور یک درخواست قانونی به نظر میرسد.

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

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 باشد.

محدودسازی دسترسی سرور به فایلها و شبکه داخلی
حتی اگر XXE رخ دهد، میتوان با اعمال محدودیتهای سیستمی اثر آن را کاهش داد. محدود کردن دسترسی برنامه به فایلهای حساس سیستم و جلوگیری از ارتباطات خروجی غیرضروری، باعث میشود مهاجم نتواند از XXE برای افشای اطلاعات یا اجرای SSRF استفاده کند. این اصل بر پایه POLP بنا شده است.
انجام تست امنیتی و بررسی دورهای آسیب پذیریها
بررسی منظم امنیتی اسکن آسیب پذیریها و تست نفوذ، به شناسایی زودهنگام XXE کمک میکند. بسیاری از سازمانها تنها پس از وقوع نشت اطلاعات متوجه وجود این باگ میشوند. تستهای دورهای باعث میشود پیکربندیهای ناامن XML قبل از سوءاستفاده مهاجمان اصلاح شوند.
جمعبندی…
آسیب پذیری XXE یکی از نمونههای رایج ضعفهای امنیتی ناشی از پیکربندی نادرست است که با وجود سادگی، میتواند خسارتهای جدی مانند نشت اطلاعات، حملات SSRF و از کار افتادن سرویسها ایجاد کند. شناخت نحوه شکلگیری این آسیب پذیری، انواع حملات آن و بهکارگیری راهکارهای پیشگیرانه مانند ایمنسازی XML Parser و اعتبارسنجی ورودیها، نقش مهمی در افزایش امنیت برنامههای مبتنی بر XML دارد.
سوالات متداول
XXE یا XML External Entity Injection ضعفی امنیتی است که به مهاجم اجازه میدهد از طریق XML مخرب، به فایلها یا منابع داخلی سرور دسترسی پیدا کند.
بله، این آسیب پذیری مخصوص سیستمهایی است که از XML و XML Parserها برای پردازش داده استفاده میکنند.
XXE میتواند باعث نشت فایلهای حساس، اجرای حملات SSRF، اسکن شبکه داخلی و حتی حملات DoS شود.
Blind XXE نوعی حمله است که در آن نتیجه مستقیماً در پاسخ سرور دیده نمیشود و مهاجم از رفتار غیرمستقیم سیستم برای تشخیص آسیب پذیری استفاده میکند.
در بیشتر موارد بله؛ زیرا JSON مفهومی به نام External Entity ندارد و سطح حمله را کاهش میدهد.
در وبسرویسها، SOAP APIها، سیستمهای قدیمی Java و PHP و برنامههایی که از XML بهصورت مستقیم استفاده میکنند.
بله، بهویژه در برنامههای قدیمی یا سیستمهایی که بهروزرسانی و پیکربندی امنیتی مناسبی ندارند.
موارد اخیر
-
آسیب پذیری XXE چیست و چگونه باعث نفوذ به سرور میشود؟ بررسی XML External Entity به زبان ساده -
NFC چیست و چگونه کار میکند؟ + کاربرد Near Field Communication در امنیت شبکه -
احراز هویت بدون رمز عبور چیست و چرا آینده امنیت دیجیتال است؟ -
FIDO چیست و چگونه فرایند احراز هویت را امن تر میکند؟ -
ماژول امنیتی سخت افزاری (HSM) چیست و با Hardware Security Key چه تفاوتی دارد؟ -
کلید سختافزاری چیست؟ معرفی انواع Hardware Security Key -
OpenVPN چیست و چگونه کار میکند؟ + مقایسه با IPsec VPN -
WireGuard چیست؟ بررسی امنیت، کاربردها و انواع اتصال -
رمزنگاری متقارن و رمزنگاری نامتقارن چیست؟ بررسی تفاوتها و کاربردها -
منظور از کلید عمومی و کلید خصوصی در رمزنگاری چیست؟ برسی نحوه عملکرد و مقایسه
برترین ها
-
آسیب پذیری XXE چیست و چگونه باعث نفوذ به سرور میشود؟ بررسی XML External Entity به زبان ساده -
احراز هویت بدون رمز عبور چیست و چرا آینده امنیت دیجیتال است؟ -
FIDO چیست و چگونه فرایند احراز هویت را امن تر میکند؟ -
ماژول امنیتی سخت افزاری (HSM) چیست و با Hardware Security Key چه تفاوتی دارد؟ -
کلید سختافزاری چیست؟ معرفی انواع Hardware Security Key
اشتراک گذاری این مطلب
دیدگاهتان را بنویسید
نشانی ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند *