WordPress是網絡上最受歡迎的CMS系統。據w3tech統計,約有30%的網站運行了該系統。該系統的應用是如此廣泛,難免會成為網絡犯罪分子攻擊目標。在這篇博文中,我們將為讀者介紹WordPress內核中的一個任意文件刪除漏洞,這個漏洞可能會導致攻擊者執行任意代碼。早在7個月前,我們就向WordPress安全團隊報告了這個漏洞,但到目前為止,該漏洞仍然沒有得到修補。自初次報告(該報告既沒有提供任何補丁,也沒有給出具體的修復計劃)至今,已經過了漫長的時間,但是仍然沒有看到任何的修復跡象,所以,我們決定將這個漏洞公之于眾,以督促其盡快采取行動。
誰會受到該漏洞的影響
在撰寫本文時,該漏洞仍然沒有補丁可用。并且,所有WordPress版本,包括當前的4.9.6版本在內,都面臨這個漏洞的威脅。
要想利用下面討論的這個漏洞,攻擊者需要事先獲得編輯和刪除媒體文件的權限。因此,該漏洞可用于通過接管角色與作者一樣低的帳戶或通過利用其他漏洞/錯誤配置來實現提權。
危害:攻擊者能夠利用它做什么
利用這個漏洞,攻擊者能夠刪除WordPress安裝的任何文件(+ PHP服務器上的任何其他文件,即PHP進程有權刪除的,盡情刪就是了)。除了刪除整個WordPress安裝的可能性(如果當前沒有備份可用的話,將會導致災難性后果)之外,攻擊者還可以利用任意文件刪除功能繞過一些安全措施,繼而在Web服務器上執行任意代碼。更確切地說,攻擊者可以刪除下列文件:
.htaccess:通常情況下,刪除該文件不會有任何安全影響。但是,在某些情況下,.htaccess文件包含與安全相關的安全約束(例如,對某些文件夾的訪問限制),因此,刪除此文件后,相應的安全限制將會隨之消失。
index.php文件:通常情況下,一些空的index.php文件被放置到各個目錄中,以防止相應目錄中的內容被列出。刪除這些文件后,攻擊者就能夠列出受該方法保護的目錄中的所有文件。
wp-config.php:刪除這個WordPress安裝文件會在下次訪問該網站時觸發WordPress安裝過程。這是因為wp-config.php包含數據庫憑證,如果沒有它,WordPress的就會采取尚未安裝之前的操作。攻擊者可以刪除該文件,然后,使用為管理員帳戶選擇的憑據進行安裝,最后在服務器上執行任意代碼。
大神演示視頻:
漏洞詳情
將未經過濾的用戶輸入傳遞給文件刪除函數時,就可能觸發任意文件刪除漏洞。對于PHP來說,當調用unlink()函數并且可能影響部分或整個參數$filename的用戶輸入沒有進行適當的過濾時,就可能出現這種情況;其中,該參數表示表要刪除的文件的路徑。
在WordPress Core中,引發這個漏洞的代碼位于wp-includes/post.php文件中:
[php]function wp_delete_attachment( $post_id, $force_delete = false ) {
?
$meta = wp_get_attachment_metadata( $post_id );
?
if ( ! empty($meta['thumb']) ) {
// Don't delete the thumb if another attachment uses it.
if (! $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE %s AND post_id <> %d", '%' . $wpdb->esc_like( $meta['thumb'] ) . '%', $post_id)) ) {
$thumbfile = str_replace(basename($file), $meta['thumb'], $file);
/** This filter is documented in wp-includes/functions.php */
$thumbfile = apply_filters( 'wp_delete_file', $thumbfile );
@ unlink( path_join($uploadpath['basedir'], $thumbfile) );
}
}
?
}[/php]
在上面顯示的wp_delete_attachement()函數中,$ meta ['thumb']的內容未經任何過濾處理就直接傳遞給unlink()調用了。這段代碼的用途是,在刪除圖像的同時,一起將其縮略圖刪掉。在WordPress中,通過媒體管理器上傳的圖像將作為attachement類型的文章對待。值$meta ['thumb']是從數據庫中檢索的,在數據庫中,它保存在表示圖像的文章的自定義字段中。因此,在從數據庫檢索后,到傳遞給關鍵函數unlink()期間,并沒有對表示縮略圖文件名的值進行任何過濾或檢查。如果該值在保存到數據庫之前也沒有經過任何過濾,或過濾不充分的話——我們將在下一個代碼清單中看到這種情況——就可能出現一個兩階段的任意文件刪除漏洞。
[php]/wp-admin/post.php
?
switch($action) {
?
case 'editattachment':
check_admin_referer('update-post_' . $post_id);
?
// Update the thumbnail filename
$newmeta = wp_get_attachment_metadata( $post_id, true );
$newmeta['thumb'] = $_POST['thumb'];
wp_update_attachment_metadata( $post_id, $newmeta );
?[/php]
后面的代碼片段(位于/wp-admin/post.php中)展示了隸屬于附件的縮略圖的文件名是如何保存到數據庫的。用戶輸入從$_POST ['thumb']中取出后,直到通過wp_update_attachment_metadata()保存到數據庫這段過程中,系統沒有對這些內容進行適當的安全過濾,因此,也就無法確保該值的確為正在編輯的附件的縮略圖。此外,由于$_POST ['thumb']的值可以將任意文件的路徑保存到WordPress上傳目錄相對路徑中,所以當附件被刪除時,該文件也會被刪除,如前面的代碼所展示的那樣。
臨時補丁
在撰寫本文的時候,WordPress中的這個漏洞仍未得到修復。正因為如此,我們已經開發了一個臨時補丁供大家使用。通過將該補丁添加到當前使用的WordPress主題/子主題的functions.php文件中,就可以將該補丁集成到現有的WordPress程序中。
[php]add_filter( 'wp_update_attachment_metadata', 'rips_unlink_tempfix' );
function rips_unlink_tempfix( $data ) {
if( isset($data['thumb']) ) {
$data['thumb'] = basename($data['thumb']);
}
return $data;
}[/php]
實際上,該補丁的工作原理就是,“鉤住”wp_update_attachement_metadata()調用,對提供給thumb的數據進行安全過濾,確保其中不包含任何使路徑遍歷成為可能的內容,這樣一來,攻擊者就無法刪除與安全相關的文件了。
當然,這里提供的補丁只是臨時性的,主要用來防止用戶收到惡意攻擊。由于我們無法兼顧WordPress插件的所有可能的向后兼容性問題,所以,建議您謹慎地對WordPress文件進行任何修改。
結束語
在這篇文章中,我們介紹了WordPress Core中的一個任意文件刪除漏洞,任何具有作者權限的用戶都能夠利用該漏洞來完全接管WordPress網站,繼而在服務器上執行任意代碼。盡管該漏洞去年就報告給了WordPress安全團隊,但截止撰寫本文時為止,他們仍然沒有對該漏洞進行修復。
為了提高對這個漏洞的認識,我們決定發布一些細節和相應的補丁。使用我們的安全分析方法,大家可以輕松發現該漏洞,我們確信這個問題已經為許多研究人員所了解。盡管用戶帳戶的要求對該漏洞的影響規模有一些影響,但共享多個用戶帳戶的站點,應該及時安裝相應的安全補丁。
原文:https://blog.ripstech.com/2018/wordpress-file-delete-to-code-execution/
新主題官方微信公眾號
掃碼關注新主題(XinTheme)官方公眾號,本站動態早知道。
發布本站最新動態(新主題發布、主題更新)和WordPress相關技術文章。