هشدار: آسیب‌پذیری افزونه Newsletter وردپرس بیش از 300 هزار وب‌سایت را تحت تأثیر قرار می‌دهد

محققان وردفنس یک آسیب‌پذیری اسکریپت بین سایتی (XSS) و یک آسیب‌پذیری تزریق شیء PHP را در افزونه Newsletter کشف کردند. این افزونه در بیش از 300 هزار وب‌سایت مبتنی بر وردپرس نصب شده است.

 هشدار: آسیب‌پذیری افزونه Newsletter وردپرس بیش از 300 هزار وب‌سایت را تحت تأثیر قرار می‌دهد

محققان وردفنس یک آسیب‌پذیری اسکریپت بین سایتی (XSS) و یک آسیب‌پذیری تزریق شیء PHP را در افزونه Newsletter کشف کردند. این افزونه در بیش از 300 هزار وب‌سایت مبتنی بر وردپرس نصب شده است.

وردفنس برای جلوگیری از آسیب‌پذیری XSS یک قانون دیوار آتش ایجاد کرده است که از 15 جولای برای مشتریان پرمیوم فعال شده است و 14 آگوست برای کاربران مجانی فعال می‌شود.

گرچه برای بهره‌برداری از آسیب‌پذیری تزریق شیء PHP لازم است نرم‌افزار آسیب‌پذیر دیگری هم نصب شده باشد و وردفنس از رایج‌ترین بهره‌برداری‌ها جلوگیری می‌کند اما همچنان راهی برای دور زدن وجود دارد. وردفنس برای جلوگیری از این حمله نیز یک قانون دیوار آتش ایجاد کرده است که از 28 جولای برای کاربران پرمیوم فعال بوده و از 14 آگوست نیز برای مشتریان رایگان فعال خواهد شد.

توصیه می‌شود کاربران، افزونه را به جدیدترین نسخه (در حال حاضر 6.8.3) به‌روز کنند.

آسیب‌پذیری اسکریپت بین سایتی بازتابی احراز هویت شده

  • افزونه آسیب‌پذیر: Newsletter
  • Slug افزونه: newsletter
  • نسخه آسیب‌پذیر: پایین‌تر از 8.2
  • CVE ID: هنوز اختصاص داده نشده است.
  • امتیاز CVSS: 6.5 (متوسط)
  • بردار CVSS: CVSS:3.0/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L
  • نسخه رفع آسیب شده: 8.2

 

افزونه Newsletter دارای یک ویرایشگر است که برای ایجاد خبرنامه و کمپین‌های ایمیل به کار می‌رود. این افزونه از یک تابع AJAX به نام tnpc_render_callback استفاده می‌کند تا بر اساس پارامترهای ارسال شده در درخواست AJAX، بلوک‌های ویرایش شده را نمایش دهد. متأسفانه نسخه آسیب‌پذیر افزونه، این پارامترها را فیلتر نمی‌کرد و آنها را به تابع دیگری به نام restore_options_from_request می‌فرستاد. این تابع قبل از آنکه با استفاده از تابع render_block پارامترها را نمایش دهد، آنها را با استفاده از چند متد کدگشایی می‌کرد.

function tnpc_render_callback() {

    $block_id = $_POST[‘b’];

    $wrapper = isset($_POST[‘full’]);

    $options = $this->restore_options_from_request();

 

    $this->render_block($block_id, $wrapper, $options);

    wp_die()

 

در نتیجه مهاجم می‌توانست به چند روش باعث رندر گرفته شدن کد جاواسکریپت مخرب در مرورگر کاربر لاگین شده گردد. ساده‌ترین روش این بود که مهاجم یک درخواست post به wp-admin/admin-ajax.php ارسال و پارامتر action را به tnpc_render، پارامتر b را به html و پارامتر options را به کد جاواسکریپت مقداردهی کند. روش دیگر این بود که پارامتر options به یک آرایه خالی و پارامتر encoded_options به یک رشته JSON حاوی کد جاواسکریپت مقداردهی شود.

 

if (isset($_POST[‘encoded_options’])) {

         $decoded_options = $this->options_decode($_POST[‘encoded_options’]);

function options_decode($options) {

 

        // Start compatibility

        if (is_string($options) && strpos($options, ‘options[‘) !== false) {

        $opts = array();

        parse_str($options, $opts);

        $options = $opts[‘options’];

}

       // End compatibility

 

       if (is_array($options)) {

              return $options;

        }

 

       $tmp = json_decode($options, true);

       if (is_null($tmp)) {

       return json_decode(base64_decode($options), true);

       } else {

        return $tmp;

       }

}

هرچند برای بهره‌برداری از آسیب‌پذیری‌های XSS بازتابی مهاجم باید کاربر را به انجام کار خاصی فریب دهد (مثل کلیک روی لینک مخرب) همچنان می‌توان از این آسیب‌پذیری‌ها برای تزریق در پشتی یا افزودن کاربران بدخواه با دسترسی مدیریتی استفاده کرد. اگر مهاجم، قربانی را به ارسال یک درخواست حاوی جاواسکریپت مخرب فریب دهد، کد مخرب در مرورگر قربانی کدگشایی و اجرا می‌شود.

 

آسیب‌پذیری تزریق شیء PHP

  • افزونه آسیب‌پذیر: Newsletter
  • Slug افزونه: newsletter
  • نسخه آسیب‌پذیر: پایین‌تر از 8.2
  • CVE ID: هنوز اختصاص داده نشده است.
  • امتیاز CVSS: 7.5 (بالا)
  • بردار CVSS: CVSS:3.0/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H
  • نسخه رفع آسیب شده: 8.2

 

گرچه ویرایشگر Newsletter به کاربران سطح پایین‌تر اجازه ذخیره تغییرات خبرنامه‌ها را نمی‌داد اما همان تابع AJAX نامبرده (tnpc_render_callback) همچنان برای همه کاربران لاگین شده در دسترس بود، از جمله مشترکان (subscribers). این مسئله باعث ایجاد یک آسیب‌پذیری تزریق شیء PHP از طریق تابع restore_options_from_request می‌شد. این تابع داده ارسال شده از طریق پارامتر options[inline_edits] را بازگشایی (unserialize) می‌کرد. بنابراین مهاجمی که به عنوان مشترک لاگین کرده بود می‌توانست یک درخواست post را به wp-admin/admin-ajax.php فرستاده و پارامتر action را به tpnc_render و پارامتر options[inline_edits] را به یک شیء سریالیزه شده PHP مقداردهی کند.

if (isset($_POST[‘options’]) && is_array($_POST[‘options’])) {

        // Get all block options

        $options = stripslashes_deep($_POST[‘options’]);

 

        // Deserialize inline edits when

        // render is preformed on saving block options

        if (isset($options[‘inline_edits’]) && is_serialized($options[‘inline_edits’])) {

                $options[‘inline_edits’] = unserialize($options[‘inline_edits’]);

         }

خود افزونه Newsletter از هیچ کدی استفاده نمی‌کرد که باعث بهره‌برداری بیشتر شود، اما با استفاده از این آسیب‌پذیری می‌شد شیئی را تزریق کرد که ممکن بود بعداً توسط کد یک افزونه یا تم دیگر پردازش شده و منجر به اجرای کد دلخواه، بارگذاری فایل یا … شود و در نتیجه مهاجم می‌توانست کنترل وب‌سایت را به دست بگیرد.

 

منبع: وردفنس

 

 

کلمات کلیدی