作者:天融信阿爾法實驗室
原文鏈接:https://mp.weixin.qq.com/s/W4PbykSWJ1f1c-loOjrclg
0x00 前言
ThemeREX是一家專門出售商業WordPress主題的公司。ThemeREX Addons插件為ThemeREX公司開發的預裝在所有ThemeREX商業主題中用來幫助其用戶設置新站點和控制不同的主題的一款插件。根據相關預測,該插件預裝在超過44000個網站上。

0x01 漏洞描述
WordPress ThemeREX Addons 2020-03-09之前版本中存在安全漏洞。未經授權的攻擊者可利用該漏洞在后臺添加一個管理員賬號、或是查看所有賬號信息等操作。
0x02 漏洞分析
根據相關披露,漏洞應該存在于plugin.rest-api.php文件中
我們首先來看一下\wp-content\plugins\trx_addons\includes\plugin.rest-api.php文件中的代碼
位于該文件40行處,存在一處trx_addons_rest_get_sc_layout方法,如下圖

在該方法中,存在一處明顯的漏洞點,見下圖代碼塊

接下來我們根據這段代碼詳細分析下。我們首先來觀察一下下圖53行紅框處

位于上圖紅框處,可見程序從請求中直接獲得參數,并將請求中的參數鍵值對賦值與params數組。這將導致params數組可控
緊接著,程序判斷$params數組中是否存在名為sc的鍵名,見下圖紅框處

若該鍵名存在,經過字符替換處理后將其值賦與sc變量。
簡單來說,這里的sc變量可以通過請求中的sc參數進行傳遞。
隨后,程序通過function_exists判斷$sc變量對應的方法是否存在,見下圖

如果sc變量中對應的方法存在,程序將params數組作為參數列表傳入該方法執行。
至此,漏洞的觸發點我們已經分析完畢。接下來我們需要尋找一下調用鏈
由于漏洞觸發點位于trx_addons_rest_get_sc_layout方法中,我們需要分析一下如何構造請求以觸發這個漏洞。
仍然是位于\wp-content\plugins\trx_addons\includes\plugin.rest-api.php文件中,有著如下代碼

通過上圖可見,程序通過add_action方法將trx_addons_rest_register_endpoints函數掛接到rest_api_init動作上。
我們查看一下rest_api_init這個動作

通過上圖描述不難看出: rest_api_init動作將會在API請求發送到服務器后,服務器初始化處理API請求時觸發。將trx_addons_rest_register_endpoints函數掛接到rest_api_init動作上,當有API請求發送到后臺處理時,trx_addons_rest_register_endpoints方法將會被加載。
繼續跟蹤后續代碼

在trx_addons_rest_register_endpoints方法中通過register_rest_route方法注冊了一個自定義接口,見上圖紅框處。
這里簡單介紹一下register_rest_route方法:
WordPress官方核心代碼提供了一套WP_REST_API接口,但是實際開發以及使用過程中難免會出現官方API接口滿足不了實際需求的狀況。為此WordPress提供了register_rest_route方法用于自定義注冊WP REST API接口。
register_rest_route方法參數如下

在介紹完register_rest_route方法后,我們回歸漏洞代碼,分析此處register_rest_route方法注冊的API接口

通過上圖第一個紅框處namespace以及route屬性值可知:該接口路由為trx_addons/v2/get/sc_layout;通過第二個紅框methods屬性值可知:該接口可以通過GET\POST方法訪問;通過第三個紅框callback屬性值可知:該接口回調函數為漏洞觸發點trx_addons_rest_get_sc_layout方法。通過上述信息,我們可以構造出通往漏洞觸發點的請求。
除了通過分析代碼來請求這種方法外,我們還可以通過wordpress還提供的接口來方便快捷的查看所有注冊的API接口信息。
訪問127.0.0.1/wordpress/wp-json/ 見下圖

wp-json這個目錄會將wordpress中所有注冊的API接口信息展示出來。
通過頁面中展示的API列表,我們可以看見/trx_addons/v2/get/sc_layout路由信息
展開/trx_addons/v2/get/sc_layout路由 見下圖

上圖為展開后的詳細接口信息,在這里我們可以看到該接口允許的methods以及url地址
值得注意的是:通過分析 /trx_addons/v2/get/sc_layout接口代碼時可發現,ThemeREX Addons插件并沒有在代碼中使用current_user_can等方法對接口進行權限校驗。也就是說,未經身份驗證的用戶也可以訪問該接口從而觸發漏洞
0x03 漏洞利用
通過上文的分析可知,我們可以通過請求來控制待執行的函數名,并可以通過一個數組對該函數傳參。因此我們需要找到一個可以利用的PHP或wordpress函數,該函數需要滿足可以接收并處理數組類型參數
利用一:通過 wp insert_user 新建管理員賬號
構造如下鏈接:
不需要進行登錄操作,直接訪問以上鏈接即可成功利用。
根據上文漏洞分析一章可知,該鏈接最終會觸發trx_addons_rest_get_sc_layout方法,見下圖

此時上圖中的sc參數值對應payload中sc值,為wp_insert_user
此時params數組值如下圖

程序將params數組作為參數傳入wp_insert_user方法并執行wp_insert_user方法。
wp_insert_user方法可以為wordpress程序添加一個指定權限的用戶,該方法接收一個數組作為參數滿足觸發漏洞的要求,見下圖

wp_insert_user方法參數說明如下

由此一來,wordpress中將會增添一個administrator權限的名為TEST的用戶,如下圖

利用新創建的管理員賬號可以完成進一步攻擊:例如通過修改wordpress模板等操作,在wordpress中寫入后門文件。
利用二:通過wp_dropdown_users 查看所有賬號信息
構造如下鏈接:
http://127.0.0.1/wordpress/wp-json/trx_addons/v2/get/sc_layout?sc=wp_dropdown_users&show=user_login
wp_dropdown_users為wordpress提供的用來查詢用戶信息的函數

wp_dropdown_users同樣滿足可以接收一個數組作為參數的需求,wp_dropdown_users參數說明如下

通過wp_dropdown_users接口可以泄露wordpress賬號信息。該操作同樣不需要任何權限
上述payload中指定show參數值為user_login,這樣可以查看wordpress所有用戶名,見下圖

show參數值可以設置為user_pass來進行查看存儲在數據庫中加密后的密碼,見下圖
show參數值可以設置為user_email來進行查看郵箱,見下圖

0x04 總結
為了解決安全問題,ThemeREX選擇將受影響的plugin.rest-api.php文件完全刪除。plugin.rest-api.php文件是為了提供與Gutenberg插件的兼容性而設計,但在目前版本中Gutenberg插件已完全集成為WordPress核心。因此plugin.rest-api.php文件不再被需要,刪除該文件不會影響到用戶的正常使用。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1151/
暫無評論