محققای Patchstack یه آسیب پذیری Reflected XSS به شناسه CVE-2023-30777 در پلاگین وردپرسی Advanced Custom Fields ، نسخه رایگان و پولی ، کشف و گزارش کردن.
افزونه Advanced Custom Fields یه افزونه وردپرسی هستش که بیش از 2 میلیون نصب فعال داره و امکان ایجاد فیلدهای سفارشی در صفحه ویرایش رو داره. وقتی شما یه پستی رو در وردپرس ایجاد میکنید، یسری فیلد بصورت پیش فرض در اختارتون هست، مثلا : دسته بندی ، تگ ، نویسنده و … . اگه بخوایید فیلدهای بیشتری رو داشته باشید ، مثلا اگه شما یه سایت در خصوص باگ بانتی داشته باشید، شاید علاقمند باشید تا فیلدهایی برای میزان بانتی، نوع آسیب پذیری، وضعیت گزارش و … هم ارائه بدید، بنابراین میتونید از این افزونه استفاده کنید.
آسیب پذیری از نوع Reflected XSS و شناسه CVE-2023-30777 رو داره . یه کاربر بدون احراز هویت با اکسپلویت این آسیب پذیری میتونه اطلاعات حساس رو به سرقت ببره. مهاجم میتونه با ارسال یه لینک مخرب به ادمین یا کاربر با امتیاز بالا، امتیاز خودش رو در سایت وردپسی افزایش بده یا تبلیغات نشون بده و … .
نسخه 6.1.5 و قبلش تحت تاثیر این آسیب پذیری و نسخه های 6.1.6 و 5.12.6 نسخه های اصلاح شده هستن.
شرح آسیب پذیری :
آسیب پذیری در function handler تابع admin_body_class هستش :
1 2 3 4 5 6 7 8 9 10 11 12 |
includes/admin/admin-internal-post-type-list.php public function admin_body_class( $classes ) { $classes .= " acf-admin-page acf-internal-post-type {$this->admin_body_class}"; if ( $this->view ) { $classes .= " view-{$this->view}"; } return $classes; } |
admin_body_class به عنوان یه handler اضافی برای هوک خود وردپرس ، بنام admin_body_class ،پیکربندی شده. کار این هوک اینه که کلاسهای CSS رو برای تگ Body در ادمین ،کنترل و فیلتر میکنه.
1 2 3 4 |
ncludes/admin/admin-internal-post-type-list.php // Add hooks. add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); add_action( 'admin_body_class', array( $this, 'admin_body_class' ) ); |
اگه به admin_body_class در هسته وردپرس نگاه کنیم، مشاهده میکنیم که خروجی هوک به درستی پاکسازی (sanitize) نشده و مستقیا در صفحه HTML ساخته میشه :
1 2 3 4 5 6 7 8 |
https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-admin/admin-header.php#L245 $admin_body_classes = apply_filters( 'admin_body_class', '' ); $admin_body_classes = ltrim( $admin_body_classes . ' ' . $admin_body_class ); ?> <body class="wp-admin wp-core-ui no-js <?php echo $admin_body_classes; ?>"> <script type="text/javascript"> document.body.className = document.body.className.replace('no-js','js'); </script> |
در نتیجه اگه function handler هوک admin_body_class ،به درستی عمل پاکسازی رو انجام نده،احتمال وجود آسیب پذیری XSS بالاست.
بنابراین به function handler ، (کد اولی)، بر میگردیم و بررسی میکنیم که آیا عمل پاکسازی به درستی انجام شده یا نه. همونطور که مشاهده میکنید، کد مستقیما متغیر $this->view رو به متغیر $classes الحاق میکنه. متغیر $this->view هم از طریق تابع current_screen قابل کنترل هستش :
1 2 3 4 5 6 7 8 9 10 |
includes/admin/admin-internal-post-type-list.php public function current_screen() { // Bail early if not the list admin page. if ( ! acf_is_screen( "edit-{$this->post_type}" ) ) { return; } // Get the current view. $this->view = isset( $_GET['post_status'] ) ? sanitize_text_field( $_GET['post_status'] ) : ''; // ------------------------------------- |
همونطور که مشاهده میکنید، برای پاکسازی از تابع sanitize_text_field استفاده کرده که میتونست برای امنیت بیشتر از esc_attr استفاده کنه. این تابع برای جلوگیری از حملات XSS کافی نیستش ، چون میشه از یه پیلود DOM XSS استفاده کرد. اگه همه موارد رو کنار هم بزاریم، میشه پیلود زیر رو برای این آسیب پذیری استفاده کرد :
1 |
http://<WORDPRESS_SITE>/wp-admin/edit.php?post_type=acf-field-group&post_status=xxxxxxx" onload=alert(document.domain) xxx=" |
خروجی در HTML بصورت زیر خواهد بود:
1 |
<body class="wp-admin wp-core-ui no-js acf-admin-5-3 acf-browser-chrome acf-admin-page acf-internal-post-type acf-admin-field-groups view-xxxxxxx\" onload=alert(document.domain) xxx=\" edit-php auto-fold admin-bar post-type-acf-field-group branch-6-2 version-6-2 admin-color-fresh locale-en-us no-customize-support no-svg"> |
حمله هکرها:
بعد از اینکه جزییات آسیب پذیری منتشر شد، تلاش ها برای اسکن و اکسپلویت هم شروع شده ، بطوریکه Akamai SIG تونسته بعد از 48 ساعت از انتشار اصلاحیه (24 ساعت بعد از انتشار PoC) ، حملات XSS رو شناسایی کنه.
این محققین یه نمونه از این حملات که مرتبط با یه بازیگر تهدید هستش رو بررسی کردن. نکته جالب اینه که این بازیگر تهدید ، خود PoC منتشر شده توسط Patchstack رو کپی کرده و شروع به اسکن و اکسپلویت با اون کرده.
در این حمله دو تا نکته وجود داره، یکی اینکه زمان پاسخ به حملات به شدت داره کاهش پیدا میکنه، همونطور که مشاهده کردید، 48 ساعت بعد از انتشار جزییات آسیب پذیری، حمله شروع شده. نکته بعدی اینکه با توجه به شدت حمله و زمان شروع حمله و محبوبیت این پلاگین، تقریبا 31 درصد ادمینها، در زمان نگارش این پست، از نسخه 6.1 استفاده میکنن، یعنی 69 درصد از کاربران این افزونه، حتی آخرین نسخه آسیب پذیر رو هم ندارن.
منابع