جزئیات مربوط به تعمیر و رفع مشکل افزونه 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 افزونهای است که برای ایجاد فرمهای سفارشی، طراحی شده است که به کاربران این امکان را میدهد تا ثبت نام، ویرایش پروفایل خود و موارد دیگر را انجام دهند. همچنین دارای یک ویرایشگر نقش کاربر سفارشی است که به تمام ادمینها این امکان را میدهد که مجموعهای از امتیازات خاص را به کاربران سایت خود اختصاص دهند.
برای پیادهسازی این نقشهای کاربر سفارشی در فرآیند ثبت نام، این افزونه از هندلرهای فرم استفاده میکند تا یک نقش انتخاب شده را به یک کاربر جدید اختصاص دهد. این قسمت نقش کاربر یا نوع کاربر به طور پیشفرض موجود نیست اما میتواند توسط یک مدیر سایت اضافه شود تا لیستی از نقشهای تأیید شده را در فهرست کشویی ارائه دهد.

متأسفانه، یک اشکال در کنترل کننده فرم، این را برای کاربر مشکوک، محقق میسازد تا امکان ارسال ورودی در زمینههای فرم را که در شکل واقعی اصلا وجود ندارد، فراهم کند. به خصوص اگر ادمینهای یک سایت، 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 شده و مانند شکل زیر به قسمت مورد نظر میروید

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

در بالای این صفحه، یک فیلد کشویی است که از شما درخواست میکند که گزینهای را انتخاب کنید.
گزینه ” (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 حذف شده است.