WordPress是網(wǎng)絡(luò)上最受歡迎的CMS系統(tǒng)。據(jù)w3tech統(tǒng)計(jì),約有30%的網(wǎng)站運(yùn)行了該系統(tǒng)。該系統(tǒng)的應(yīng)用是如此廣泛,難免會(huì)成為網(wǎng)絡(luò)犯罪分子攻擊目標(biāo)。在這篇博文中,我們將為讀者介紹WordPress內(nèi)核中的一個(gè)任意文件刪除漏洞,這個(gè)漏洞可能會(huì)導(dǎo)致攻擊者執(zhí)行任意代碼。早在7個(gè)月前,我們就向WordPress安全團(tuán)隊(duì)報(bào)告了這個(gè)漏洞,但到目前為止,該漏洞仍然沒(méi)有得到修補(bǔ)。自初次報(bào)告(該報(bào)告既沒(méi)有提供任何補(bǔ)丁,也沒(méi)有給出具體的修復(fù)計(jì)劃)至今,已經(jīng)過(guò)了漫長(zhǎng)的時(shí)間,但是仍然沒(méi)有看到任何的修復(fù)跡象,所以,我們決定將這個(gè)漏洞公之于眾,以督促其盡快采取行動(dòng)。
誰(shuí)會(huì)受到該漏洞的影響
在撰寫(xiě)本文時(shí),該漏洞仍然沒(méi)有補(bǔ)丁可用。并且,所有WordPress版本,包括當(dāng)前的4.9.6版本在內(nèi),都面臨這個(gè)漏洞的威脅。
要想利用下面討論的這個(gè)漏洞,攻擊者需要事先獲得編輯和刪除媒體文件的權(quán)限。因此,該漏洞可用于通過(guò)接管角色與作者一樣低的帳戶或通過(guò)利用其他漏洞/錯(cuò)誤配置來(lái)實(shí)現(xiàn)提權(quán)。
危害:攻擊者能夠利用它做什么
利用這個(gè)漏洞,攻擊者能夠刪除WordPress安裝的任何文件(+ PHP服務(wù)器上的任何其他文件,即PHP進(jìn)程有權(quán)刪除的,盡情刪就是了)。除了刪除整個(gè)WordPress安裝的可能性(如果當(dāng)前沒(méi)有備份可用的話,將會(huì)導(dǎo)致災(zāi)難性后果)之外,攻擊者還可以利用任意文件刪除功能繞過(guò)一些安全措施,繼而在Web服務(wù)器上執(zhí)行任意代碼。更確切地說(shuō),攻擊者可以刪除下列文件:
.htaccess:通常情況下,刪除該文件不會(huì)有任何安全影響。但是,在某些情況下,.htaccess文件包含與安全相關(guān)的安全約束(例如,對(duì)某些文件夾的訪問(wèn)限制),因此,刪除此文件后,相應(yīng)的安全限制將會(huì)隨之消失。
index.php文件:通常情況下,一些空的index.php文件被放置到各個(gè)目錄中,以防止相應(yīng)目錄中的內(nèi)容被列出。刪除這些文件后,攻擊者就能夠列出受該方法保護(hù)的目錄中的所有文件。
wp-config.php:刪除這個(gè)WordPress安裝文件會(huì)在下次訪問(wèn)該網(wǎng)站時(shí)觸發(fā)WordPress安裝過(guò)程。這是因?yàn)閣p-config.php包含數(shù)據(jù)庫(kù)憑證,如果沒(méi)有它,WordPress的就會(huì)采取尚未安裝之前的操作。攻擊者可以刪除該文件,然后,使用為管理員帳戶選擇的憑據(jù)進(jìn)行安裝,最后在服務(wù)器上執(zhí)行任意代碼。
大神演示視頻:
漏洞詳情
將未經(jīng)過(guò)濾的用戶輸入傳遞給文件刪除函數(shù)時(shí),就可能觸發(fā)任意文件刪除漏洞。對(duì)于PHP來(lái)說(shuō),當(dāng)調(diào)用unlink()函數(shù)并且可能影響部分或整個(gè)參數(shù)$filename的用戶輸入沒(méi)有進(jìn)行適當(dāng)?shù)倪^(guò)濾時(shí),就可能出現(xiàn)這種情況;其中,該參數(shù)表示表要?jiǎng)h除的文件的路徑。
在WordPress Core中,引發(fā)這個(gè)漏洞的代碼位于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()函數(shù)中,$ meta ['thumb']的內(nèi)容未經(jīng)任何過(guò)濾處理就直接傳遞給unlink()調(diào)用了。這段代碼的用途是,在刪除圖像的同時(shí),一起將其縮略圖刪掉。在WordPress中,通過(guò)媒體管理器上傳的圖像將作為attachement類(lèi)型的文章對(duì)待。值$meta ['thumb']是從數(shù)據(jù)庫(kù)中檢索的,在數(shù)據(jù)庫(kù)中,它保存在表示圖像的文章的自定義字段中。因此,在從數(shù)據(jù)庫(kù)檢索后,到傳遞給關(guān)鍵函數(shù)unlink()期間,并沒(méi)有對(duì)表示縮略圖文件名的值進(jìn)行任何過(guò)濾或檢查。如果該值在保存到數(shù)據(jù)庫(kù)之前也沒(méi)有經(jīng)過(guò)任何過(guò)濾,或過(guò)濾不充分的話——我們將在下一個(gè)代碼清單中看到這種情況——就可能出現(xiàn)一個(gè)兩階段的任意文件刪除漏洞。
[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中)展示了隸屬于附件的縮略圖的文件名是如何保存到數(shù)據(jù)庫(kù)的。用戶輸入從$_POST ['thumb']中取出后,直到通過(guò)wp_update_attachment_metadata()保存到數(shù)據(jù)庫(kù)這段過(guò)程中,系統(tǒng)沒(méi)有對(duì)這些內(nèi)容進(jìn)行適當(dāng)?shù)陌踩^(guò)濾,因此,也就無(wú)法確保該值的確為正在編輯的附件的縮略圖。此外,由于$_POST ['thumb']的值可以將任意文件的路徑保存到WordPress上傳目錄相對(duì)路徑中,所以當(dāng)附件被刪除時(shí),該文件也會(huì)被刪除,如前面的代碼所展示的那樣。
臨時(shí)補(bǔ)丁
在撰寫(xiě)本文的時(shí)候,WordPress中的這個(gè)漏洞仍未得到修復(fù)。正因?yàn)槿绱耍覀円呀?jīng)開(kāi)發(fā)了一個(gè)臨時(shí)補(bǔ)丁供大家使用。通過(guò)將該補(bǔ)丁添加到當(dāng)前使用的WordPress主題/子主題的functions.php文件中,就可以將該補(bǔ)丁集成到現(xiàn)有的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]
實(shí)際上,該補(bǔ)丁的工作原理就是,“鉤住”wp_update_attachement_metadata()調(diào)用,對(duì)提供給thumb的數(shù)據(jù)進(jìn)行安全過(guò)濾,確保其中不包含任何使路徑遍歷成為可能的內(nèi)容,這樣一來(lái),攻擊者就無(wú)法刪除與安全相關(guān)的文件了。
當(dāng)然,這里提供的補(bǔ)丁只是臨時(shí)性的,主要用來(lái)防止用戶收到惡意攻擊。由于我們無(wú)法兼顧WordPress插件的所有可能的向后兼容性問(wèn)題,所以,建議您謹(jǐn)慎地對(duì)WordPress文件進(jìn)行任何修改。
結(jié)束語(yǔ)
在這篇文章中,我們介紹了WordPress Core中的一個(gè)任意文件刪除漏洞,任何具有作者權(quán)限的用戶都能夠利用該漏洞來(lái)完全接管WordPress網(wǎng)站,繼而在服務(wù)器上執(zhí)行任意代碼。盡管該漏洞去年就報(bào)告給了WordPress安全團(tuán)隊(duì),但截止撰寫(xiě)本文時(shí)為止,他們?nèi)匀粵](méi)有對(duì)該漏洞進(jìn)行修復(fù)。
為了提高對(duì)這個(gè)漏洞的認(rèn)識(shí),我們決定發(fā)布一些細(xì)節(jié)和相應(yīng)的補(bǔ)丁。使用我們的安全分析方法,大家可以輕松發(fā)現(xiàn)該漏洞,我們確信這個(gè)問(wèn)題已經(jīng)為許多研究人員所了解。盡管用戶帳戶的要求對(duì)該漏洞的影響規(guī)模有一些影響,但共享多個(gè)用戶帳戶的站點(diǎn),應(yīng)該及時(shí)安裝相應(yīng)的安全補(bǔ)丁。
原文:https://blog.ripstech.com/2018/wordpress-file-delete-to-code-execution/
新主題官方微信公眾號(hào)
掃碼關(guān)注新主題(XinTheme)官方公眾號(hào),本站動(dòng)態(tài)早知道。
發(fā)布本站最新動(dòng)態(tài)(新主題發(fā)布、主題更新)和WordPress相關(guān)技術(shù)文章。