WordPress插件WooCommerce任意文件刪除漏洞分析
前言
近期,研究人員在WordPress的許可權處理機制中發現了一個安全漏洞,而這個漏洞將允許WordPress插件實現提權。其中一個典型例子就是WooCommerce,該插件是目前最熱門的一款電子商務插件,並且擁有400萬+的安裝量。簡而言之,這個漏洞將允許商鋪管理員刪除目標伺服器上的特定文件,並接管管理員帳號。
漏洞影響
我們檢測並上報了WooCommerce中存在的一個文件刪除漏洞,這個漏洞已經在WooCommerce的v3.4.6版本中成功修復。任意文件刪除漏洞在大多數情況下並不會被認為是一種高危漏洞,因為攻擊者能做的只有通過刪除網站的index.php文件來實現拒絕服務攻擊。這篇文章主要介紹的是如何刪除WordPress伺服器中的特定文件,並禁用安全檢測,最終導致目標網站被完全接管。實際上,導致該漏洞存在的本質原因是WordPress的許可權系統設計存在缺陷,並影響到了400萬+的WooCommerce商鋪。
接下來,攻擊者只需要拿到商鋪管理員的用戶角色即可。商鋪管理員,能夠管理訂單、產品和客戶,這種訪問許可權可以通過XSS漏洞或網路釣魚攻擊來獲得。當漏洞成功利用之後,商鋪管理員將能夠接管任何一個管理員帳號,然後在伺服器上執行代碼。
漏洞演示
視頻地址: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-log/)後,然後傳遞給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
※如何使用Metasploit進行汽車安全性測試?
※2019年應當認真對待的6大移動安全威脅
TAG:FreeBuf |