یک آسیب‌پذیری حیاتی در 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 فرآیند طبیعی شامل مراحل زیر است:

  1. PHPMailer درخواست‌های کاربر را دریافت می‌کند.
  2. PHPMailer داده‌های عرضه شده توسط کاربر را اعتبارسنجی می‌کند.
  3. PHPMailer داده‌ها را برای تابع PHP mail() می‌فرستد تا این تابع پست الکترونیک مربوطه را ارسال کند.

در مرحله اعتبارسنجی، PHPMailer با توجه به کد آورده شده در پایین، داده‌های عرضه شده توسط کاربر را مورد بررسی قرار می‌دهد[۵].

CVE-2016-10033

این اعتبارسنج از روش‌های استاندارد اعتبارسنجی استفاده می‌کند، مانند روش FILTER_VALIDATE_EMAIL که بر پایه PHP است، روش pcres  که متعلق به squiloople.com است و روش الگوهای پیش‌فرض html5  برای نوع پست الکترونیک.

PHPMailer2

برای مثال، $address  با مقدار “attacker -InjectedParam @example.com” پذیرفته نخواهد شد. اما این روش‌ها از RFC3696 پیروی می‌کنند که بدین معنی است که آدرس پست الکترونیک می‌تواند شامل فضاهایی باشد. در هنگامی که از “” قبل از عبارت مورد نظر استفاده شود، یک $address با مقدار “attacker -InjectedParam”@example.com از فیلتر مربوطه عبور خواهد کرد.

بعد از مرحله اعتبارسنجی، PHPMailer المان‌های مربوط به پست الکترونیک را مانند آدرس دریافت کننده، موضوع، body، header و آدرس فرستنده را برای تابع PHP mail() می‌فرستد تا این تابع پست الکترونیک مربوطه را ارسال کند. کد مربوطه در زیر آورده شده است.

PHPMailer3مشکل اینجاست که PHPMailer مقادیر این پست‌های الکترونیک را قبل از فرستادن آن‌ها برای تابع mail()، sterilize  نمی‌کند. PHPMailer فقط خط زیر را برمی‌گرداند:

PHPMailer4

و سپس $result را به تابع  mail()با مجموعه‌ای از پارامترهای مشابه ارسال می‌کند. این موضوع باعث فعال شدن احتمال حملات بعدی می‌شود.

برای مثال، هنگام فرستادن درخواست همراه با آدرس پست الکترونیک:

PHPMailer5

تابع mail() توسط ۴ آرگومان که عبارت‌اند از “/usr/bin/sendmail”، “-t”، “-i” و “-fattacker -InjectedParam@example.com”، عبارت /usr/bin/sendmail را بهره‌برداری خواهد کرد.

بااین‌حال، مهاجم می‌تواند آرگومان چهارمی را توسط تزریق کردن یک پارامتر با “\”” بشکند. برای مثال، با استفاده از آدرس پست الکترونیک زیر:

PHPMailer6

این آدرس پست الکترونیک به تابع ارسال پست الکترونیک اجازه می‌دهد تا ۶ آرگومان “/usr/bin/sendmail”، “-t”، “-i”، “-fattacker”، “-InjectedParam1” و “-InjectedParam2″@example.com” را اجرا کند.

۲    نحوه پیاده‌سازی آسیب‌پذیری CVE-2016-10033

به‌منظور پیاده‌سازی این حمله، یک وب‌سرور ایجاد کردیم که در شکل زیر نشان داده شده است:

PHPMailer7

منبع کد عبارت است از:

PHPMailer8

این کد یک فرمت شبیه به تابع “send feedback” است که بر روی بعضی وب‌سایت‌های آنلاین وجود دارد. یک مهاجم می‌تواند یک پست الکترونیک با یک آدرس پست الکترونیک مخرب ارسال کند تا آرگومان‌های sendmail را اجرا کند، مانند:

PHPMailer9

در مرحله بعد کد PHP می‌تواند به بخش پیام یا نام رشته اضافه شود. برای مثال:

PHPMailer10

این فرآیند در شکل زیر نمایش داده شده است:

PHPMailer11

قبل از ارسال این پست الکترونیک، فایل‌های موجود در شاخه ریشه وب در شکل زیر نمایش داده شده‌اند. index.php کدی مرتبط با صفحه وبی است که در شکل قبل نشان داده شده بود. شاخه “vulnerable” شامل فایل‌های PHPMailer می‌شود.

PHPMailer12

payload  مربوط به فرستادن این پست الکترونیک در شکل زیر نمایش داده شده است:

PHPMailer13

بعد از فرستادن این پست‌الکترونیک به عنوان حمله، فایل جدید  “test.php” ساخته می‌شود. این فایل شامل داده‌های RAW برای فرستادن این پست الکترونیک است که شامل کد PHP زیر می‌شود:

PHPMailer14

این فرآیند در شکل زیر نمایش داده شده است:

PHPMailer15

در این مرحله ما می‌توانیم به فایل shell PHP یعنی test.php دسترسی داشته باشیم و دستورات مورد نظر را اجرا کنیم. برای مثال، ما می‌توانیم دستور “cat /etc/passwd” را همان‌طور که در شکل زیر نشان داده شده است، اجرا کنیم:

PHPMailer16

در نتیجه، حمله واقعی می‌تواند یک فایل دلخواه باشد که آپلود شده است و آسیب‌پذیری را در یک فیلتر PHPMailer برای آدرس پست الکترونیک فرستنده بهره‌برداری می‌کند. این بدان معنی است که مهاجم می‌تواند یک پست الکترونیک را با یک کد مخرب به سرور ارسال کند و از آرگومان‌های sendmail استفاده کند تا فایل log را توسط کد مخرب به شاخه ریشه وب، انتقال دهد و سپس کد مربوطه را از راه دور اجرا کند[۵].

۳    نحوه مقابله با آسیب‌پذیری CVE-2016-10033

تمامی کاربران PHPMailer باید به آخرین نسخه موجود به‌روزرسانی شوند.

 

۴    منابع

[۱] http://thehackernews.com/2016/12/phpmailer-security.html

[۲] https://legalhackers.com/

[۳]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