新曝WordPress REST API內容注入漏洞詳解
近日,來自Sucuri的研究人員發現WordPress存在重大漏洞,漏洞在于WordpressREST API,成功利用該漏洞可刪除頁面或修改頁面內容。官方很快發布了升級版Wordpress,但很多管理員沒有及時升級,以至于被篡改的網頁從最初的幾千一路飆升到了150萬,在此也提醒各位管理員盡快升級。
一、漏洞詳情
1. 漏洞信息:
WordPress是一個以PHP和MySQL為平臺的自由開源的博客軟件和內容管理系統。在4.7.0版本后,REST API插件的功能被集成到WordPress中,由此也引發了一些安全性問題。近日,一個由REST API引起的影響WorePress4.7.0和4.7.1版本的漏洞被披露,該漏洞可以導致WordPress所有文章內容可以未經驗證被查看,修改,刪除,甚至創建新的文章,危害巨大。
2. 漏洞影響版本:
WordPress4.7.0、WordPress 4.7.1
3. 復現環境:
Apache 2.4
PHP 7.0
WordPress4.7.1
4.復現過程:
(1) 安裝WordPress并配置REST API
① 配置Apache+PHP+Mysql的運行環境,下載含有漏洞版本的WordPress (https://wordpress.org/wordpress-4.7.1.tar.gz)并安裝。
② 加載Apache的rewrite模塊。
在Apache的配置文件中添加
LoadModule rewrite_module/usr/lib/apache2/modules/mod_rewrite.so
并在主配置文件中設置對應的WEB目錄的AllowOverride為All
③設置WordPress站點為固定鏈接
在Settings->Permalinks中的Common Settings設置為非Plain模式。例如下圖,我們設置為Day and name。
(2) 漏洞復現
①根據REST API文檔,修改文章內容的數據包構造如下:
可以看到,不帶任何驗證信息會提示不允許編輯文章
②構造可利用的數據包:
當url為/wp-json/wp/v2/posts/1?id=1a時,可以看到,已經成功跳過驗證看到文章內容了。
二、漏洞發現之技術細節
Sucuri研究人員的漏洞發現過程始于./wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
這里有幾件事值得注意。注冊的路由用于用數字填充ID請求參數。比如,如果向/wp-json/wp/v2/posts/1234 –發送請求,則ID參數被設置為1234。
這種行為本身不失為一種防止攻擊者編制惡意ID值的好方法,但是當查看REST API如何管理訪問時,研究人員很快發現其給予$_GET 和$_POST值的優先級高于路由的正則表達式生成的值。這使攻擊者可以發送/wp-json/wp/v2/posts/1234?id=12345helloworld這樣的請求,這樣會將12345helloworld分配到ID參數,這樣包含的不僅僅是數字。
研究人員進一步查看了各種回調(上面截圖中),其中一個引起了研究人員的注意:update_item及其權限檢查方法:update_item_permissions_check。
簡言之,它將字母數字ID值直接傳遞給了get_post()函數。該函數通過檢查帖子是否實際存在以及用戶是否有權編輯此帖來驗證請求。研究人員認為這種審驗請求的方式較為奇特。如果我們發送一個沒有相應帖子的ID,我們可以通過權限檢查,并被允許繼續執行對update_item方法的請求。
出于對是什么導致get_post()無法找到帖子(除ID不存在外)的好奇,研究人員意識到其使用wp_posts中的get_instance()靜態方法來抓取帖子。
從代碼中可以看出,對于不是由純數字字符組成的任何輸入,其基本上會失敗 – 因此123ABC會失敗。
對于攻擊者,這意味著WordPress(將其視作具有足夠權限編輯此帖的用戶)會運行update_item方法。
我們認為有必要查看該方法的作用。
截圖中有一個微妙但非常重要的細節——WordPress在將ID參數傳遞給get_post前先將其轉換為一個整數。鑒于PHP進行類型比較和轉換的方式,這是一個問題。比如,你會發現以下代碼片段會返回123:
這導致了非常危險的情形,即攻擊者可以提交/wp-json/wp/v2/posts/123?id=456ABC這樣的請求來對ID為456的帖子進行篡改。
鑒于此類型欺騙問題,攻擊者便可篡改受害者網站上的任何帖子或頁面的內容。這樣他們便可以添加插件特定的短代碼來利用漏洞(原本僅限于貢獻者)、使用SEO垃圾郵件活動感染網站內容或注入廣告,等等。甚至可以很容易地執行PHP代碼——取決于網站上啟用的插件。
結語
這是一個可以以不同方式利用的嚴重漏洞,如果您的網站尚未啟用自動更新,請盡快更新。