當前位置:
首頁 > 新聞 > 通過Post Types進行WordPress提權

通過Post Types進行WordPress提權

研究人員發現WordPress創建博客的方式存在邏輯漏洞,攻擊者利用該漏洞可以訪問只有管理員才可以訪問的特徵。這會導致WordPress內核產生存儲型XSS和對象注入等漏洞。

影響

WordPress是博客軟體的核心,允許用戶創建和發布博客。隨著時間的推移,產生了不同的post類型,比如頁面和圖像、視頻等。插件可以註冊新的post類型,比如產品和聯繫人表單。根據插件註冊的post type的類型,可以提供不同的特徵。比如通訊錄form插件可能允許用戶用文件上傳域來常見一個聯繫人form。創建聯繫人form的用戶可以定義允許上傳的文件類型。惡意用戶可以允許上傳php文件,然後在站點上執行任意代碼。但這並不是一個問題,因為插件可以限制對post類型的訪問。下面要講的許可權提升就允許低許可權用戶繞過wordpress應用的安全檢查,並創建任意類型的post,誤用定製的post類型的特徵。最終導致WordPress core產生存儲型XSS和對象注入漏洞。根據安裝的插件,還有更嚴重的漏洞可以利用。

技術背景

為註冊新的post類型,插件必須要用新的post類型和一些meta信息來調用register_post_type()。

為什麼定製的post類型是安全的?

每個post類型都有自己的編輯頁面,比如 example.com/wordpress/wp-admin/?page=example_post_type_editor

圖1: post type為聯繫人表單,只有管理員可以訪問該頁面

如果插件開發者決定只有管理員可以使用插件的post類型,那麼就可以檢查如果用戶是不是管理員,然後執行。

WordPress post提交

雖然所有註冊的post類型都有自己的編輯頁,但是都可以用WordPress post提交API,用WordPress函數wp_write_post()插入和更新post。該函數的輸入類型為$_POST[『post_type』], $_POST[『post_title』], $_POST[『post_content』],因此知道如何處理post。

在WordPress post提交過程中,WordPress必須首先了解用戶想要編輯已有的post還是創建一個新的post。因此WordPress要檢查用戶是否發送過該post的ID。WordPress允許$_GET[『post』]或$_POST[『post_ID』]。如果ID存在,用戶就可以用已有的ID去編輯post;如果ID不存在,就是要創建新的post。

然後WordPress要確定用戶在創建那種post類型。如果post ID已經發送了,WordPress就會從wp_posts table中的資料庫中取出post_type列。如果用戶想要創建新的post,目標post類型應該是 $_POST[『post_type』]。

WordPress在知道了用戶要創建或編輯的post的post類型後,會檢查用戶是否有許可權使用該post類型。這一過程是通過一個只能從編輯頁獲得的隨機數來確認的。用隨機數來確認的代碼如下:

如果$post_type 是post,$nonce_name就是add-post。如果$post_type是example_post_type, $nonce_name就是add-example_post_type。隨機數只能由可以創建這些post類型的用戶獲取,因為只有這些用戶可以訪問該post類型的編輯頁,這也是唯一嚴重獲得隨機數的方法。

WordPress的失敗

雖然低許可權的攻擊者不能訪問該頁面和示例post類型的隨機數,但攻擊者仍然可以獲取正常post的隨機數。也就是說攻擊者可以講post ID設置為有post type post的post,這樣就可以繞過隨機數驗證。

但是該方法只能更新已有的post,無法覆寫新的post的post_type。如果post ID已經存在了,WordPress就會在更新post之前從參數中移除post_type。

但WordPress只會移除設置了$_POST[『post_ID』]的$post_type參數。攻擊者就可以通過 $_POST[『post_ID』]或$_GET[『post』]發送一個post ID。如果攻擊者通過$_GET[『post』]發送了post ID:

1、WordPress就會看到一個設置了的post ID,然後從資料庫中拿出其post type。

2、WordPress會檢查攻擊者是否為該post type發送了有效的隨機數。

3、通過隨機數檢查後,WordPress會決定應該調用wp_update_post()還是wp_insert_post()。這一過程是通過設置$_POST[『post_ID』]實現的。如果設置了,就調用wp_update_post並移除$post_type參數,這樣攻擊者就不能覆寫post type了。如果沒有設置,WordPress就調用wp_insert_post(),並用$_POST[『post_type』]作為新post的post type。

因為WordPress沒有檢查第3步的$_GET[『post』],攻擊者可以繞過隨機數驗證,並且創建一個任意post type的新post。

利用:通過Contact Forms 7讀取wp-config.php

因此,低許可權的用戶也可以濫用該bug來創建任意類型的post,對網站的影響依賴於安裝的插件以及安裝的插件提供的post type的特徵。

比如,攻擊者可以以contributor的角色濫用WordPress主流插件Contact Form 7的特徵來讀取目標網站wp-config.php文件的內容。該文件中含有資料庫憑證和加密密鑰。

在Contact Forms 7 v5.0.3以上版本中,可以設置本地文件附件。管理員創建了聯繫人表單。並講用戶輸入的所有數據都發送給管理員。

也就是說攻擊者簡單創建一個新的聯繫人表單,設置本地文件附件到../wp-config.php,設置郵箱到數據要發送的郵箱,提交表單、然後讀取重要WordPress文件的內容。

補丁

XMLRPC和REST API

因此可以通過WordPress的XMLRPC和REST API創建post,這並不會執行特定post type的隨機數驗證。但是通過這些API創建post,但是不能設置任意的post meta field。插件中的大多數漏洞都是可以通過設置post meta域進行利用的。

總結

攻擊者可以以低許可權的用戶角色來創建本來沒有許可權訪問的post type的post。攻擊者因此可以訪問本來只有管理員才可以訪問的特徵。研究人員在WordPress最流行的5個插件中供發現了2個漏洞。研究人員估計有上千個插件存在漏洞。而且WordPress的內部post type還被發現有存儲型XSS和對象注入漏洞,存儲型XSS可以通過點擊劫持攻擊觸發,一旦JS執行後,整個網站都會被接管。


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

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


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

2018年度弱密碼出爐,看你用了哪個
如何利用Mozilla Firefox的合法功能執行操作系統命令

TAG:嘶吼RoarTalk |