當前位置:
首頁 > 新聞 > WordPress插件WooCommerce任意文件刪除漏洞分析

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


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

如何使用Metasploit進行汽車安全性測試?
2019年應當認真對待的6大移動安全威脅

TAG:FreeBuf |