حملات مدرن XML External Entity

دسته : آسیب پذیری آموزش ایمن سازی

نویسنده :

XML برگرفته شده از کلمات Extensible Markup Language است ، که یک زبان مرسوم برای وب می باشد که شامل دستورالعمل ها و اطلاعات و همچنین داده هایی است که باید بر روی صفحه ظاهر شوند. XML برای شرح و حمل و نقل اطلاعات بین ماشین ها می باشد.

در ابتدا برای درک بهتر از این آسیب پذیری به معماری این سرویس پرداخته می شود.

در شکل زیر که طراحی قدیمی می باشد سرور ها با چندین دیتابیس در ارتباط می باشند. در این نوع معماری تمام اطلاعات مربوط به ارتباط با پایگاه داده ، داخل سرور ها می باشد و با آلوده شدن هر سرور فرد علاوه بر دسترسی به سرورها به دیتابیس هم دسترسی پیدا می کند.

xxe attack

شاید تا ۵ سال پیش این پیکر بندی کاملا مرسوم بوده است اما برای امنیت بیشتر در طراحی های مدرن یک وب سرویس در بین ارتباط سرور و دیتابیس قرار می گیرد و سرور ها نباید به صورت مستقیم به دیتابیس

متصل شوند . شکل زیر یکی از مرسوم ترین معماری های وب سرویس می باشد فقط باید در نظر داشته باشید که وب سرویس در یک سرور مجزا قرار دارد و بر روی سرور وب اپلیکیشن نمی باشد

 

XXE attack

با توجه به معماری بالا تمامی درخواست های وب اپلیکیشن به سمت وب سرویس می رود و وب سرویس به دیتابیس متصل شده و اطلاعات لازم را در دیتابیس ذخیره یا دریافت کرده و به کاربر نمایش می دهد

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

Paypal یکی از قربانیان بزرگ این آسیب پذیری بوده است که در اواخر سال ۲۰۱۵  توسط “Sean Melia” مورد حمله قرار گرفت و فرد مهاجم توانست به وب سرویس Paypal نفوذ کرده و اختیار سرور را در دست بگیرد   که مستندات فنی آن ضمیمه شده است.

علاوه بر آن طبق مستند ارائه شده از سمت OWASP که به معرفی ۱۰ آسیب پذیری مهم سال ۲۰۱۷ اشاره کرده است ، حملات XXE در دسته بندی  Injection  که این دسته به عنوان خطرناک ترین و رایج ترین حملات در جایگاه اول  قرار گرفته است .

 

 در تصویر زیر نمونه ای از شمای کلی این آسیب پذیری را مشاهده می کنید.

به طور کلی حملات در XXE  به سه دسته تقسیم می شود :

۱ – جواب وب سرویس از ورودی های کاربر به صورت مستقیم نمایش داده می شود

۲- ورودی کاربر در جواب برگشتی تاثیر دارد اما نمایش داده نمی شود

۳- جواب وب سرویس به طور کلی هیچ ربطی به ورودی ها ندارد و تنها INSER شده است (Out-of-band)

 

محیط آزمایشگاهی تست آسیب پذیری XXE

برای درک بهتر برای شناخت و استفاده از این آسیب پذیری، یک محیط آزمایشگاهی پیاده سازی شده که نحوه بهره برداری از منابع سرور (Exploit) را در این محیط همانند یک حمله واقعی شبیه سازی شده.

 

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

 

 

حال به درخواست ها ارسال شده می پردازیم

 

 

همان طور که مشخص می باشد درخواست ارسال شده از نوع XML بوده و اگر از سمت وب سرویس ورودی ها کنترل نشود می توان به عنوان یک آسیب پذیری خطر ناک از نوع XXE باشد.

تذکر: برای درک بهتر این بخش نیاز می باشد شما با ساختار XML و DTD آشنا باشید

 ما برای تشخیص آسیب پذیری ورودی های کاربر را تغییر می دهیم تا ببینیم وب سرویس ورودی های ما را چگونه تجزیه و تحلیل می کند

Payload :

<?xml version=”1.0″ encoding=”ISO-8859-1″?>

  <!DOCTYPE foo [ <!ELEMENT foo ANY ><!ENTITY xxe “Test Vulnerability” >]>

   <root>

                <name>Pentester</name>

                <tel>021110</tel>

                <email>&xxe;</email>

                <password>pass </password>

   </root>

 

 

با توجه به ورودی های مخربی که ارسال شد ، هیچ گونه کنترلی  هنگام تجزیه تحلیل  انجام نشده ، در نتیجه  در جواب برگشتی به جای ایمیل آدرس کلمه “Test Vulnerability” چاپ شده است

.معمولا در این نوع آسیب پذیری می توان با تست پیلود اشاره شده ، به وجود آسیب پذیری پی برد.

حال سعی می شود با استفاده از تزریق دستورات مخرب، به فایل سیستم سرور دسترسی داشت.

 

POC:

<?xml version=”1.0″ encoding=”ISO-8859-1″?>

<!DOCTYPE foo [ <!ELEMENT foo ANY >

<!ENTITY xxe SYSTEM “file:///etc/passwd”]>

<root>

<name>Pentester</name>

<tel>021110</tel>

<email>&xxe;</email>

<password>Pass</password>

</root>

همانگونه که مشخص است با تزریق “File:///etc/passwd/” توانسته شد به فایل مهمی از سرور دسترسی پیدا کرد که می توان با تغییر ورودی آن برای خواندن تمام بخش ها از جمله تنظیمات و کانکشن های دیتابیس استفاده کرد.