مقابله با حملات با بروزرسانی افزونه‌های Profile builder و Duplicator

مقابله با حملات با بروزرسانی افزونه‌ها مقابله با حملات با بروزرسانی افزونه‌ها

تمام افرادی که از وردپرس برای ایجاد و طراحی سایت خود استفاده می­‌کنند، همیشه به دنبال خبر­هایی تازه در مورد به­‌روزرسانی­‌های افزونه­‌ها یا موارد دیگر، هستند. اما باید به این نکته توجه داشت که چرا بعضی از افزونه­‌ها به‌­روزرسانی می‌­شوند. زیرا دانستن ایراد آن­‌ها مانع از دست رفتن اطلاعات و یا حتی وبسایت می‌­شود. در این مدت اخیر، از وجود نقص­‌هایی در دو افزونه وردپرس یعنی Profile Builder و Duplicator خبر داده‌­اند که باعث ایجاد مشکلات و حتی از دست رفتن بعضی از سایت­‌ها در جهان شده است. در این مقاله ما نقص موجود در این افزونه‌­ها را بررسی و راه‌­حل مقابله با حملات با بروزرسانی افزونه‌ها را توضیح خواهیم داد. مطمئنا مقاله مفیدی خواهد بود و باید درموردش اطلاعاتی داشته باشید.

مقابله با حملات با بروزرسانی افزونه‌ها

آنچه در این مقاله به اختصار خواهید خواند:

  • آسیب پذیری شدید افزونه Profile Builder تا به تصاحب در آمدن سایت
  • شرح آسیب پذیری موجود در افزونه Profile Builder
  • جزئیات مربوط به تعمیر و رفع مشکل افزونه Profile Builder
  • معیار­های آسیب­پذیری افزونه Profile Builder
  • اصلاح فیلد­های Profile Builder
  • آسیب‌­پذیری افزونه Duplicator و هک بیش از 1 میلیون سایت
  • تجزیه و تحلیل آسیب پذیری افزونه Duplicator
  • سرقت اعتبارنامه پایگاه داده توسط هکر­ها
  • شاخص­‌های IOC برای تعیین احتمال حمله در افزونه Duplicator

آسیب پذیری شدید افزونه Profile Builder تا به تصاحب در آمدن سایت

 اگر در این چند مدت اخیر در مورد وردپرس و افزونه­‌های آن در دنیای وب و اینترنت جستجویی کرده باشید، حتما خبر وجود یک آسیب پذیری مهم در افزونه Profile Builder برای وردپرس را مشاهده کرده­‌اید. این آسیب پذیری و فقدان در این افزونه نه تنها بر نسخه رایگان بلکه در نسخه­‌های Pro و Hobbyist آن تأثیر منفی گذاشته است. با توجه به منابع وردپرس، بیش از 50،000 سایت، نسخه رایگان افزونه  Profile Builder و همچنین تقریباً 15،000 سایت نصب نسخه Pro و Hobbyist این افزونه را بر روی سایت وردپرسی خود اجرا کرده‌­اند. با یک حساب سر انگشتی به این نتیجه می­‌رسیم که در حدود 65000 سایت تحت تأثیر این افزونه و عواقب آن قرار گرفته‌­اند. فاجعه است!

تمام نسخه‌های Profile Builder تا نسخه  3.1.0 این افزونه دچار این  آسیب پذیری شده‌­اند. پس این نکته بسیار مهم است که هر سایتی که دارای یکی از این نسخه­‌های آسیب پذیر این افزونه است، سریعاً باید به نسخه 3.1.1 به­‌روزرسانی شود تا از افت و زمین­‌گیر شدن سایت جلوگیری شود. برای اینکه از سوءاستفاده در سایت­‌هایی که دارای Wordfence Premium جلوگیری شود، از یک قانون فایروال استفاده شده است. سایت­‌هایی که از نسخه رایگان Wordfence استفاده می­‌کنند، پس از سی روز این قانون را دریافت می­‌کنند و مقابله با حملات اخیر توسط Wordfence انجام می‌شود.

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

شرح آسیب پذیری موجود در افزونه Profile Builder

Profile Builder افزونه‌­ای است که برای ایجاد فرم­‌های سفارشی، طراحی شده است که به کاربران این امکان را می­‌دهد تا ثبت نام، ویرایش پروفایل خود و موارد دیگر را انجام دهند. همچنین دارای یک ویرایشگر نقش کاربر سفارشی است که به تمام ادمین­‌ها این امکان را می‌­دهد که مجموعه‌­ای از امتیازات خاص را به کاربران سایت خود اختصاص دهند.

برای پیاده‌­سازی این نقش­‌های کاربر سفارشی در فرآیند ثبت نام، این افزونه از هندلرهای فرم استفاده می­‌کند تا یک نقش انتخاب شده را به یک کاربر جدید اختصاص دهد. این قسمت نقش کاربر یا نوع کاربر به طور پیش‌فرض موجود نیست اما می­‌تواند توسط یک مدیر سایت اضافه شود تا لیستی از نقش­‌های تأیید شده را در فهرست کشویی ارائه دهد.

add user- مقابله با حملات اخیر توسط Wordfence
ثبت نام کاربران در profile builder

متأسفانه، یک اشکال در کنترل کننده فرم، این را برای کاربر مشکوک، محقق می­‌سازد تا امکان ارسال ورودی در زمینه­‌های فرم را که در شکل واقعی اصلا وجود ندارد، فراهم کند. به خصوص اگر ادمین‌­های یک سایت، User Role field  را به فرم اضافه نکرده باشند، یک مهاجم یا هکر می‌­تواند یک مقدار موجود در User Role را در زمان ارسال فرم خود، استفاده کند.

هنگامی که ادمین­‌ها User Role selector  را به یک فرم اضافه می­‌کنند، آن­ها باید لیستی از نقش‌­های تأیید شده را نیز برای کاربران جدید انتخاب کنند. اگر این لیست ایجاد شود، فقط نقش­‌های تأیید شده توسط کنترل­‌ کنندگان فرم، پذیرفته می‌شوند. هنگامی که فیلد User Role  در فرم موجود نیست و یک هکر می‌­تواند نقش کاربر یا user role  را ارسال کند، در حالی که هیچ لیستی از نقش‌­های تأیید شده وجود ندارد و هر ورودی توسط کاربر، نیز پذیرفته خواهد شد.

این دو مسئله مطرح شده با هم ترکیب می‌­شوند تا به هکر­ها و کاربران غیرمجاز این امکان را بدهند تا اکانت­‌های ادمین­ را در سایت­‌های آسیب پذیر وردپرسی ثبت کنند. و حالا این افراد با داشتن امتیازات ادمین سایت، می‌­توانند به طور موثری سایت را به دست بگیرند آن را از دسترس ادمین اصلی خارج کنند و همچنین می­‌تواند بدافزار و ویروس‌­ها را در سایت رها کنند. چاره کار چیست؟ مقابله با حملات با بروزرسانی افزونه‌ها گاهی بهترین راه ممکن است. اما این مسائل در نسخه Profile Builder version 3.1.1. رفع گردیده‌­اند.

جزئیات مربوط به تعمیر و رفع مشکل افزونه Profile Builder

همانطور که در قسمت قبل اشاره کردیم، این آسیب پذیری ناشی از وجود دو اشکال کوچکتر در این افزونه است.
برای اولین اشکال موجود در این افزونه، کنترل کننده فرم افزونه Profile Builder، ورودی را در هر یک از قسمت­‌های موجود در پلاگین، صرف نظر از وجود این قسمت در فرم را پردازش کند. برای رفع این اشکال، توسعه دهندگان و کارشناسان این حرفه، تابع  اعتبارسنجی ()wppb_field_exists_in_form  را ایجاد کرده‌­اند. این تابع اعتبار سنجی، اکنون در قسمت عملکرد کنترل کننده هر قسمت از فرم ممکن استفاده شود و از ورود مقادیر ناخواسته و نامعتبر جلوگیری می­‌کند.

/**
 * Function that checks if a field type exists in a form
 * @return bool
 */
function wppb_field_exists_in_form( $field_type, $form_args ){
    if( !empty( $form_args ) && !empty( $form_args['form_fields'] ) ){
        foreach( $form_args['form_fields'] as $field ){
            if( $field['field'] === $field_type ){
                return true;
            }
        }
    }
 
    return false;
}

تعمیر این اشکال به طور موثری مانع سوء استفاده از مورد دوم می‌شود، اما توسعه دهندگان نیز به طور موثر آن را برطرف کرده‌­اند. علاوه بر اینکه تأیید کننده فیلد custom_field_user_role در فرم موجود است، در حال حاضر کنترل کننده قسمت­­‌ها از ایجاد کاربر به نام ادمین جلوگیری می­‌کند و در صورت مشاهده، آن را رد می­‌کند.

/* handle field save */
function wppb_userdata_add_user_role( $userdata, $global_request, $form_args ){
 
    if( wppb_field_exists_in_form( 'Select (User Role)', $form_args ) ) {
 
        $roles_editor_active = false;
        $wppb_generalSettings = get_option('wppb_general_settings', 'not_found');
        if ($wppb_generalSettings != 'not_found') {
            if (!empty($wppb_generalSettings['rolesEditor']) && ($wppb_generalSettings['rolesEditor'] == 'yes')) {
                $roles_editor_active = true;
            }
        }
 
        if (isset($global_request['custom_field_user_role'])) {
            if ($roles_editor_active && is_array($global_request['custom_field_user_role'])) {
                $user_roles = array_map('trim', $global_request['custom_field_user_role']);
                $user_roles = array_map('sanitize_text_field', $user_roles);
 
                //don't allow administrator value. it should never be here but just in case make a hard check
                if (($key = array_search("administrator", $user_roles)) !== false) {
                    unset($user_roles[$key]);
                }
 
                $userdata['role'] = $user_roles;
            } else {
                $role = sanitize_text_field(trim($global_request['custom_field_user_role']));
                if( $role !== 'administrator' ) {//don't allow administrator value. it should never be here but just in case make a hard check
                    $userdata['role'] = $role;
                }
            }
        }
    }
 
    return $userdata;
}

همانطور که در عبارت شرطی () if در خط 181 مشاهده می‌کنید، اگر تابع  ()wppb_field_exists_in_form مقداری را که برمی‌­گرداند False باشد، کد مربوط به واگذاری نوع کاربری اجرا نخواهد شد. علاوه بر­این، بررسی خطوط 197 و 204 در صورتی که نوع کاربری مورد نظر ادمین باشد، از تعیین تکلیف جلوگیری می­‌کند.

معیار­های آسیب‌­پذیری افزونه Profile Builder

با در نظر گرفتن همه عوامل این آسیب‌پذیری موجود در این افزونه، نمره شدت CVSS آن را 10.0 (بحرانی) محاسبه شده است. این نمره بر اساس معیارهای زیر تعیین شد:

  • Attack Vector: Network

این نقص می‌­تواند از طریق دسترسی به  (HTTP (S به سایت آسیب برساند.

  • Attack Complexity: Low

هیچ مهاجمی نیاز به تلاش بیش از حد ندارد، فقط با پیدا کردن یک نقص به آن دسترسی پیدا می­‌کند.

  • Privileges Required: None

این نقص در زمان ثبت نام کاربر مورد سوء استفاده قرار می­‌گیرد، بدون هیچگونه احراز هویت قبلی.

  • User Interaction: None

هیچ گونه تعاملی توسط مدیر سایت لازم نیست تا از یک فرم آسیب پذیر سوء استفاده شود.

  • Scope: Changed
  • Confidentiality: High
  • Integrity: High
  • Availability: High
  آپدیت امنیتی در وردپرس 6.3.2

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

اصلاح فیلد­های Profile Builder

در صورتی که سایت شما از نسخه آسیب پذیر Profile Builder استفاده می­‌کند و نمی‌­توانید سریعاً آن بروزرسانی کنید، می‌­توانید با اصلاح فیلدهای موجود در Profile Builder، شدت آسیب پذیری را کاهش دهید. از آنجا که یک هکر فقط می­‌تواند یک حساب ادمین ایجاد کند، اگر فیلد User Role در فرم وجود نداشت، می­‌توانید این قسمت را اضافه کنید و به درستی آن را به یک یا چند نقش مجاز محدود کنید.

برای این کار ابتدا وارد قسمت Profile Builder شده و مانند شکل زیر به قسمت مورد نظر می­‌روید.

form option- مقابله با حملات با بروزرسانی افزونه‌ها
تنظیمات فرم‌ساز

سپس وارد تنظیمات مربوط به قسمت­‌های فرم می­‌شوید. و نوع کاربری را انتخاب و ویرایش را بزنید.

edit form- کشف آسیب‌پذیری سایت
ویرایش فیلدهای فرم

در بالای این صفحه، یک فیلد کشویی است که از شما درخواست می­‌کند که گزینه‌­ای را انتخاب کنید.

گزینه ” (Select (User Role” را در قسمت Advanced انتخاب کنید. فرمی را که با دادن نام و توضیحات در فیلد ظاهر می‌شود، پر کنید. سپس نقش یا نقش‌­هایی را انتخاب کنید که کاربران جدید باید به آن­ها دسترسی داشته باشند.

form info- اطلاعات مربوط به فرم‌سازها
وارد کردن اطلاعات فرم‌ها

آسیب‌­پذیری افزونه Duplicator و هک بیش از 1 میلیون سایت

اخیراً یک نسخه جدید امنیتی مهم برای Duplicator، یکی از محبوب‌ترین افزونه‌­های حیاتی وردپرس منتشر شده است. بیش از یک میلیون سایت وردپرس تحت تأثیر آسیب پذیری این افزونه قرار گرفته‌­اند به گونه­‌ای که مهاجمان توانستند فایل‌­هایی را از سایت بارگیری کنند و به آن آسیب بزنند. ما از کلیه کاربران افزونه  Duplicator می­‌خواهیم که در اسرع وقت آن را به نسخه 1.3.28 ارتقا دهند. یعنی اینجا نیز بهترین راه مقابله با حملات با بروزرسانی افزونه‌هاست.

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

تجزیه و تحلیل آسیب پذیری افزونه Duplicator

افزونه Duplicator به مدیران سایت کمک می­‌کند تا سایت­‌های وردپرس خود را از روی هاستی به هاست دیگر انتقال دهند یا و از سایت خود کپی کنند. بخشی از این قابلیت‌­ها شامل انتقال پایگاه داده و محتوای پرونده­‌ها به مکانی دیگر است. هنگامی که ادمین یک نسخه جدید از سایت خود ایجاد می­‌کند، Duplicator به او اجازه می­‌دهد تا فایل‌­های تولید شده را از داشبورد وردپرس خود بارگیری کند.

build duplicator- فرآیند فعال‌سازی داپلیکیتور
فرآیند فعال‌سازی داپلیکیتور

این به عنوان یک درخواست AJAX در رابط مدیر سایت Duplicator انجام می‌­شود. دکمه‌­های دانلود هر یک با عملکرد duplicator_download و file، تماس با کنترلر وردپرس AJAX را ایجاد می‌­کنند، و موقعیت مکانی که بارگیری انجام شده است را نشان می‌­دهد. در صورت کلیک، فایل درخواستی بارگیری می­‌شود و کاربر، دیگر نیازی به بستن یا لود مجدد صفحه فعلی خود ندارد.

public static function duplicator_download() {
        $file = sanitize_text_field($_GET['file']);
        $filepath = DUPLICATOR_SSDIR_PATH.'/'.$file;
        // Process download
        if(file_exists($filepath)) {
            // Clean output buffer
            if (ob_get_level() !== 0 && @ob_end_clean() === FALSE) {
                @ob_clean();
            }
 
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($filepath));
            flush(); // Flush system output buffer
 
            try {
                $fp = @fopen($filepath, 'r');
                if (false === $fp) {
                    throw new Exception('Fail to open the file '.$filepath);
                }
                while (!feof($fp) && ($data = fread($fp, DUPLICATOR_BUFFER_READ_WRITE_SIZE)) !== FALSE) {
                    echo $data;
                }
                @fclose($fp);
            } catch (Exception $e) {
                readfile($filepath);
            }
            exit;
        } else {
            wp_die('Invalid installer file name!!');
        }
    }

متأسفانه ، عملکرد این کد duplicator_download از طریق wp_ajax_nopriv_  ثبت شده است و در دسترس کاربران غیرمجاز خواهد گرفت. از آن بدتر این است که، هیچ اعتبارسنجی، مسیرهای بارگیری پرونده را محدود نکرده‌­اند. پارامتر file از طریق sanitize_text_field منتقل
می‌­شود و به پلاگین DUPLICATOR_SSDIR_PATH اضافه می‌گردد، اما رد و بدل کردن این موارد همچنان ممکن است. یک مهاجم می‌­تواند با ارسال مقادیری مانند  ../../../file.php ، به پرونده­‌های خارج از فهرست در نظر گرفته شده توسط  Duplicator دسترسی پیدا کند تا به ساختار پرونده­‌های موجود در سرور دسترسی داشته باشد.
علاوه بر عملکرد AJAX، نقص­‌های یکسانی نیز در تابع ()duplicator_init وجود دارد، که توسط اشاره­‌گر”init” وردپرس فراخوانی می‌شود.

function duplicator_init() {
    if (isset($_GET['action']) && $_GET['action'] == 'duplicator_download') {
        $file = sanitize_text_field($_GET['file']);
        $filepath = DUPLICATOR_SSDIR_PATH.'/'.$file;
        // Process download
        if(file_exists($filepath)) {
            // Clean output buffer
            if (ob_get_level() !== 0 && @ob_end_clean() === FALSE) {
                @ob_clean();
            }
 
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($filepath));
            flush(); // Flush system output buffer
 
            try {
                $fp = @fopen($filepath, 'r');
                if (false === $fp) {
                    throw new Exception('Fail to open the file '.$filepath);
                }
                while (!feof($fp) && ($data = fread($fp, DUPLICATOR_BUFFER_READ_WRITE_SIZE)) !== FALSE) {
                    echo $data;
                }
                @fclose($fp);
            } catch (Exception $e) {
                readfile($filepath);
            }
            exit;
        } else {
            wp_die('Invalid installer file name!!');
        }
    }
}
add_action('init', 'duplicator_init');

از آنجا که به init  اشاره شده است، این تابع در هر بار لود شدن صفحه وردپرس چه برای کاربران وارد شده و چه بازدیدکنندگان غیرمجاز، به طور یکسان انجام می‌شود. این بدان معنی است که یک مهاجم می­‌تواند با اضافه کردن یک‌سری کوئری­‌ها به هر مسیری در یک سایت آسیب‌پذیر، بارگیری پرونده را شروع کند و مانع از نظارت ویژه AJAX شود.

هر دو مورد نقص­‌های گفته شده در نسخه Duplicator 1.3.28. بهبود یافته است. عملکرد AJAX برای تأیید صحیح نام پرونده­‌ها به روز شده است و اکنون به یک شناسه و hash برای تطبیق نیاز دارد تا بارگیری پرونده امکان‌پذیر باشد. همچنین تابع ()duplicator_init  حذف شده است.

سرقت اعتبارنامه پایگاه داده توسط هکر­ها

نقص‌­های موجود در قسمت بارگیری پرونده به صورت خودسرانه و بدون در نظر گرفتن بستر آسیب پذیر سایت، می­‌تواند یک موضوع مهم باشد، اما چنین حملاتی علیه سایت­‌های وردپرسی تا حد زیادی یک فایل را هدف قرار می­‌دهد و آن هم فایل  wp-config.php است.

بسته به طرح و شکل سایت، wp-config.php می‌­تواند حاوی هر مقدار کد سفارشی شده باشد، اما هکر­ها برای دستیابی به اطلاعات پایگاه داده یک سایت، این صفحه را هدف حمله خود قرار می­‌دهند. در این صورت، یک مهاجم می­‌تواند در صورت اجازه اتصال از راه دور، مستقیماً به بانک اطلاعات سایت قربانی دسترسی پیدا کند. این دسترسی می‌‌­تواند برای ایجاد حساب ادمین و ایجاد یک خطر بیشتر برای سایت یا تزریق محتوا یا برداشت داده از سایت توسط هکر استفاده شود.

در حال حاضر Wordfence بیش از 60،000 تلاش برای بارگیری پرونده­‌های wp-config.php را با این آسیب‌پذیری مسدود کرده است. حدود 50،000 از این رویدادها قبل از اینکه Duplicator این نقص را برطرف کند، رخ داده است.

تقریباً بیشتر این حملات از آدرس IP  77.71.115.52 از یک سرور در بلغارستان صورت گرفته است.

شاخص‌­های IOC برای تعیین احتمال حمله در افزونه Duplicator

از شاخص‌­های سازش زیر می‌­توان برای تعیین اینکه احتمالاً سایت شما مورد حمله قرار گرفته یا نه، استفاده کرد.

  • ترافیک وارد شده از آدرس IP 77.71.115.52 باید مشکوک تلقی شود.
  • حملات در این کمپین از طریق درخواست GET با کوئری زیر صادر می­‌شود:
    action=duplicator_download
    file=/../wp-config.php

نکته: از آنجا که این آسیب‌پذیری می­‌تواند از طریق WP AJAX مورد سوء استفاده قرار گیرد، از طریق درخواست POST نیز امکان‌پذیر است. در این حالت، این امکان وجود دارد که پارامتر عمل به جای کوئری­‌ها، در بدنه POST منتقل شود. این امر مانع از نمایش رشته duplicator_download در پرونده‌­های HTTP می­‌شود. با این حال، پارامتر file باید به عنوان رشته­‌های کوئری منتقل شود و یک شاخص قابل اعتماد باشد.

برای بالا بردن امنیت در وردپرس چه کار باید انجام داد؟

برای افزایش امنیت سایت در وردپرس، همیشه باید به روز بود و از آخرین خبر­های مربوط به وردپرس آگاه بود تا در صورت ایجاد مشکل، بتوان آن را حل کرد. یکی از این موارد، وجود مشکل در افزونه­‌هاست. افزونه Profile Builder و Duplicator افزونه‌هایی مفیدی هستند اما به ناگاه سایت را دچار مشکلات و حملات عجیبی کردند. بهترین راه برای مقابله با حملات با بروزرسانی افزونه‌ها انجام می‌شود که در این مقاله بصورت کامل توضیح دادیم.

نسخه‌­های قدیمی Profile Builder از آسیب‌پذیری جدی برخوردار بودند که می­‌تواند به هکرها اجازه دهد یک سایت را با استفاده از افزونه تصاحب کنند.

افزونه Duplicator، آسیب پذیری‌هایی همراه خود دارد که این نقص، سایت را به هدف قابل توجه هکرها تبدیل می­‌کند. بسیار مهم است که کاربران Duplicator و Profile Builder، افزونه‌­های خود را در اسرع وقت به‌­روزرسانی کنند تا این خطر رفع شود.

آیا این مقاله برای شما مفید بود؟
تقریبا
خیر

دیدگاهتان را بنویسید

ارسال دیدگاه به معنی این است که شما ابتدا قوانین ارسال دیدگاه را مطالعه کرده‌اید و با آن موافق هستید.