دسته بندی
Injection Attacks
باگ XML External Entity (XXE) Injection یک نوع باگ امنیتی است که در برنامهها و سیستمهایی که با فرمت XML کار میکنند، رخ میدهد. در این حمله، حملهکننده با درج موجودیتهای خارجی (External Entity) در فایلهای XML، توانایی اجرای کدها و دستورات سیستمی را به طور غیرمجاز به برنامه میدهد. این کار میتواند منجر به دسترسی به فایلها و منابع حساس، اجرای دستورات سیستمی، یا نقض حریم خصوصی وبسرویسها شود.مثال:
فرض کنید یک وبسرویس با فرمت
XML برای پردازش درخواستها ایجاد شده است. درخواستها از کلاینتها به صورت یک فایل XML ارسال میشوند و سپس وبسرویس اطلاعات مورد نیاز را از فایل XML استخراج میکند. کد PHP وبسرویس به صورت زیر است:$xml = $_POST['xml'];حملهکننده میتواند در فایل
$dom = new DOMDocument();
$dom->loadXML($xml);
$data = simplexml_import_dom($dom);
$username = $data->username;
$password = $data->password;
// ...
XML خود موجودیتهای خارجی (External Entity) را درج کند و از طریق آنها تلاش کند به فایلهای سرور دسترسی پیدا کند. به عنوان مثال:<?xml version="1.0" encoding="UTF-8"?>وقتی وبسرویس این فایل
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<user>
<username>&xxe;</username>
<password>malicious_password</password>
</user>
XML را پردازش میکند، موجودیتهای خارجی باعث میشود که محتوای فایل /etc/passwd (که شامل اطلاعات حسابهای کاربری سیستم است) به جای &xxe; در فیلد username قرار گیرد. در نتیجه، محتوای فایل /etc/passwd به عنوان نام کاربری دریافت میشود و این اطلاعات محرمانه نمایش داده میشود.روش های جلوگیری:
1- تعیین پارامتر
LIBXML_NOENT در زمان پردازش XML برای غیرفعالسازی خودکار موجودیتهای خارجی.libxml_disable_entity_loader(true);2- بهجای دریافت
XML از ورودی کاربران، بهتر است کاربران فایل XML را آپلود کنند و برنامه از مسیر فایل آپلود شده XML استفاده کند.3- همانند سایر باگهای امنیتی، اعتبارسنجی دقیق ورودیها و فیلتر سازی آنها برای جلوگیری از درج موجودیتهای خارجی ضروری است.
4- استفاده از کتابخانهها و ابزارهایی که امکان تشخیص و جلوگیری از
XXE را فراهم میآورند..