امنیت وب سایت وردپرس و محافظت در برابر بدافزار یا کدهای مخرب در سال 2023 بیش از هر زمان دیگری مهم شده است. این یک واقعیت شناخته شده است که وردپرس توسط بیش از 40٪ وب سایت ها استفاده می شود. تخمین زده می شود که در حال حاضر 64 میلیون وب سایت از وردپرس استفاده می کنند . بیش از 400 میلیون نفر هر ماه از وب سایت های وردپرس بازدید میکنند. به دلیل هک وردپرس در سال 2023 رو به افزایش است.
در 22 مارس 2023، Elementor Pro نسخه 3.11.7 پلاگین خود را منتشر کرد که آسیبپذیری حیاتی را برطرف نمود که در ترکیب با افزونه WooCommerce در حال اجرا در سایت به هر کاربر تأیید شده (مانند نقش مشترک یا کاربر مشتری) اجازه میدهد تنظیمات وردپرس را بهروزرسانی نماید.
در سایت. این کار از طریق یک اقدام AJAX از Elementor Pro انجام می شود که privileged مناسبی در محل ندارد. نسخه های 3.11.6 و پایین تر تحت تأثیر این آسیب پذیری قرار دارند.
این امکان را برای یک کاربر مخرب فراهم می کند که صفحه ثبت نام را (در صورت غیرفعال بودن) فعال کند و نقش پیش فرض کاربر را روی مدیر تنظیم کند تا بتواند یک حساب کاربری ایجاد نماید که فوراً دارای امتیازات سرپرست باشد. پس از این، آنها احتمالاً سایت را به یک دامنه مخرب دیگر هدایت می کنند یا یک افزونه یا backdoor مخرب را برای سوء استفاده بیشتر از سایت آپلود می کنند.
این آسیبپذیری در حال حاضر مورد سوء استفاده قرار میگیرد و ما شاهد حملاتی از چندین آدرس IP هستیم که بیشتر این حملات از آدرسهای IP زیر هستند:
همچنین شاهد آپلود فایل هایی با نام فایل های زیر هستیم:
همچنین شاهد تغییر URL سایت به موارد زیر هستیم:
وقتی Elementor Pro روی سایتی نصب میشود که WooCommerce را فعال کرده است، مؤلفه elementor-pro/modules/woocommerce/module.php
خود را بارگیری میکند، که چند عمل AJAX را ثبت میکند:
/** * Register Ajax Actions. * * Registers ajax action used by the Editor js. * * @since 3.5.0 * * @param Ajax $ajax */ public function register_ajax_actions( Ajax $ajax ) { // `woocommerce_update_page_option` is called in the editor save-show-modal.js. $ajax->register_ajax_action( 'pro_woocommerce_update_page_option', [ $this, 'update_page_option' ] ); $ajax->register_ajax_action( 'pro_woocommerce_mock_notices', [ $this, 'woocommerce_mock_notices' ] ); }
یکی از آنها pro_woocommerce_update_page_option
است که توسط ویرایشگر داخلی Elementor استفاده میشود. update_option
را فراخوانی میکند، تابعی که میتواند برای تغییر گزینههای وردپرس در پایگاه داده، با دو ورودی ارسالشده توسط کاربر استفاده شود:
/** * Update Page Option. * * Ajax action can be used to update any WooCommerce option. * * @since 3.5.0 * * @param array $data */ public function update_page_option( $data ) { update_option( $data['option_name'], $data['editor_post_id'] ); }
این تابع قرار است به مدیر یا مدیر فروشگاه اجازه دهد برخی از گزینههای خاص WooCommercerce را بهروزرسانی کند، اما ورودی کاربر تأیید نشده است و عملکرد فاقد بررسی قابلیتی برای محدود کردن دسترسی آن به یک کاربر با امتیاز بالا است.
Elementor uses its own AJAX handler to manage most of its AJAX actions, including pro_woocommerce_update_page_option
, with the global elementor_ajax
action. It is located in the “elementor/core/common/modules/ajax/module.php” script of the free version (which is required to run Elementor Pro) :
المنتور از کنترلر AJAX خود برای مدیریت بیشتر کنشهای AJAX خود، از جمله pro_woocommerce_update_page_option
، با عملکرد جهانی elementor_ajax
استفاده میکند. در اسکریپت elementor/core/common/modules/ajax/module.php
نسخه رایگان (که برای اجرای Elementor Pro لازم است) قرار دارد:
/** * Handle ajax request. * * Verify ajax nonce, and run all the registered actions for this request. * * Fired by `wp_ajax_elementor_ajax` action. * * @since 2.0.0 * @access public */ public function handle_ajax_request() { if ( ! $this->verify_request_nonce() ) { $this->add_response_data( false, esc_html__( 'Token Expired.', 'elementor' ) ) ->send_error( Exceptions::UNAUTHORIZED ); } ...
We can see that it includes a nonce check that could potentially prevent bad actors from exploiting the vulnerability. But the nonce and all JS code related to it is loaded via the admin_enqueue_scripts
hook in “elementor/core/common/app.php”:
میتوانیم ببینیم که شامل یک بررسی غیرمنتظره است که میتواند به طور بالقوه مانع از سوء استفاده بازیگران بد از آسیبپذیری شود. اما nonce و تمام کدهای JS مربوط به آن از طریق admin_enqueue_scripts
در elementor/core/common/app.php
بارگیری میشوند:
add_action( 'admin_enqueue_scripts', [ $this, 'register_scripts' ] );
بنابراین در منبع صفحه به همه کاربران وارد شده نشت می کند:
یک مهاجم احراز هویت شده میتواند با فعال کردن ثبت نام (users_can_register
) و تنظیم نقش پیشفرض (default_role
) روی «administrator»، تغییر آدرس ایمیل سرپرست (admin_email
) یا، همانطور که در زیر نشان داده شده است، هدایت کل ترافیک به وب سایت مخرب خارجی با تغییر siteurl
در میان بسیاری از احتمالات دیگر:
MariaDB [example]> SELECT * FROM `wp_options` WHERE `option_name`='siteurl'; +-----------+-------------+------------------+----------+ | option_id | option_name | option_value | autoload | +-----------+-------------+------------------+----------+ | 1 | siteurl | <https://evil.com> | yes | +-----------+-------------+------------------+----------+ 1 row in set (0.001 sec)
از آنجا که مؤلفه آسیبپذیر به نصب WooCommerce نیاز دارد، یک کاربر احراز هویت نمیتواند یک حساب مشتری WooCommerce ایجاد کند، وارد شود و از آسیبپذیری نیز سوءاستفاده کند.
(مشتریان WooCommerce میتوانند با افزودن wc-ajax=1
به پرسوجو، به عنوان مثال، https، به پشتیبان دسترسی پیدا کنند. ://example.com/wp-admin/?wc-ajax=1
).
در صورتی که سایت شما جز سایت ها آلوده به این vulnerability گردیده است، مطابق مراحل ذیل میتوانید موضوع را مرتفع نمایید:
مرحله اول:(بروزرسانی هسته وردپرس)
ابتدا بایستی احتمال وجود کد های مخرب در سایت را به حداقل برسانیم که برای این منظور هسته اصلی وردپرس بایستی جایگذاری گردد:
یک دایرکتوری جدید ایجاد نمایید و دو دایرکتوری wp-include و wp-admin را به آن منتقل نمایید. سپس تمامی فایل های موجود جز فایل .htaccess و wp-config.php را نیز به دایرکتوری ایجاد شده منتقل نمایید.
در نهایت یک وردپرس را از سایت مرجع دانلود و فایل هایی که در پوشه قرنتینه قرار داده اید را جایگذاری نمایید.
توصیه میگردد حتما سایت مرجع و آخرین نسخه وردپرس استفاده نمایید.
مرحله دوم:(بررسی فایل htaccess)
به جهت اطمینان در این مرحله تمام کد های موجود در فایل .htaccess را حذف و قطعه کد پیش فرض htaccess برای وردپرس را قرار دهید.
# BEGIN WordPress RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress
مرحله سوم:(پاکسازی دیتابیس)
باتوجه به موارد بررسی شده، اکثر تغییرات در دیتابیس سایت ها اعمال گردیده است که جهت رفع بایستی مراحل ذیل را پیش بروید:
3-1 یافتن جداول آلوده:
مطابق تصویر پیوست از قسمت جستجو phpMyadmin، آدرس [away.trackersline.com
](https://away.trackersline.com/do.js?l=1#') جستجو نمایید.
اصلی ترین جدول wp-option میباشد که با توجه به پیشوند تنظیم شده متفاوت خواهد بود.
3-2 پاکسازی:
برای رفع این و اصلاح جداول بایستی آدرس های موجود در جداولی که یافت گردید را با دامنه سایت جایگزین نمایید.
قطعه کد زیر کوئری اصلی برای جایگزینی میباشد و بسته به نوع فیلد بایستی تغییر یابد:
UPDATE wp_options SET option_value = REPLACE(option_value ,'[<https://away.trackersline.com/do.js?l=1#>](<https://away.trackersline.com/do.js?l=1#>)','[https://](<https://devedoping.ir/>)domainName.com'); UPDATE wp_options SET option_value = REPLACE(option_value ,'[<https://away.trackersline.com/go.php?v=2#>](<https://away.trackersline.com/do.js?l=1#>)','[https://](<https://devedoping.ir/>)domainName.com');
پس از جایگزینی آدرس دهید ها میتوانید مجدد در کل دیتابیس مانند مرحله 3-1 ااز پاکسازی کامل اطمینان حاصل نمایید.
مرحله چهارم:(حذف cache)
به جهت تکمیل فرایند پاکسازی، بایستی کش های موجود در دایرکتوری wp-content را حذف نمایید.( باتوجه به نوع افزونه کشینگ نام دایرکتوری ها متفاوت میباشد.
مرحله پنج: (بروزرسانی)
اصلی ترین مرحله پس از پاکسازی سایت بروز رسانی منشا اصلی آلودگی یعنی افزونه Elementor Pro میباشد که در صورتی که اقدام ننمایید مجدد سایت آلوده میگردد.