首頁  >  文章  >  運維  >  WordPress外掛WooCommerce任意檔案刪除漏洞怎麼解決

WordPress外掛WooCommerce任意檔案刪除漏洞怎麼解決

WBOY
WBOY轉載
2023-05-13 18:16:061542瀏覽

技術細節

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外掛WooCommerce任意檔案刪除漏洞怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除