یک آسیبپذیری حیاتی در PHPMailer کشف شده است[۱]. PHP Mailer یکی از معروفترین کتابخانههای منبع باز PHP برای ارسال پستهای الکترونیکی است که توسط بیش از ۹ میلیون کاربر در سراسر دنیا مورد استفاده قرار میگیرد.
بسیاری از وبسایتهای PHP و برنامههای تحتِ وبِ منبعِ باز شامل WordPress ،Drupal ،۱CRM ،SugarCRM ،Yii و جوملا از کتابخانه PHPMailer به روشهای گوناگون (شامل SMTP) برای فرستادن پستهای الکترونیک استفاده میکنند.
این آسیبپذیری که CVE-2016-10033 نامگذاری شده است، توسط محقق امنیتی لهستانی به نام Dawid Golunski از Legal Hackers کشف شده است[۲]. این آسیبپذیری به مهاجم اجازه میدهد تا از راه دور کد دلخواه خود را در زمینه(۱) وبسرور اجرا کند و نرمافزار تحت وب کاربر را در معرض خطر قرار دهد.
Golunski در بیانیهای که در روز ۲۶ دسامبر ۲۰۱۶ منتشر شده، نوشته است[۳]: “به عنوان بهرهبرداری از این آسیبپذیری یک مهاجم میتواند اجزای مشترک وبسایت را مانند فرمهای نظرخواهی و تماس با ما، فرمهای ثبتنام، ریسِت کردن کلمه عبور و غیره را مورد حمله قرار دهد که منجر به ارسال پستالکترونیک با کمک نسخه آسیبپذیر PHPMailer میشود.
Golunski این آسیبپذیری را به سازندگان PHPMailer گزارش کرده است و آنها این آسیبپذیری را در نسخه جدید یعنی PHPMailer 5.2.18 برطرف کردهاند[۴]. تمامی نسخههای قبل از نسخه ۵٫۲٫۱۸ در معرض این آسیبپذیری قرار دارند، بنابراین به مدیران وب و سازندگان به شدت توصیه میشود تا این بهروزرسانی را انجام دهند.
Golunski کد بهرهبردار proof-of-concept را برای آسیبپذیری اجرای کد از راه دور مربوط به PHPMailer منتشر کرده است. او میگوید: “یک بهرهبرداری موفق میتواند به مهاجمان از راه دور اجازه دهد تا به سرور مورد هدف در زمینه حساب کاربری وبسرور دسترسی داشته باشند که میتواند منجر به در معرض خطر قرار گرفتن نرمافزار تحت وب شود.”
شما میتوانید کد بهرهبردار مربوط به این آسیبپذیری را در اینجا مشاهده کنید[۳].
۱ آنالیز فنی آسیبپذیری (CVE-2016-10033) اجرای کد از راه دور در PHPMailer
هنگام فرستادن یک پست الکترونیک از طریق PHPMailer فرآیند طبیعی شامل مراحل زیر است:
- PHPMailer درخواستهای کاربر را دریافت میکند.
- PHPMailer دادههای عرضه شده توسط کاربر را اعتبارسنجی میکند.
- PHPMailer دادهها را برای تابع PHP mail() میفرستد تا این تابع پست الکترونیک مربوطه را ارسال کند.
در مرحله اعتبارسنجی، PHPMailer با توجه به کد آورده شده در پایین، دادههای عرضه شده توسط کاربر را مورد بررسی قرار میدهد[۵].
این اعتبارسنج از روشهای استاندارد اعتبارسنجی استفاده میکند، مانند روش FILTER_VALIDATE_EMAIL که بر پایه PHP است، روش pcres که متعلق به squiloople.com است و روش الگوهای پیشفرض html5 برای نوع پست الکترونیک.
برای مثال، $address با مقدار “attacker -InjectedParam @example.com” پذیرفته نخواهد شد. اما این روشها از RFC3696 پیروی میکنند که بدین معنی است که آدرس پست الکترونیک میتواند شامل فضاهایی باشد. در هنگامی که از “” قبل از عبارت مورد نظر استفاده شود، یک $address با مقدار “attacker -InjectedParam”@example.com از فیلتر مربوطه عبور خواهد کرد.
بعد از مرحله اعتبارسنجی، PHPMailer المانهای مربوط به پست الکترونیک را مانند آدرس دریافت کننده، موضوع، body، header و آدرس فرستنده را برای تابع PHP mail() میفرستد تا این تابع پست الکترونیک مربوطه را ارسال کند. کد مربوطه در زیر آورده شده است.
مشکل اینجاست که PHPMailer مقادیر این پستهای الکترونیک را قبل از فرستادن آنها برای تابع mail()، sterilize نمیکند. PHPMailer فقط خط زیر را برمیگرداند:
و سپس $result را به تابع mail()با مجموعهای از پارامترهای مشابه ارسال میکند. این موضوع باعث فعال شدن احتمال حملات بعدی میشود.
برای مثال، هنگام فرستادن درخواست همراه با آدرس پست الکترونیک:
تابع mail() توسط ۴ آرگومان که عبارتاند از “/usr/bin/sendmail”، “-t”، “-i” و “-fattacker -InjectedParam@example.com”، عبارت /usr/bin/sendmail را بهرهبرداری خواهد کرد.
بااینحال، مهاجم میتواند آرگومان چهارمی را توسط تزریق کردن یک پارامتر با “\”” بشکند. برای مثال، با استفاده از آدرس پست الکترونیک زیر:
این آدرس پست الکترونیک به تابع ارسال پست الکترونیک اجازه میدهد تا ۶ آرگومان “/usr/bin/sendmail”، “-t”، “-i”، “-fattacker”، “-InjectedParam1” و “-InjectedParam2″@example.com” را اجرا کند.
۲ نحوه پیادهسازی آسیبپذیری CVE-2016-10033
بهمنظور پیادهسازی این حمله، یک وبسرور ایجاد کردیم که در شکل زیر نشان داده شده است:
منبع کد عبارت است از:
این کد یک فرمت شبیه به تابع “send feedback” است که بر روی بعضی وبسایتهای آنلاین وجود دارد. یک مهاجم میتواند یک پست الکترونیک با یک آدرس پست الکترونیک مخرب ارسال کند تا آرگومانهای sendmail را اجرا کند، مانند:
در مرحله بعد کد PHP میتواند به بخش پیام یا نام رشته اضافه شود. برای مثال:
این فرآیند در شکل زیر نمایش داده شده است:
قبل از ارسال این پست الکترونیک، فایلهای موجود در شاخه ریشه وب در شکل زیر نمایش داده شدهاند. index.php کدی مرتبط با صفحه وبی است که در شکل قبل نشان داده شده بود. شاخه “vulnerable” شامل فایلهای PHPMailer میشود.
payload مربوط به فرستادن این پست الکترونیک در شکل زیر نمایش داده شده است:
بعد از فرستادن این پستالکترونیک به عنوان حمله، فایل جدید “test.php” ساخته میشود. این فایل شامل دادههای RAW برای فرستادن این پست الکترونیک است که شامل کد PHP زیر میشود:
این فرآیند در شکل زیر نمایش داده شده است:
در این مرحله ما میتوانیم به فایل shell PHP یعنی test.php دسترسی داشته باشیم و دستورات مورد نظر را اجرا کنیم. برای مثال، ما میتوانیم دستور “cat /etc/passwd” را همانطور که در شکل زیر نشان داده شده است، اجرا کنیم:
در نتیجه، حمله واقعی میتواند یک فایل دلخواه باشد که آپلود شده است و آسیبپذیری را در یک فیلتر PHPMailer برای آدرس پست الکترونیک فرستنده بهرهبرداری میکند. این بدان معنی است که مهاجم میتواند یک پست الکترونیک را با یک کد مخرب به سرور ارسال کند و از آرگومانهای sendmail استفاده کند تا فایل log را توسط کد مخرب به شاخه ریشه وب، انتقال دهد و سپس کد مربوطه را از راه دور اجرا کند[۵].
۳ نحوه مقابله با آسیبپذیری CVE-2016-10033
تمامی کاربران PHPMailer باید به آخرین نسخه موجود بهروزرسانی شوند.
۴ منابع
[۱] http://thehackernews.com/2016/12/phpmailer-security.html
[۳]http://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html
[۴] https://github.com/PHPMailer/PHPMailer
[۵]https://blog.fortinet.com/2017/01/05/analysis-of-phpmailer-remote-code-execution-vulnerability-cve-2016-10033
(۱) context
ثبت ديدگاه