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

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

جزئیات مربوط به تعمیر و رفع مشکل افزونه Profile Builder جزئیات مربوط به تعمیر و رفع مشکل افزونه Profile Builder مقابله با حملات با بروزرسانی افزونه‌های Profile builder و Duplicator دسته‌بندی‌ها: اخبار و رویدادها، اخبار افزونه‌های وردپرس۲۰ اسفند ۱۳۹۸ ۱ رای مقابله با حملات با بروزرسانی افزونه‌هاتمام افرادی که از وردپرس برای ایجاد و طراحی سایت خود […]

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

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

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

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

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

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

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

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

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

تمام نسخه‌های Profile Builder تا نسخه  ۳.۱.۰ این افزونه دچار این  آسیب پذیری شده‌­اند. پس این نکته بسیار مهم است که هر سایتی که دارای یکی از این نسخه­‌های آسیب پذیر این افزونه است، سریعاً باید به نسخه ۳.۱.۱ به­‌روزرسانی شود تا از افت و زمین­‌گیر شدن سایت جلوگیری شود. برای اینکه از سوءاستفاده در سایت­‌هایی که دارای 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 در خط ۱۸۱ مشاهده می‌کنید، اگر تابع  ()wppb_field_exists_in_form مقداری را که برمی‌­گرداند False باشد، کد مربوط به واگذاری نوع کاربری اجرا نخواهد شد. علاوه بر­این، بررسی خطوط ۱۹۷ و ۲۰۴ در صورتی که نوع کاربری مورد نظر ادمین باشد، از تعیین تکلیف جلوگیری می­‌کند.

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

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

  • Attack Vector: Network

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

  • Attack Complexity: Low

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

  • Privileges Required: None

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

  • User Interaction: None

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

  • Scope: Changed
  • Confidentiality: High
  • Integrity: High
  • Availability: High

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

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

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

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

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

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

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

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

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

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

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

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

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

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

افزونه Duplicator به مدیران سایت کمک می­‌کند تا سایت­‌های وردپرس خود را از روی هاستی به هاست دیگر انتقال دهند یا و از سایت خود کپی کنند. بخشی از این قابلیت‌­ها شامل انتقال پایگاه داده و محتوای پرونده­‌ها به مکانی دیگر است. هنگامی که ادمین یک نسخه جدید از سایت خود ایجاد می­‌کند، 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  حذف شده است.