天天看點

WordPress 5.1:從CSRF到RCE

譯文聲明

本文是翻譯文章,文章原作者ripstech,文章來源:blog.ripstech.com

原文位址:

https://blog.ripstech.com/2019/wordpress-csrf-to-rce/

譯文僅供參考,具體内容表達以及含義原文為準

×

一、前言

注:此漏洞利用和環境較為複雜,實際價值可能并不是很高,但對于XSS與權限管理也有一定參考價值。

上個月我們公布了WordPress 5.0中一個遠端代碼執行(RCE)漏洞(需通過身份認證)。本文公布了WordPress 5.1中存在的另一個嚴重的漏洞利用鍊,使未經身份認證的攻擊者能夠在5.1.1版之前的WordPress中獲得遠端代碼執行權限。

二、漏洞影響

如果WordPress站點啟用了評論(comment)功能,那麼攻擊者可以誘騙目标網站管理者通路攻擊者設定的一個站點,最終接管目标站點。一旦受害管理者通路惡意網站,攻擊者就會在背景通過跨站請求僞造(CSRF)攻擊目标WordPress站點,不會是以目标受害者警覺。CSRF攻擊中濫用了WordPress中的多個邏輯缺陷及資料過濾錯誤,并且結合這些缺陷實作RCE,最終完全接管目标站點。

5.1.1版之前預設配置的WordPress受這些漏洞影響。

根據WordPress下載下傳頁面的統計資料,網際網路上超過33%的站點正在使用WordPress。考慮到部落格評論是部落格網站的核心功能,預設情況下處于啟用狀态,是以該漏洞會影響數百萬站點。

三、技術分析

攻擊過程參考此處視訊。

評論表單中的CSRF

當使用者發表新評論時,WordPress并沒有檢查是否存在CSRF。如果執行檢查操作,那某些WordPress功能(如trackbacks以及pingbacks)将無法正常工作。這意味着攻擊者可以通過CSRF攻擊,以WordPress部落格管理者使用者的身份建立評論。

這可能成為一個安全問題,因為WordPress網站管理者可以在評論中使用任意HTML标簽,甚至還可以使用

WordPress會在評論表單中為管理者生成一個額外的nonce值,通過這種方法嘗試解決這個問題。當管理者送出評論并提供有效的nonce值時,WordPress将直接建立評論,沒有執行任何過濾此操作。如果nonce值無效,那麼評論仍可以建立,但會被過濾處理。

我們可以通過如下代碼片段了解WordPress的處理過程。

源檔案:/wp-includes/comment.php(簡化版):

if ( current_user_can( 'unfiltered_html' ) ) {

if (! wp_verify_nonce( $_POST['_wp_unfiltered_html_comment'], 'unfiltered-html-comment' )) {
    $_POST['comment'] = wp_filter_post_kses($_POST['comment']); // line 3242
}           

} else {

$_POST['comment'] = wp_filter_kses($_POST['comment']);           

}

事實上,從2009年起,WordPress就沒有在評論表單中部署CSRF防護機制。

然而,我們發現針對管理者的過濾過程中存在一處邏輯缺陷。如上代碼片段中,WordPress始終使用wp_filter_kses()來過濾評論,除非建立該評論的是具備unfiltered_html功能的管理者。如果滿足該條件,并且沒有提供有效的nonce值,那麼WordPress就會使用wp_filter_post_kses()來過濾評論(上述代碼第3242行)。

wp_filter_post_kses()與wp_filter_kses()在嚴格程度上有所差別。這兩個函數都會處理未經過濾的評論,隻在字元串中保留特定的HTML标簽及屬性。通常情況下,使用wp_filter_kses()過濾的評論隻會留下非常基本的HTML标簽及屬性,比如

标簽以及href屬性。

這樣攻擊者就可以建立一些評論,其中包含比正常評論更多的HTML标簽及屬性。然而,雖然wp_filter_post_kses()更為寬松,但仍會删除可能導緻跨站腳本漏洞的HTML标簽及屬性。

将HTML注入變成存儲型XSS

由于我們能注入其他HTML标簽及屬性,最終還是可以在WordPress中實作存儲型XSS。這是因為WordPress會以某種錯誤的方式解析并處理正常評論中通常不會設定的某些屬性,導緻出現任意屬性注入問題。

當WordPress執行完評論的過濾過程後,就會修改評論字元串中的

标簽,以适配SEO(搜尋引擎優化)應用場景。

WordPress會将

标志的屬性字元串(如href="#" title="some link" rel="nofollow")解析成一個關聯數組(如下代碼片段),其中key為屬性名,而value為屬性值。

源檔案:wp-includes/formatting.php

function wp_rel_nofollow_callback( $matches ) {

$text = $matches[1];
$atts = shortcode_parse_atts($matches[1]);
⋮           

随後WordPress會檢查其中是否設定了rel屬性。隻有通過wp_filter_post_kses()過濾評論時才會設定該屬性。如果設定了該屬性,則WordPress會處理rel屬性,然後再次與

标簽拼接起來。
if (!empty($atts['rel'])) {
    // the processing of the 'rel' attribute happens here
    ⋮
    $text = '';
    foreach ($atts as $name => $value) {            // line 3017
        $text .= $name . '="' . $value . '" ';        // line 3018
    }
}
return '<a ' . $text . ' rel="' . $rel . '">';        // line 3021           

上述代碼第3017及3018行處存在缺陷,其中屬性值在沒有被轉義處理的情況下就再次拼接在一起。

攻擊者可以建立包含精心構造的

标簽的評論,并将title屬性設定為title='XSS " onmouseover=alert(1) id="'。這個屬性是合法的HTML資料,是以可以通過資料過濾檢查。然而,隻有當title标簽使用單引号時這種方法才有效。

當屬性再次拼接時,title屬性會被封裝到雙引号中(第3018行)。這意味着攻擊者可以注入雙引号,閉合title屬性,是以可以注入其他HTML屬性。

比如:

在處理之後會變成

由于此時評論已經被過濾處理過,是以攻擊者注入的onmouseover事件處理函數會存儲在資料庫中,不會被删除。将這種過濾缺陷與CSRF漏洞結合起來,攻擊者就可以将存儲型XSS payload注入目标網站中。

通過iframe直接執行XSS

建立惡意評論後,為了實作遠端代碼執行(RCE),下一步攻擊者需要讓管理者執行已注入的JavaScript。WordPress評論會在目标部落格的前端顯示,而WordPress本身并沒有使用X-Frame-Options來保護前端頁面。這意味着攻擊者可以以隐藏iframe的方式在網站上顯示評論。由于注入的屬性是一個onmouseover事件處理函數,是以攻擊者可以讓iframe跟随受害者滑鼠,立刻觸發XSS payload。

這樣一來,攻擊者就可以在目标網站上使用觸發CSRF漏洞的管理者會話來執行任意JavaScript代碼。有所的JavaScript都在背景執行,不會引起管理者的注意。

提升至RCE

現在攻擊者已經可能使用管理者會話來執行任意JavaScript代碼,那麼也很容易就能實作RCE。預設情況下,WordPress允許部落格管理者在管理面闆中直接編輯站點主題和插件的.php檔案。攻擊者隻需要簡單插入一個PHP後門,就可以在遠端伺服器上獲得任意PHP代碼執行權限。

四、更新檔情況

預設情況下,WordPress會自動安裝安全更新,是以我們應該已經更新至最新的5.1.1版。如果使用者或所屬托管商由于某些原因禁用了自動更新功能,那麼在安裝更新檔前,可以考慮禁用評論功能。更為重要的一點是,請管理者確定通路其他網站之前,已經登出目前的管理者會話。

五、時間線

2018/10/24:回報漏洞報告,說明攻擊者有可能通過CSRF在WordPress中注入更多的HTML标簽

2018/10/25:WordPress官方在Hackerone上将該漏洞報告進行分類

2019/02/05:WordPress提供了一個安全更新檔,我們測試後提供了回報

2019/03/01:通知WordPress我們可以将HTML注入更新為存儲型XSS漏洞

2019/03/01:WordPress與我們溝通,表示安全團隊的某個成員已經發現該問題,準備推出更新檔

2019/03/13:WordPress 5.1.1釋出

六、總結

本文從CSRF漏洞開始介紹了一個完整的漏洞利用鍊。攻擊者隻需要誘導目标網站管理者通路某個惡意網站,然後就可以通過這條利用鍊來接管使用預設配置的WordPress站點。目标管理者并不會發現攻擊者的網站有任何異常,除了通路攻擊者設定的網站之外,整條攻擊鍊中沒有其他互動過程。

感謝WordPress安全團隊,這些小夥伴們非常友善,并且合作解決問題時也非常專業。

下一篇: Tomcat優化

繼續閱讀