WordPress 5.0.0遠端程式碼執行漏洞預警
在2019年2月19日,國外安全人員在部落格中的披露了一則Wordpress 5.0.0版本遠端程式碼執行漏洞。該漏洞本質上是由一個目錄遍歷漏洞以及一個本地檔案包含漏洞組合利用而導致的一個遠端程式碼執行漏洞。當攻擊者獲取到WordPress站點具有一定訪問許可權的賬戶後,即可利用該漏洞在底層伺服器上執行任意PHP程式碼,從而實現完全遠端接管伺服器的目的。
WordPress元件介紹
WordPress是使用PHP語言開發的CMS系統,是網路上最受歡迎的CMS之一,也是一款個人部落格系統。根據w3tech的資料顯示,約有30%的網站在使用它,使用者可以在支援PHP和MySQL資料庫的伺服器上架設屬於自己的網站或者使用自己的部落格。
WordPress官方支援中文版,同時有愛好者開發的第三方中文語言包,如wopus中文語言包。WordPress擁有成千上萬個各式外掛和不計其數的主題模板樣式。
漏洞描述
WordPress 5.0.0遠端程式碼執行漏洞產生的背景是利用WordPress檔案上傳的一個特性。當WordPress上傳一張圖片時,首先這張圖片會被放置到uploads目錄下(wp-content/uploads),同時WordPress還將建立對資料庫中影象的內部應用,以來跟蹤上傳檔案的源資訊,例如影象的上傳時間或者影象的所有者。該源資訊將會被作為Post
Meta條目儲存在資料庫中。這些資訊都被儲存在wp_postmeta表中,資料是以鍵值對形式儲存。如下圖:
如果之後使用者需要修改或者使用對應ID的檔案,WordPress將查詢匹配的_wp_attached_file源條目並使用它的值以便在wp-content/uploads目錄中查詢到該檔案。
該漏洞通過對Post Meta條目的路徑遍歷以及利用WordPress主題庫進行本地檔案包含,最終覆蓋掉一個特定的Post Meta條目,可以實現將原本檔案的Post Meta繫結到一個惡意檔案上,導致遠端程式碼執行漏洞。
漏洞分析
1. 漏洞核心原理“Post Meta”的條目可以被覆蓋
在WordPress 4.9.9 之前的版本以及WordPress 5.0.1之前的版本,WordPress檔案上傳產生的Post Meta的所有條目皆可被修改,並且他們的value值可以任意重置。當一張圖片被更新的時候,將會呼叫/wp-admin/include/post.php中的edit_post()函式。
我們可以通過edit_post()函式向資料庫注入任意Post Meta條目。由於系統未對Post Meta條目的修改進行檢測,因此攻擊者可以更新_wp_attached_file元條目並將其設定為任何值。這不會重新命名任何檔案,它只會更改WordPress在編輯影象時要查詢的檔案。這一點將導致稍後的路徑遍歷。
2. 通過修改“Post Meta”的來實現路徑遍歷
路徑遍歷發生在使用者裁剪影象時呼叫的wp_crop_image()函式中。
該函式將影象的ID帶到crop($attachment_id)中,並從資料庫中獲取相應的Post
Meta條目_wp_attached_file的值。由於之前edit_post()存在的缺陷,$src_file可以設定為任何值。由於缺陷edit_post(),$src_file可以設定為任何值。
在下一步中,WordPress必須確保影象實際存在並載入它。WordPress有兩種載入給定影象的方法。第一種是簡單地查詢目錄中Post Meta條目中_wp_attached_file提供的檔名wp-content/uploads。
如果該方法失敗,WordPress將嘗試從其自己的伺服器下載影象作為後備。為此,它將生成一個下載URL,該URL包含wp-content/uploads目錄的URL 和儲存在Post Meta條目中_wp_attached_file的檔名。
舉一個具體的例子:如果儲存在Post Meta條目中_wp_attached_file 的值是evil.jpg,那麼WordPress將首先嚐試檢查檔案wp-content/uploads/evil.jpg是否存在。如果沒有,它會嘗試從以下URL下載檔案: https://targetserver.com/wp-content/uploads/evil.jpg 。
嘗試下載影象而不是在本地查詢影象的原因是某些外掛在訪問URL時會動態生成影象。
WordPress將簡單地將上傳目錄和URL與$src_file的使用者輸入連線起來。一旦WordPress成功載入了有效影象wp_get_image_editor(),它將裁剪影象。
裁剪結束後,WordPress會將裁剪後的影象儲存迴文件系統(無論是否下載)。生成的檔名將是$src_file由get_post_meta()攻擊者控制的返回檔案。對結果檔名字串進行的唯一修改是在檔案的基本名稱加字首cropped-。為了遵循示例evil.jpg,生成的檔名將是cropped-evil.jpg。
然後,WordPress通過wp_mkdir_p()在結果路徑中建立不存在的任何目錄。
最後使用save()方法將其最終寫入檔案系統。該save()方法還不對給定的檔名執行路徑遍歷檢查。
3. 最終利用本地檔案包含來實現遠端程式碼執行
根據之前的路徑遍歷,我們可以利用主題系統的本地檔案包含來最終實現遠端程式碼執行。每個WordPress主題只是一個位於WordPress目錄中的wp-content/themes目錄,為不同的案例提供模板檔案。例如,如果部落格的訪問者想要檢視部落格帖子,則WordPress會在當前活動主題的目錄中查詢一個post.php檔案。如果它找到了對應模板,那將包含該模板。
為了新增額外的自定義層,可以為某些帖子選擇自定義模板。為此,使用者必須將資料庫中的Post Meta條目的_wp_page_template設定為自定義檔名。這裡唯一的限制是要包含的檔案必須位於當前活動主題的目錄中。
通常,使用者對於當前活動主題的目錄無法訪問此目錄,也無法上傳該檔案。但是,通過使用上述路徑遍歷,就可以將惡意製作的影象植入當前使用的主題的目錄中。然後攻擊者可以建立一個新帖子也使用上述的路徑遍歷錯誤,最終能夠夠更新 Post Meta條目中的_wp_attached_file,以便可以包含該圖片。通過將PHP程式碼注入圖片,攻擊者就可以遠端執行任意程式碼。
影響範圍
目前據統計,在全球範圍內對網際網路開放 Wordpress網站的資產數量多達12833569臺,其中歸屬中國地區的受影響資產數量為18萬以上。
目前受影響的WordPress版本:
Wordpress 5.0.0
修復建議
Wordpress官方已經在 WordPress 5.0.1更新了安全補丁,使用者可以更新至WordPress 5.0.1之後的版本:
https://wordpress.org/download/
參考連結
https://blog.ripstech.com/2019/wordpress-image-remote-code-execution/