WordPress外掛WooCommerce任意檔案刪除漏洞分析
前言
近期,研究人員在WordPress的許可權處理機制中發現了一個安全漏洞,而這個漏洞將允許WordPress外掛實現提權。其中一個典型例子就是WooCommerce,該外掛是目前最熱門的一款電子商務外掛,並且擁有400萬+的安裝量。簡而言之,這個漏洞將允許商鋪管理員刪除目標伺服器上的特定檔案,並接管管理員帳號。
漏洞影響
我們檢測並上報了WooCommerce中存在的一個檔案刪除漏洞,這個漏洞已經在WooCommerce的v3.4.6版本中成功修復。任意檔案刪除漏洞在大多數情況下並不會被認為是一種高危漏洞,因為攻擊者能做的只有通過刪除網站的index.php檔案來實現拒絕服務攻擊。這篇文章主要介紹的是如何刪除WordPress伺服器中的特定檔案,並禁用安全檢測,最終導致目標網站被完全接管。實際上,導致該漏洞存在的本質原因是WordPress的許可權系統設計存在缺陷,並影響到了400萬+的WooCommerce商鋪。
接下來,攻擊者只需要拿到商鋪管理員的使用者角色即可。商鋪管理員,能夠管理訂單、產品和客戶,這種訪問許可權可以通過XSS漏洞或網路釣魚攻擊來獲得。當漏洞成功利用之後,商鋪管理員將能夠接管任何一個管理員帳號,然後在伺服器上執行程式碼。
漏洞演示
視訊地址: ofollow,noindex" target="_blank">https://blog.ripstech.com/videos/wordpress-design-flaw.mp4
漏洞掃描報告:【 RIPS掃描報告 】
技術細節
WordPress的許可權處理機制主要是通過給不同角色提供不同的功能來實現的,當商鋪管理員角色被定義之後,它便會給這個角色分配edit_users功能,這樣他們就可以直接管理商鋪的客戶賬號了。整個許可權分配過程發生在外掛外掛餓的安裝過程當中。woocommerce/includes/class-wc-install.php:
//Shop manager role. add_role( 'shop_manager',// Internal name of the new role 'Shop manager',// The label for displaying array(// Capabilities ⋮ 'read_private_posts'=> true, 'edit_users'=> true, 'edit_posts'=> true, ⋮ ) );
角色許可權資訊會以WordPress核心設定儲存在資料庫中,這也就意味著使用者角色現在已經獨立於外掛了,即使外掛不啟用,也不會影響到相關的角色許可權。
當一名通過身份驗證的使用者嘗試修改其他使用者資訊時,便會呼叫current_user_can()函式,然後確保只有特權使用者可以執行這種操作。current_user_can()函式呼叫樣例:
$target_user_id= $_GET['target_user_id']; if(current_user_can('edit_user',$target_user_id)) { edit_user($target_user_id); }
呼叫的驗證邏輯如下:這個使用者想使用$target_user_id這個ID來修改特定的使用者,他是否有許可權執行?
預設配置下,edit_users功能允許有許可權的使用者(例如商鋪管理員)來編輯其他使用者,甚至是管理員使用者,然後執行類似密碼更新這樣的操作。出於安全因素考慮,WooCommerce需要指定商鋪管理員是否能夠編輯使用者,因此,外掛需要增加meta許可權功能。Meta功能可以被current_user_can()呼叫。預設行為下函式返回的值為true,但meta許可權函式返回的值可以決定當前使用者是否可以執行這樣的操作。下面給出的是WooCommerce meta許可權過濾器的抽象函式程式碼:
function disallow_editing_of_admins( $capability, $target_user_id ) { // If the user is an admin return false anddisallow the action if($capability == "edit_user"&& user_is_admin($target_user_id)) { return false; } else { return true; } } add_filter('map_meta_cap', 'disallow_editing_of_admins');
比如說,當current_user_can(‘edit_user’, 1)被呼叫時,過濾器將會判斷ID為1 ($target_user_id)的使用者是否是管理員,並根據結果來決定是否允許使用者操作。
商鋪管理員禁用外掛
預設情況下,只有管理員可以禁用外掛。但是這個漏洞允許商鋪管理員刪除伺服器上的任意可寫檔案,所以我們我們額可以通過刪除WooCommerce的主檔案-woocommerce.php來禁止WordPress載入該外掛。
這個檔案刪除漏洞存在於WooCommerce的日誌記錄功能中,日誌會以.log檔案的形式儲存在wp-content目錄中。當商鋪管理員想要刪除日誌檔案時,他需要以GET引數來提交檔名。下面顯示的程式碼段就是存在漏洞的部分:
woocommerce/includes/admin/class-wc-admin-status.php
class WC_Admin_Status { public static function remove_log() { ⋮ $log_handler = newWC_Log_Handler_File(); $log_handler->remove(wp_unslash($_REQUEST['handle'])); }
woocommerce/includes/log-handlers/class-wc-log-handler-file.php
class WC_Log_Handler_File extends WC_Log_Handler { public function remove($handle) { ⋮ $file = trailingslashit(WC_LOG_DIR) .$handle; ⋮ unlink($file);
這裡的問題就在於,檔名($handle)會被新增到日誌目錄(wp-content/wc-logs/)後,然後傳遞給unlink()函式。在設定“$handle../../plugins/woocommerce-3.4.5/woocommerce.php”時,檔案wp-content/wc-logs/../../plugins/woocommerce-3.4.5/woocommerce.php將會被刪除,並導致WooCommerce被禁用。
總結
在之前的 文章 中,我們介紹過如何去利用WordPress的檔案刪除漏洞了,並且演示瞭如何將檔案刪除提升為遠端程式碼執行。這篇文章主要介紹的是WordPress外掛中的檔案刪除漏洞,而這些漏洞將允許攻擊者在使用了meta許可權的WordPress站點上實現提權。值得一提的是,這種設計缺陷短時間內是無法修復的,而且檔案刪除漏洞很常見,甚至是WordPress的核心本身也存在這種漏洞。除此之外,在某些特定環境下檔案刪除漏洞還可以配合Phar反序列化漏洞一起使用。
* 參考來源: ripstech ,FB小編Alpha_h4ck編譯,轉載請註明來自FreeBuf.COM