WordPress 5.0.0 遠程代碼執行漏洞安全通告
發布時間 2019-02-21漏洞編號和級別
CVE編號:暫無,危險級別:高危, CVSS分值:官方未評定
影響范圍
受影響版本:
WordPress 5.0.0
漏洞概述
2月19日,國外安全人員在博客中公開了WordPress中存在的一個遠程代碼執行漏洞,該漏洞已經在WordPress core中隱藏了6年未被發現。
該漏洞本質上是由一個目錄遍歷漏洞以及一個本地文件包含漏洞組合利用而導致的一個遠程代碼執行漏洞。
當攻擊者獲取到WordPress站點author及以上權限的賬戶后,即可利用該漏洞在底層服務器上執行任意PHP代碼,從而實現完全遠程接管服務器的目的。
因WordPress 4.9.9和5.0.1其他安全補丁所致,文件包含漏洞僅有5.0.0單一版本可利用,而路徑遍歷漏洞仍可使用且當前仍未打補丁。任何安裝了此插件的WordPress站點都會錯誤地處理Post Meta條目,這樣仍然可以進行利用。
根據WordPress的下載頁面,超過33%的網站使用該軟件??紤]到插件可能會重新引入這個問題,并考慮到過時的站點等因素,受影響的安裝數量仍然是數百萬。
漏洞細節
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. 實現RCE
綜上,可以確定哪個文件被加載到圖像編輯器中(因未進行處理)。但是,如果文件不是有效圖像,圖像編輯器將會拋出異常。故而,只能在上傳目錄之外裁剪圖像。
那么如果未找到所需圖像,WordPress會嘗試下載,這就導致了RCE。
設置_wp_attached_file為evil.jpg?shell.php,這將導致對以下URL發出HTTP請求:https://targetserver.com/wp-content/uploads/evil.jpg?shell.php。此請求將返回有效的圖像文件,因為?在此上下文中忽略了所有內容。生成的文件名將是evil.jpg?shell.php。
雖說save()圖像編輯器的方法不會檢查是否存在路徑遍歷,但它會將正在加載的圖像的mime類型的擴展名附加到生成的文件名中。在這種情況下,結果文件名將是evil.jpg?cropped-shell.php.jpg。這使得新創建的文件再次無害。
但是,仍可以通過使用諸如的Payload將生成的圖像植入任何目錄evil.jpg?/../../evil.jpg。
4. 利用主題目錄中的路徑遍歷-本地文件包含
根據之前的路徑遍歷,我們可以利用主題系統的本地文件包含來最終實現遠程代碼執行。每個WordPress主題只是一個位于WordPress目錄中的wp-content/themes目錄,為不同的案例提供模板文件。例如,如果博客的訪問者想要查看博客帖子,則WordPress會在當前活動主題的目錄中查找一個post.php文件。如果它找到了對應模板,那將包含該模板。
為了添加額外的自定義層,可以為某些帖子選擇自定義模板。為此,用戶必須將數據庫中的Post Meta條目的_wp_page_template設置為自定義文件名。這里唯一的限制是要包含的文件必須位于當前活動主題的目錄中。
通常,用戶對于當前活動主題的目錄無法訪問此目錄,也無法上傳該文件。但是,通過使用上述路徑遍歷,就可以將惡意制作的圖像植入當前使用的主題的目錄中。然后攻擊者可以創建一個新帖子也使用上述的路徑遍歷錯誤,最終能夠更新Post Meta條目中的_wp_attached_file,以便可以包含該圖片。通過將PHP代碼注入圖片,攻擊者就可以遠程執行任意代碼。
修復建議
Wordpress官方已經在 WordPress 5.0.1更新了安全補丁,用戶可以更新至WordPress 5.0.1之后的版本:https://wordpress.org/download/。
參考鏈接
https://blog.ripstech.com/2019/wordpress-image-remote-code-execution/