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

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

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

آسیبپذیری افزونه 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 حذف شده است.
سرقت اعتبارنامه پایگاه داده توسط هکرها
نقصهای موجود در قسمت بارگیری پرونده به صورت خودسرانه و بدون در نظر گرفتن بستر آسیب پذیر سایت، میتواند یک موضوع مهم باشد، اما چنین حملاتی علیه سایتهای وردپرسی تا حد زیادی یک فایل را هدف قرار میدهد و آن هم فایل 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
نکته: از آنجا که این آسیبپذیری میتواند از طریق WP AJAX مورد سوء استفاده قرار گیرد، از طریق درخواست POST نیز امکانپذیر است. در این حالت، این امکان وجود دارد که پارامتر عمل به جای کوئریها، در بدنه POST منتقل شود. این امر مانع از نمایش رشته duplicator_download در پروندههای HTTP میشود. با این حال، پارامتر file باید به عنوان رشتههای کوئری منتقل شود و یک شاخص قابل اعتماد باشد.
برای بالا بردن امنیت در وردپرس چه کار باید انجام داد؟
برای افزایش امنیت سایت در وردپرس، همیشه باید به روز بود و از آخرین خبرهای مربوط به وردپرس آگاه بود تا در صورت ایجاد مشکل، بتوان آن را حل کرد. یکی از این موارد، وجود مشکل در افزونههاست. افزونه Profile Builder و Duplicator افزونههایی مفیدی هستند اما به ناگاه سایت را دچار مشکلات و حملات عجیبی کردند. بهترین راه برای مقابله با حملات با بروزرسانی افزونهها انجام میشود که در این مقاله بصورت کامل توضیح دادیم.
نسخههای قدیمی Profile Builder از آسیبپذیری جدی برخوردار بودند که میتواند به هکرها اجازه دهد یک سایت را با استفاده از افزونه تصاحب کنند.
افزونه Duplicator، آسیب پذیریهایی همراه خود دارد که این نقص، سایت را به هدف قابل توجه هکرها تبدیل میکند. بسیار مهم است که کاربران Duplicator و Profile Builder، افزونههای خود را در اسرع وقت بهروزرسانی کنند تا این خطر رفع شود.