آسیب پذیری SQL Injection در افزونه WooCommerce
در ۱۵ جولای ۲۰۲۱ که اخبار مربوط به آسیبپذیری injection SQL در ووکامرس منتشر شد، ووکامرس پستی در بلاگ خود در خصوص این موضوع منتشر کرد (لینک مطلب). این آسیبپذیریها در سیزدهم جولای شناسایی شده و در نسخه های ۳.۳.۶ تا ۵.۵.۱ WooCommerce و نسخه های ۲.۵.۱۶ تا ۵.۵.۱ WooCommerce Blocks رفع شدهاند. در ادامه یک تحلیل کوتاه از این آسیبپذیری، نحوه برطرف کردن و PoC آن خواهیم داشت.
بررسی اصلاحات انجام شده
در پست وبلاگ WooCommerce که در بالا لینک آن را دادیم، میتوانیم آسیبپذیریها را در WooCommerce و افزونه WooCoomerce Blocks مشاهده کنیم.
در اینجا ما ۲ مورد رفع مشکل امنیتی را میبینیم که در هر دو، فایل ‘class-wc-webhook-data-store.php’ اصلاح شده است. برای نمایش واضحتر روی عکس زیر کلیک کنید
نحوۀ این اصلاحات واقعاً جالب است. آنها برای بررسی بیشتر این موضوع، یک نسخه از source آسیبپذیر آن را بر روی یک سایت وردپرسی راهاندازی کردهاند (البته که این کار برای نمایش PoC نیز مفید خواهد بود).
از source برنامه میفهمیم که آسیب پذیری بر روی API است و می توانیم با ‘woocommerce\packages\woocommerce-blocks\src\StoreApi\RoutesController.php، لیست خوبی از مسیرهای API را مشاهده کنیم.
با استفاده از آن میتوانیم مسیر product-collection-data را ببینیم و داخل این مسیر را مشاهده کنیم:
woocommerce\packages\woocommerce-blocks\src\StoreApi\Routes\ProductCollectionData.php’ which looks promising!
مسیر ما در حال حاضر /wp-json/wc/store/products/collection-data است. از این فایل میتوانیم به راحتی URL کامل را تهیه کنیم.
اگر به patch اصلی برگردیم، wc_sanitize_taxonomy_name ما را به تایع زیر میرساند:
پس از جستجو و تحقیق در خصوص استفاده از sanitize_title، به این موارد دست پیدا کردیم:
به صورت پیشفرض کاراکترهای نماد آوا را به کارکترهای ASCII تبدیل میکند و حروف الفبا را به مقادیر underscore (_) و dash(-) از طریق فیلتر sanitize_title محدودیت ایجاد میکند.
و این کد همچنین از urldecode استفاده میکند، بنابراین اگر ۳ بار URL را encode کنیم، باید یک PoC کاملاً کارا همراه با URL که قبلاً ایجاد شده است داشته باشیم.
استفاده از باگ
با اطلاعاتی که بهدست آوردیم، اکنون میتوانیم از این آسیبپذیریها استفاده کنیم!
با تمام دادههایی که به دست آوردهایم، URL نهایی ما به شکل زیر خواهد بود. این پیلود شامل یک دستور sleep ساده در SQL است که صحت آسیبپذیر بودن آن را نشان میدهد:
اجرای این PoC در نسخه آسیب پذیر WooCommerce واقعاً کار میکند!
پابرگی:
منظور از PoC: مستنداتی که درباره آسیبپذیری موجود است و ما از آن برای رفع آسیبپذیریها استفاده میکنیم.