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

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

جزئیات مربوط به تعمیر و رفع مشکل افزونه Profile Builder جزئیات مربوط به تعمیر و رفع مشکل افزونه Profile Builder این آسیب پذیری ناشی از وجود دو اشکال کوچکتر در این افزونه است. برای اولین اشکال موجود در این افزونه، کنترل کننده فرم افزونه Profile Builder، ورودی را در هر یک از قسمت­‌های موجود در […]

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

جزئیات مربوط به تعمیر و رفع مشکل افزونه 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 به او اجازه می­‌دهد تا فایل‌­های تولید شده را از داشبورد وردپرس خود بارگیری کند.

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 بیش از ۶۰،۰۰۰ تلاش برای بارگیری پرونده­‌های wp-config.php را با این آسیب‌پذیری مسدود کرده است. حدود ۵۰،۰۰۰ از این رویدادها قبل از اینکه Duplicator این نقص را برطرف کند، رخ داده است.

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

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

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

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

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

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

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

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

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

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