در 24 ژوئن 2022، تیم Wordfence Threat Intelligence فرآیند افشای مسئول آسیب پذیری جعل درخواست بین سایتی را که در سبد خرید Ecwid Ecommerce کشف کردیم، یک افزونه وردپرس نصب شده در بیش از 30000 سایت، آغاز کرد. این آسیبپذیری به مهاجمان این امکان را میدهد که برخی از تنظیمات پیشرفتهتر افزونه را از طریق یک درخواست جعلی تغییر دهند.
ما سعی کردیم در 24 ژوئن 2022 از طریق سیستم فروش بلیط با توسعه دهنده تماس بگیریم. پس از اینکه چندین بهروزرسانی افزونه به این مشکل رسیدگی نکرد و هیچ پاسخی از توسعهدهنده دریافت نکردیم، این آسیبپذیری را در 11 جولای 2022 به تیم افزونهها فاش کردیم. این آسیبپذیریها چند روز بعد در نسخه 6.10.24 در تاریخ 13 جولای 2022 برطرف شد. .
با توجه به ماهیت آسیبپذیریهای جعل درخواست بینسایتی، که شامل فریب مدیران برای انجام اقداماتی است که مجاز به انجام آنها هستند، نمیتوان حفاظت کافی برای این آسیبپذیریها بدون مسدود کردن درخواستهای قانونی ارائه کرد. به این ترتیب، ما بهشدت بهروزرسانی سبد خرید Ecwid Ecommerce را به نسخه 6.10.24 یا بالاتر توصیه میکنیم تا اطمینان حاصل شود که سایت شما در برابر هرگونه سوء استفادههایی که این آسیبپذیری را هدف قرار میدهد محافظت میشود.
سبد خرید Ecwid Ecommerce افزونه ای است که توسط Lightspeed ارائه شده است که به صاحبان سایت اجازه می دهد تا یک فروشگاه تجارت الکترونیک را در یک وب سایت وردپرس راه اندازی کنند و سپس آن را در سرویس های مختلف مانند آمازون و رسانه های اجتماعی همگام کنند. همچنین یکپارچه سازی تبلیغات و دسترسی به ابزارهای بازاریابی را ارائه می دهد. به عنوان بخشی از عملکرد این افزونه، تنظیمات پیشرفته تری وجود داشت که می توان آنها را مدیریت کرد. متأسفانه، این به صورت ناامن اجرا شد و این امکان را برای مهاجمان فراهم کرد که این تنظیمات را از طریق یک درخواست جعلی بهروزرسانی کنند.
به طور دقیق تر، افزونه موارد زیر را ارائه می دهد admin_post
اقدام به “ecwid_update_plugin_params
عملکرد برای این منظور:
add_action('admin_post_' . ecwid_get_update_params_action(), 'ecwid_update_plugin_params');
بررسی اولیه در ‘ecwid_update_plugin_params
‘ عملکرد تضمین می کند که کاربر فعلی اجازه دارد گزینه های سایت را مدیریت کند، که این قابلیتی است که متعلق به مدیران است. با این حال، بررسی nonce که مدت کوتاهی پس از آن انجام میشود، تنها در صورتی اجرا میشود که یک nonce به دلیل نحوه استفاده تابع تنظیم شده باشد. &&
ترکیب چکها برای تأیید اینکه یک nonce در درخواست وجود دارد و تأیید میکند که nonce معتبر است. این بدان معنی است که اگر wp-nonce
پارامتر در درخواست ارائه نشده است، مرحله تأیید رد شده است. این باعث میشود که این عملکرد در نسخههای آسیبپذیر در برابر حملات جعل درخواست متقابل سایت مستعد شود.
add_action('admin_post_' . ecwid_get_update_params_action(), 'ecwid_update_plugin_params'); function ecwid_update_plugin_params() { if ( !current_user_can('manage_options') ) { wp_die( __( 'Sorry, you are not allowed to access this page.' ) ); } if ( isset($_POST['wp-nonce']) && !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['wp-nonce'])), ecwid_get_update_params_action()) ) { wp_die( __( 'Sorry, you are not allowed to access this page.' ) ); } $options = ecwid_get_update_params_options(); $options4update = array(); foreach ( $options as $key => $option ) { if( !isset($_POST['option'][$key]) ) { continue; } if ( isset($option['type']) && $option['type'] == 'html' ) { $options4update[$key] = sanitize_textarea_field(wp_unslash( $_POST['option'][$key] )); } else { $options4update[$key] = sanitize_text_field(wp_unslash( $_POST['option'][$key] )); } if( $key == 'ecwid_store_id' ) { $options4update[$key] = intval($options4update[$key]); } } foreach ($options4update as $name => $value) { update_option($name, $value); } wp_safe_redirect('admin.php?page=ec-params'); exit(); }
این امکان را برای مهاجم ایجاد می کند که بتواند آن را تغییر دهد ecwid_store_id
، که به طور منحصر به فرد فروشگاه را شناسایی می کند و برای درخواست های پشتیبانی و همچنین برای تعبیه فروشگاه در سایت های دیگر مورد نیاز است. یکی دیگر از گزینه های سایت که می تواند اصلاح شود، سایت است ecwid_store_page_id
، که صفحه فروشگاه در نصب وردپرس است. هر دوی این تنظیمات در صورت تغییر به شناسه فروشگاهی نامعتبر ممکن است منجر به از دست دادن در دسترس بودن ویترین شود. علاوه بر این دو، تنظیمات دیگری نیز وجود دارد که ممکن است تحت تأثیر قرار گیرند. این افزونه در هیچ یک از منوهای خود پیوند مستقیمی به صفحه تنظیمات ارائه نمی دهد و یک هشدار در صفحه نشان می دهد که تغییر این تنظیمات ممکن است به طور قابل توجهی بر عملکرد افزونه تأثیر بگذارد.
اهمیت اجرای صحیح Nonces
Nonces جزء مهمی است که برای جلوگیری از آسیبپذیریهای جعل درخواست بینسایتی استفاده میشود. به این ترتیب، مهم است که اطمینان حاصل شود که آنها به درستی در سراسر کد پلاگین و موضوع اجرا می شوند تا از اجرای غیرمجاز آن کد جلوگیری شود. خوشبختانه، وردپرس مکانیسمهای مختلفی را برای ایجاد و اعتبارسنجی nonces مناسب ارائه میکند.
بدون ایجاد
اولین گام برای اجرای صحیح nonce ایجاد nonce است.
یکی از گزینهها برای پیادهسازی صحیح ایجاد nonce شامل این است wp_nonce_url()
عملکرد. این تابع یک URL هدف و همچنین یک اقدام و یک نام غیر اختیاری انتظار دارد. nonce به URL اضافه می شود و می تواند توسط یک تابع اعتبارسنجی nonce که در همان تابع یا تابع بعدی اجرا می شود تأیید شود. این امکان را برای توسعهدهندگان فراهم میآورد تا پیوندهایی را برای انجام اقداماتی مانند حذف پستها با یک nonce مناسب ارائه دهند که به کد اجازه میدهد تا تأیید کند که این اقدام از داخل سایت شروع شده است، در مقابل کلیک روی یک پیوند در جای دیگر، مانند یک پست الکترونیک.
یک گزینه اضافی اضافه کردن یک nonce به فرم برای ایمن کردن هرگونه ارسالی که از آن فرم نشات میگیرد است. کارکرد wp_nonce_field()
اغلب در این موارد استفاده می شود و انتظار یک رشته عمل را دارد. با این کار یک فیلد ورودی مخفی به فرم اضافه می شود. پس از ارسال فرم، nonce ایجاد شده قابل بررسی و تایید است.
در نهایت، یک nonce نیز می تواند با استفاده از آن تولید شود wp_create_nonce()
، که آرگومان رشته عمل را می پذیرد و فقط یک nonce را برمی گرداند. این را میتوان به روشهای مختلف پیادهسازی کرد و به عنوان یک توسعهدهنده انعطافپذیری بیشتری برای پیادهسازی اعتبارسنجی غیرمعمول میدهد. ما اغلب این تابع را در HTML در صفحات تنظیم می بینیم که بعداً برای تأیید منشاء درخواست هنگام ذخیره آن تنظیمات استفاده می شود.
به یاد داشته باشید که nonces مختص کاربران و جلسات جداگانه است و پس از 24 ساعت یا هنگام خروج از سیستم باطل می شود.
عدم اعتبارسنجی
مرحله دوم برای اجرای صحیح nonce شامل تأیید غیر مستقیم است. یک افزونه میتواند یک nonce مناسب را روی یک فرم یا تنظیمات بهروزرسانی پیادهسازی کند، اما بدون اعتبارسنجی مناسب آن nonce، حفاظت کافی وجود نخواهد داشت.
اولین گزینه برای اعتبارسنجی صحیح یک nonce شامل استفاده از check_admin_referer()
عملکرد. این تابع عمل محافظت شده و همچنین نام nonce را به عنوان آرگومان می پذیرد و nonce و همچنین ارجاع دهنده را بررسی می کند، بنابراین کمک می کند تا اطمینان حاصل شود که nonce ارائه شده صحیح است و درخواست از صفحه مدیریت شروع شده است.
هنگام اجرای یک اقدام AJAX، check_ajax_referer()
تابع می تواند استفاده شود. این nonce را تأیید میکند اما ارجاعدهنده را مانند آن بررسی نمیکند check_admin_referer()
تابع این کار را انجام می دهد، اگرچه تأیید می کند که درخواست یک درخواست AJAX است.
گزینه نهایی برای اعتبار سنجی یک nonce کلی تر است wp_verify_nonce()
عملکرد. با استفاده از این تابع، یک نام اکشن و nonce باید ارائه شود و تأیید می کند که nonce مناسب تنظیم شده است. این انعطاف پذیرترین پیاده سازی اعتبار سنجی nonce را برای توسعه دهندگان فراهم می کند.
در مورد افشای امروز، nonce در خود فرم تنظیمات ایجاد شد wp_create_nonce()
:
<input type="hidden" name="nonce" value="<?php echo wp_create_nonce( ecwid_get_update_params_action() ); ?>" />
با این حال، تأیید nonce به درستی انجام نشد:
if ( isset($_POST['wp-nonce']) && !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['wp-nonce'])), ecwid_get_update_params_action()) ) { wp_die( __( 'Sorry, you are not allowed to access this page.' ) ); }
همانطور که می بینید، این بیانیه تماس خواهد گرفت wp_verify_nonce()
اما فقط در صورتی که nonce به دلیل تنظیم شده باشد if (isset($_POST['wp-nonce'])
بررسی و استفاده از &&
در ترکیب با wp_verify_nonce()
عملکرد. بنابراین در صورت حذف nonce این بررسی صورت نمی گیرد.
این به عنوان یک یادآوری مهم نه تنها برای اجرای صحیح nonces و بررسی های اعتبار سنجی عمل می کند، بلکه برای اطمینان از اینکه چک در زمانی که مقدار nonce خالی است یا وجود ندارد، شکست می خورد.
به عنوان آخرین نکته مهم: هرگز تنها به چک های بی سابقه اعتماد نکنید. توسعهدهندگان باید همیشه به یاد داشته باشند که با استفاده از تابعی مانند بررسی قابلیتها را لحاظ کنند current_user_can()
به منظور اطمینان از اینکه کاربر شروع کننده عمل واقعاً مجاز به انجام آن است. Nonces هرگز نباید برای احراز هویت، مجوز یا هر نوع کنترل دسترسی استفاده شود، زیرا آنها صرفاً برای تأیید منشاء درخواست هستند و هیچ مجوزی را انجام نمی دهند.
جدول زمانی
- 24 ژوئن 2022 – ارتباط اولیه با توسعه دهنده افزونه.
- 11 جولای 2022 – ما موضوع را به تیم افزونه های WordPress.org تشدید می کنیم و جزئیات افشای کامل را برای آنها ارسال می کنیم.
- 13 جولای 2022 – این آسیب پذیری در نسخه 6.10.24 وصله شده است.
نتیجه
در پست امروز، آسیبپذیری در افزونه Ecwid Ecommerce Shopping Cart را پوشش دادیم که میتوان از آن برای فریب مدیران سایت برای بهروزرسانی تنظیمات افزونه به دلیل تأیید غیراصولی نادرست استفاده کرد. این آسیبپذیری با اطمینان از تنظیم یک nonce مناسب و با تأیید آن اصلاح شد.
لطفاً به یاد داشته باشید که به دلیل ماهیت آسیبپذیریهای جعل درخواست Cross-Site، ارائه حفاظت کافی از طریق فایروال Wordfence بدون مسدود کردن درخواستهای قانونی امکانپذیر نیست. به این ترتیب، ما بهشدت بهروزرسانی سبد خرید Ecwid Ecommerce را به نسخه 6.10.24 یا بالاتر توصیه میکنیم تا اطمینان حاصل شود که سایت شما در برابر هرگونه سوء استفادههایی که این آسیبپذیری را هدف قرار میدهد محافظت میشود.
اگر فکر میکنید سایت شما در نتیجه این آسیبپذیری یا هر آسیبپذیری دیگری در معرض خطر قرار گرفته است، ما خدمات واکنش به حادثه را از طریق مراقبت از Wordfence. اگر به پاکسازی سریع سایت خود نیاز دارید، پاسخ Wordfence همین سرویس را با در دسترس بودن 24/7/365 و زمان پاسخگویی 1 ساعته ارائه می دهد. هر دوی این محصولات دارای پشتیبانی عملی در صورت نیاز به کمک بیشتری هستند.
اگر دوستان یا همکارانی دارید که از این افزونه استفاده می کنند، لطفاً این اطلاعیه را با آنها به اشتراک بگذارید و آنها را تشویق کنید تا در اسرع وقت به آخرین نسخه وصله شده سبد خرید Ecwid Ecommerce به روز کنند.