آسیبپذیری XXE؛ نفوذ با جابهجایی دادهها
در این مطلب به آسیبپذیریای میپردازیم که میتواند به تنهایی باعث عدم دسترسی کاربران سامانه به سرویسهای موردنظر خود در سامانه شود و امکان اجرای کد از راه دور را برای شکارچی فراهم کند؛ آسیبپذیری XXE یا XML External Entity.این آسیبپذیری، همانطور که از نامش پیداست، مربوط به انتقال داده بین سیستمها از طریق XML است که شکارچی با تزریق داده یا کدهای سطح سیستمعامل، میتواند در سطوح مختلف به سیستم قربانی دسترسی داشته باشد. در این مطلب؛
• از معرفی آسیبپذیری XXE شروع میکنیم،
• با عبور از روشهای کشف آسیبپذیری XXE به نحوهی اکسپلویت آسیبپذیری XXE میرسیم،
• ویدئویی از پویا دارابی داریم که در موقعیت شکار واقعی از آسیب پذیری XXE استفاده میکند.
• و در پایان با ابزار کشف و اکسپلویت آسیبپذیری XXE آشنا خواهیم شد.
ما در مطلب دیگری نیز به نام «SQL Injection؛ تاکتیکها و ترفندها» به آسیبپذیری بحرانی SQL Injection و نکات و ترفندهای موجود برای کشف و اکسپلویت آن آسیبپذیری پرداختیم و حالا در این مطلب براساس نکات و مواردی که در منابع معتبر آمدهاند، بنا داریم بررسی کلی و جزئیای از آسیبپذیری XXE و حملات مبتنی بر آسیبپذیری XXE داشته باشیم. با ما همراه باشید.
نکتهی لازمی که باید در نظر داشته باشید آن است که، در این مطلب ما نمایش دادهها مانند < برای < در یک سند XML را موجودیت و موجودیتهایی که به خارج از ساختار ارجاع داده میشوند یا از خارج فراخوانی میشوند، را با نام موجودیت خارجی میشناسیم.
به طور کلی، یک حملهی مبتنی بر آسیبپذیری XXE، مانند بسیاری از حملات دیگر، شامل سه مرحلهی "پیش از کشف"، "کشف" و "اکسپلویت" میشود؛ در مرحلهی پیش از کشف، اطلاعاتی از قبیل نوع XML و نسخهی آن را به دست میآوریم. در مرحلهی کشف، وجود آسیبپذیری XXE را بررسی میکنیم. سپس، به این موضوع میپردازیم که پس از اطمینان از وجود آسیبپذیری XXE، چگونه آن را اکسپلویت کنیم؟
برای نمونه میتوانیم به حادثهی فرضی ممکنی برای یک کسبوکار حوزهی اسناد و مدارک بپردازیم. فرض را بر این بگذاریم که در این شرکت، تابهحال فناوریهای مختلفی برای ارسال و دریافت دادهها بین سرویسهای گوناگون سامانه مانند سرویس پردازش اطلاعات مشتریان و سرویس محاسبات آماری به کار گرفته شدهاند ولی مقولهی امنیت جزو اولویتهای این شرکت نبوده است. در یکی از روزها، مهاجمی با جمعآوری اطلاعات از نوع فناوریهای استفاده شده، به ویژه دربارهی نوع XML استفادهشده و نسخهی آن، سرویس پردازش XML سامانه را هدف میگیرد و پس از نفوذ از طریق آسیبپذیری XXE، میلیونها اسناد و اطلاعات موجود در سرور را ابتدا برای خود ذخیره و سپس این اسناد را حذف میکند. فردای آن روز مدیران آن کسبوکار و کارشناسان فناوری آن مجموعه، متوجه حملهی هکری به بخشهایی از سامانهی خود میشوند در حالی که هیچگاه تصور وجود نقطهی قابل نفوذی را در سر نمیپروراندند.
آسیبپذیری XXE چیست؟
آسیبپذیری XXE از آنجایی که به شکارچی امکان تزریق به دستورات از پیش مشخص XML و ارسال فایل XML دستکاریشده به سیستم قربانی را میدهد، در دستهبندی آسیبپذیریهای تزریقی یا Injection قرار میگیرد. میتوان این آسیبپذیری را اینگونه نیز تعریف کرد: آسیبپذیری XXE عبارت است از امکان جاگذاری یا تزریق دستورات در قالب یک ورودی XML. آسیبپذیری XXE زمانی اتفاق میافتد که ورودی XML دارای ارجاع به یک موجودیت خارجی، توسط یک پارسر XML ضعیف پردازش شود. آسیبپذیری XXE میتواند منجر به افشای اطلاعات محرمانهای مانند اطلاعات حساس مشتریان و خروجیهای پردازشهای انجامشده بر روی آن اطلاعات، بروز آسیبپذیری SSRF و ایجاد امکان اسکن پورتهای سامانه شود و همچنین از دسترسی به سرویس توسط کاربران جلوگیری کند.
ارزش آسیبپذیری XXE
درجهبندی آسیبپذیریها علاوه بر اینکه عمدتا بر اساس میزان دسترسیای که به پایگاهداده سامانهی قربانی فراهم میکنند، صورت میگیرد. میزان دسترسی به سیستمعامل قربانی نیز میتواند در این درجهبندی مهم باشد. آسیبپذیری XXE به طور مستقیم با پایگاهداده در ارتباط نیست اما امکان اجرای کد از راه دور را برای شکارچی فراهم میکند و به همین دلیل است که درجهی آسیبپذیری XXE طیف گوناگونی از کم تا زیاد در نظر گرفته میشود. همچنین آسیبپذیری XXE از حدود سال 2017 به لیست ده آسیبپذیر برتر OWASP وارد شد و به سرعت و پس از مدت کوتاهی در مرتبهی چهارم قرار گرفت. این جایگاه خطرناکبودن آسیبپذیری XXE و اهمیت آن برای شکارچی را نشان میدهد.
در مطلب «چگونه آسیبپذیری در راورو ارزشگذاری میشود؟» میتوانید دربارهی معیارهای ارزشگذاری آسیبپذیریهای مختلف بیشتر بخوانید.
چگونه میتوان وجود آسیبپذیری XXE را بررسی کرد؟
برای کشف آسیبپذیری XXE همانند بسیاری از آسیبپذیریهای دیگر میتوان از دو روش دستی و کمکگرفتن از ابزار استفاده کرد.
اگر بخواهیم آسیبپذیری XXE را بهصورت دستی بررسی کنیم، مراحل زیر میتوانند کمک کننده باشند:
• روش اول: بررسی امکان دریافت فایل از سیستم قربانی با استفاده از تعریف یک موجودیت خارجی و به کار بردن آن موجودیت برای تعامل با سامانه و دریافت دادهها از سیستم قربانی
• روش دوم: بررسی امکان تعریف یک موجودیت خارجی با URLی که به سرور شکارچی ارجاع میدهد و سپس زیرنظر داشتن و بررسی تعاملات بین سیستم شکارچی و سیستم قربانی برای کشف نقاط آسیبپذیری عمدتا بر اساس پیغامهای خطا.
• روش سوم: بررسی امکان استفاده از حملهی XInclude که بین معرفی حملات مختلف مبتنی بر آسیبپذیری XXE به آن میپردازیم؛ یعنی شکارچی ابتدا سند XMLی را سمت سرور ایجاد میکند، سپس دادههای غیر از XML را درون آن سند ادغام میکند و به سمت سرور قربانی ارسال میکند تا یک فایل از پیش مشخص در سیستمعامل سرور قربانی را در پاسخ دریافت کند.
آیا همیشه آسیبپذیری XXE واضح و قابلتشخیص است؟
در اغلب موارد، آسیبپذیری XXE به وضوح با بررسی ترافیک HTTP ردوبدل شده قابلتشخیص است اما در مواردی تشخیص وجود آسیبپذیری XXE چندان آسان نیست. حملهی XInclude با ساختار قواعد خود میتواند در این شرایط، اکسپلویت آسیبپذیری XXE را فراهم کند.
حملات XInclude
بعضی سامانهها دادههای ورودی فرمها را که به وسیلهی درخواست HTTP از سمت کاربر به سرور میرسند، درون یک سند XML جاگذاری و سپس سند را از نظر قواعد بررسی میکنند. در این حالت، شکارچی در حالت عادی قادر به اکسپلویت آسیبپذیری XXE نیست. چراکه شکارچی کنترلی بر روی سند XML ندارد و به این ترتیب نمیتواند عنصر DOCTYPE را تعریف کند یا تغییر دهد. به هر حال، شکارچی در این شرایط احتمالا قادر است از XInclude استفاده کند. XInclude در واقع بخشی از ساختار فایل XML است که امکان ایجاد سند XML از طریق اسناد فرزند را فراهم میکند. در حملهی XInclude، شکارچی میتواند مقادیر قابلتزریق را درون هر دادهی موجود در سند XML قرار دهد. این حمله در شرایطی می تواند اجرا شود که شکارچی تنها کنترل بر روی یک نمونه از دادهها را داشته باشد که در یک سند XML در سمت سرور قرار داده شدهاند. در این حمله مبتنی بر آسیبپذیری XXE، شکارچی میتواند با استفاده از قالب XInclude و ارائهی مسیر فایل مدنظر اقدام به حمله کند:
یک DTD به چه معناست؟
عبارت Document Type Definition که به اختصار DTD نامیده میشود، همانطور که از نامش پیداست به ساختاری مشخص از سند XML، گفته میشود که شامل عناصر و صفتها با قوانین مختص به خودش باشد. XML عضوی از خانوادهی بزرگی به نام SGML که اعضای این خانواده شامل GML، SGML، XML و HTML هستند و این ساختار در تمام اعضای این خانواده میتواند وجود داشته باشد. نکتهای که باید به آن توجه داشت آن است که ساختار DTD میتواند درون یک سند XML و یا از خارج از سند و با یک ارجاع خارجی فراخوانی شود.
چگونه و تا چه میزان میتوان آسیبپذیری XXE را اکسپلویت کرد؟
همانطور که میدانید موجودیتهایی مانند و ™ در HTML وجود دارند که متناظر با کارکترهای ویژهای در html هستند. در اسناد XML موجودیتهای جدیدی در بخش DOCTYPE تعریف میشوند و میتوانند شامل طیف گستردهای از مقادیر باشند؛ مشابه تعریف ماکرو در بسیاری از زبانهای برنامهنویسی.
در این سند XML موجودیت &bar; با رشتهی world متناظر است و به همین دلیل در خط آخر، خروجی Hello World حاصل میشود. در حملات مرتبط به آسیبپذیری XXE مقادیر موجودیتها نه تنها از درون خود سند، بلکه از منابع خارجی نیز میتوانند بارگیری شوند. این منابع، شامل فایلهای محلی (محلی از دید سیستمی که پارسر در آن در حال اجراست) و URIها میشود.
یعنی اگر فایل /home/myuser/world.txt در سیستم موجود باشد و رشتهی World درون آن قرار داشته باشد، نیز خروجی یکسان است. موجودیتهایی که به خارج از ساختار ارجاع داده میشوند یا از خارج فراخوانی میشوند، به صورت ذاتی ناایمن هستند. چراکه پردازشگرهای XML برای بررسی محتوای XML طراحی نشدهاند و به همین دلیل موجودیت فراخوانیشده میتواند شامل هر کد و یا دادهای باشد. حالا اگر این نقص با پیچیدگی ساختار DTD همراه شود، راهها و روشهای حملههای بسیاری را در اختیار شکارچی قرار میدهد و درهای متعددی را به رویش باز میکند.
حملات Resource Exhaustion
این حملات مبتنی بر فراخوانی داخلی هستند و فراخوانی خارجی تاثیری در آنها ندارد. به عنوان یک نمونهی پرکاربرد از حمله با فراخوانی داخلی در XML، میتوان حملهی Billion Laughs یا بمب XML را نام برد.
درواقع برای ترسیم نقشهی اولیهی این حمله فرض کنیم که میخواهیم در یک سند XML یک رشته haha را به تعداد مثلا 8 به توان 3 بار بهصورت تکراری ایجاد کنیم تا حافظهی سرور متصل به فایل را درگیر نماییم. ابتدا درون فایل XML قربانی یک موجودیت را در نظر میگیریم و مکررا آن را در درون فایل فراخوانی میکنیم. درواقع با ساختن میلیاردها نمونه موجودیت و تکثیر آن از اولین موجودیت، باعث رشد تصاعدی آن موجودیت در فایل و در نتیجه باعث ایجاد اختلال در سیستم و در نهایت، جلوگیری از دسترسی به سرویس در سامانه میشویم. این حمله به خاطر استفاده از عبارت lol در اولین نمونهی منتشر شده به نام Billion Laughs مشهور شد.
روش دیگری که میتواند باعث ایجاد این اختلال شود، تزریق یک موجودیت خارجی است که باعث میشود جریانی از دادههای نامتناهی ارجاع داده شوند. برای نمونه میتوان /dev/urandom را در سیستمهای لینوکسی نام برد. تنها نکتهی این حالت، استفاده از شناساگر SYSTEM برای تعیین یک موجودیت خارجی است:
در این شرایط نیز پارسر با پارسکردن دادههای XML و به دلیل ارجاعات نامتناهی دادهها میتواند اصطلاحا باعث قفلشدن سرور شود.
جدا از مهار منابع، پارسرها میتوانند با فعالکردن حالت lazy expansion از این حمله مبتنی بر آسیبپذیری XXE محافظت شوند. این کار تنها زمانی که لازم باشد، باعث گسترانیدهشدن موجودیتها میشود تا از این حملات جلوگیری شود.
حملات Data Extraction
در این حمله شکارچی با فراخوانی نام یک فایل در سامانهی محلی به عنوان یک موجودیت خارجی، با استفاده از URI میتواند به فایل های محلی یا منابع شبکه دسترسی داشته باشد. حتی این دسترسی، فایلهای پیکربندی و دادههای حساس را نیز شامل میشود
در یک سامانهی مبتنی بر لینوکس، خروجی این کد، محتوای فایل لیست کاربران و مشخصات کاربران سیستمعامل خواهد بود. علاوه بر لینوکس، در محیط ویندوز نیز میشود از آدرسهای نسبی (Relative) استفاده کرد. به عنوان نمونه، میتوان در ویندوز آدرس file:///c:/boot.ini را به کار برد. در حالت دیگر، برای گرفتن یک فایل از شبکهی محلی، حتی در صورتی که سیستمهای بر روی شبکه به طور مستقیم در دسترس نیستند، میتوان به شکل زیر عمل کرد:
حملات SSRF
با اکسپلویت آسیبپذیری XXE، میتوان به طور غیرمستقیم به شبکهی داخلی دسترسی پیدا کرد و حملاتی را به شبکه انجام داد. در این حمله، سرور قربانی در ظاهر مبدا آن حملات را یک سرور داخلی مطمئن میشناسد. نمونهکد زیر با استفاده از آسیبپذیری XXE یک حملهی SSRF را بر روی سرور قربانی اجرا میکند:
همانطور که در کد قابل مشاهده است، این کد بر روی یک وبسرور اجرا میشود و به شکارچی امکان میدهد تا درخواستهای HTTP متعددی را به سوی یک سیستم متصل به شبکه ارسال کنند و اینگونه راه را برای حملات بعدی از طریق آسیبپذیریهای دیگری مانند اجرای کد از راه دور باز و هموار میکنند.
روشهای پیشرفته
روشهای پیشرفتهتری برای اکسپلویت آسیبپذیری XXE وجود دارند که از موجودیتهای پارامتری DTD بهره میبرند. این موجودیتها از لحاظ ساختاری شباهتهایی با موجودیتهای عادی دارند، اما تفاوت آنها در لزوم ارجاع موجودیتهای پارامتری درون DTD است.
نمونهکد زیر استفاده از موجودیت پارامتری برای تعریف یک موجودیت عادی را نشان میدهد.
دقت کنید که کاراکتر % برای تعریف موجودیت عادی استفاده شده و سپس به یک موجودیت پارامتری ارجاع داده شده است:
در این مورد، parameterEnt به وسیلهی یک رشتهی داخلی با یک تعریف موجودیت عادی جایگزین شده است. بنابراین خروجی نمونهکد بالا Hello Bar خواهد بود. این ترفند، امکان تزریق فایلهای DTD مملو از موجودیتهای پارامتری را در اختیار شکارچی قرار میدهد. به عنوان نمونه، شکارچی با این ترفند میتواند دادههایی که از سامانه استخراجکرده است را در تگهای CDATA مخفی کند تا پارسر این دادهها را پردازش نکند. شکارچی میتواند با جایگذاری یک فایل به نام paramInjection.dtd بر روی سیستم یا سرور خود، فرآیند حملهی مبتنی بر آسیبپذیری XXE را آغاز کند:
حمله زمانی اتفاق میافتد که شکارچی با استفاده از سند XML به صورت زیر:
فایلِ paramInjection.dtd را بارگیری و موجودیت داخلی wrappedFile را تعریف میکند. این موجودیت، فایل مورد هدف را در یک تگ CDATA پوشش میدهد و بدین ترتیب دادههای درون CDATA توسط پارسر پردازش نمیشوند.
از چه ابزارهایی میتوان کمک گرفت؟
معمولا در کشف و اکسپلویت آسیبپذیری XXE بهترین ابزار برنامهی BurpSuite است که آسیبپذیری توسط اسکنر آن بررسی میشود و میتواند ابزار خوبی برای کشف و اکسپلویت آسیبپذیری XXE باشد. اما ابزار دیگری هم وجود دارد که میتواند تا حد بسیاری به طور خاص در اکسپلویت آسیبپذیری XXE یار شکارچی باشد:
XXExploiter
این ابزار به زبان جاوا اسکریپت و در پلتفرم NodeJS نوشته شده است و طبق گفتهی توسعهدهندگان آن، همچنان در حال توسعه است و به همین دلیل ممکن است بعضی امکانات موجود در این ابزار به طور درست و مطمئن کار نکنند. شیوهی کار ابزار XXExploiter به این صورت است که پیلودهای XML ایجاد کرده و پس از ایجاد خودکار یک سرور برای کار با DTDها، از آنها برای گرفتن دادههای سیستم قربانی استفاده میکند. دانلود و راهنمای ابزار:
https://github.com/luisfontes19/xxexploiter
البته در این باره باید توجه داشت که همهی این ابزارها میتوانند در فرآیند کشف و بررسی قابلیت بهرهجوییبودن آسیبپذیری XXE مورداستفادهی شکارچی قرارگیرند اما استفاده از ابزارهای آماده در گزارش آسیبپذیری XXE فاقد ارزش است. در مطلب «چگونه گزارش آسیبپذیری بنویسیم؟» مفصلتر به بایدها و نبایدهای یک گزارش آسیبپذیری پرداختهایم. در صورت تمایل میتوانید آن را مطالعه کنید.
مثال ویدئویی
شکارچی آسیب پذیری؛ پویا دارابی
در این ویدئو به این میپردازه که آسیبپذیری XXE چطور میتونه به وسیله آپلود یک فایل سبب نفوذ به یک وبسایت بشه؟
روشهای رفع آسیبپذیری XXE کدامند؟
در حالت کلی، همهی حملات مبتنی بر آسیبپذیری XXE زمانی بر روی یک سیستم اجرا میشوند که کتابخانهای که فایلهای XML را پردازش میکند امکانات خطرناکی را که معمولا در سامانه نیاز نمیشوند به صورت فعال در خود موجود داشته باشد. راحتترین و موثرترین راه برای جلوگیری از حملات مبتنی بر آسیبپذیری XXE، میتواند غیرفعال کردن آن امکانات و بخشیدن عطایشان به لقایشان باشد. همچنین، لغو پشتیبانی از موجودیتهای خارجی و غیرفعال کردن XInclude از راههای جلوگیری از بروز حملات مبتنی بر آسیبپذیری XXE هستند.
این کار معمولا با استفاده از پیکربندیها یا بازنویسی رفتار عادی پارسرها و پردازشگرها با برنامهنویسی انجام میپذیرد.
سخن آخر
به طور کلی، ماهیت آسیبپذیریهای دستهی Injection را میتوان ایجاد انحراف در روند عادی عملیاتهای یک سامانه دانست. عامل این انحراف نیز همان مواردی هستند که باید به سامانه و در روند عادی تزریق شوند. اصولا هرچه شکارچی بر قواعد XML، روشهای کار با قالبهای ارسال و دریافت داده در سیستمها و شبکه مسلطتر باشد، در کشف و اکسپلویت آسیبپذیری XXE موفقتر خواهد بود. روشهای کشف و اکسپلویت آسیبپذیری XXE کاملا به صورت دستی قابل انجام هستند. البته در فرآیند کشف و اکسپلویت، ابزارهای معرفی شده در کنار نکات و نمونهها میتوانند یاریگر شکارچی باشند. نکتهی مهمی که باید به آن توجه داشت این است که، آسیبپذیری XXE میتواند دروازه ورودی آسیبپذیریهای ثانویهای مانند SSRF، منع سرویس و غیره باشد. بنابراین، آسیبپذیری XXE از این جهت که بتواند دسترسی سطح بالایی را برای شکارچی فراهم کند حائز اهمیت است. همانطور که گفتیم، این آسیبپذیری میتواند باعث ایجاد آسیبپذیریهای دیگری شود و با استفاده از آسیبپذیری XXE کشفشده در نقطهای که در چهارچوب میدان موردنظر بوده به یک آسیبپذیری مهمتر در نقطهای که در قوانین میگنجد برسیم. در نهایت برای شما شکارچی عزیز آرزوی توفیق در شکار آسیبپذیریهای مختلف از جمله آسیبپذیری XXE را داریم.
منابع:
https://portswigger.net/web-security/xxe
https://portswigger.net/web-security/xxe/xml-entities
https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing
https://en.wikipedia.org/wiki/Document_type_definition
https://www.netsparker.com/blog/web-security/xxe-xml-external-entity-attacks/