WordPress 5.1:从CSRF到RCE
譯文聲明
本文是翻譯文章,文章原作者ripstech,文章來源:blog.ripstech.com
原文地址:https://blog.ripstech.com/2019/wordpress-csrf-to-rce/
譯文僅供參考,具體內(nèi)容表達(dá)以及含義原文為準(zhǔn)
×
一、前言
注:此漏洞利用和環(huán)境較為復(fù)雜,實(shí)際價(jià)值可能并不是很高,但對(duì)于XSS與權(quán)限管理也有一定參考價(jià)值。
上個(gè)月我們公布了WordPress 5.0中一個(gè)遠(yuǎn)程代碼執(zhí)行(RCE)漏洞(需通過身份認(rèn)證)。本文公布了WordPress 5.1中存在的另一個(gè)嚴(yán)重的漏洞利用鏈,使未經(jīng)身份認(rèn)證的攻擊者能夠在5.1.1版之前的WordPress中獲得遠(yuǎn)程代碼執(zhí)行權(quán)限。
二、漏洞影響
如果WordPress站點(diǎn)啟用了評(píng)論(comment)功能,那么攻擊者可以誘騙目標(biāo)網(wǎng)站管理員訪問攻擊者設(shè)置的一個(gè)站點(diǎn),最終接管目標(biāo)站點(diǎn)。一旦受害管理員訪問惡意網(wǎng)站,攻擊者就會(huì)在后臺(tái)通過跨站請(qǐng)求偽造(CSRF)攻擊目標(biāo)WordPress站點(diǎn),不會(huì)因此目標(biāo)受害者警覺。CSRF攻擊中濫用了WordPress中的多個(gè)邏輯缺陷及數(shù)據(jù)過濾錯(cuò)誤,并且結(jié)合這些缺陷實(shí)現(xiàn)RCE,最終完全接管目標(biāo)站點(diǎn)。
5.1.1版之前默認(rèn)配置的WordPress受這些漏洞影響。
根據(jù)WordPress下載頁面的統(tǒng)計(jì)數(shù)據(jù),互聯(lián)網(wǎng)上超過33%的站點(diǎn)正在使用WordPress。考慮到博客評(píng)論是博客網(wǎng)站的核心功能,默認(rèn)情況下處于啟用狀態(tài),因此該漏洞會(huì)影響數(shù)百萬站點(diǎn)。
三、技術(shù)分析
攻擊過程參考此處視頻。
評(píng)論表單中的CSRF
當(dāng)用戶發(fā)表新評(píng)論時(shí),WordPress并沒有檢查是否存在CSRF。如果執(zhí)行檢查操作,那某些WordPress功能(如trackbacks以及pingbacks)將無法正常工作。這意味著攻擊者可以通過CSRF攻擊,以WordPress博客管理員用戶的身份創(chuàng)建評(píng)論。
這可能成為一個(gè)安全問題,因?yàn)閃ordPress網(wǎng)站管理員可以在評(píng)論中使用任意HTML標(biāo)簽,甚至還可以使用
WordPress會(huì)在評(píng)論表單中為管理員生成一個(gè)額外的nonce值,通過這種方法嘗試解決這個(gè)問題。當(dāng)管理員提交評(píng)論并提供有效的nonce值時(shí),WordPress將直接創(chuàng)建評(píng)論,沒有執(zhí)行任何過濾此操作。如果nonce值無效,那么評(píng)論仍可以創(chuàng)建,但會(huì)被過濾處理。
我們可以通過如下代碼片段了解WordPress的處理過程。
源文件:/wp-includes/comment.php(簡化版):
?
if ( current_user_can( 'unfiltered_html' ) ) {
} else {
$_POST['comment'] = wp_filter_kses($_POST['comment']);}
?
事實(shí)上,從2009年起,WordPress就沒有在評(píng)論表單中部署CSRF防護(hù)機(jī)制。
然而,我們發(fā)現(xiàn)針對(duì)管理員的過濾過程中存在一處邏輯缺陷。如上代碼片段中,WordPress始終使用wp_filter_kses()來過濾評(píng)論,除非創(chuàng)建該評(píng)論的是具備unfiltered_html功能的管理員。如果滿足該條件,并且沒有提供有效的nonce值,那么WordPress就會(huì)使用wp_filter_post_kses()來過濾評(píng)論(上述代碼第3242行)。
wp_filter_post_kses()與wp_filter_kses()在嚴(yán)格程度上有所區(qū)別。這兩個(gè)函數(shù)都會(huì)處理未經(jīng)過濾的評(píng)論,只在字符串中保留特定的HTML標(biāo)簽及屬性。通常情況下,使用wp_filter_kses()過濾的評(píng)論只會(huì)留下非常基本的HTML標(biāo)簽及屬性,比如標(biāo)簽以及href屬性。
這樣攻擊者就可以創(chuàng)建一些評(píng)論,其中包含比正常評(píng)論更多的HTML標(biāo)簽及屬性。然而,雖然wp_filter_post_kses()更為寬松,但仍會(huì)刪除可能導(dǎo)致跨站腳本漏洞的HTML標(biāo)簽及屬性。
將HTML注入變成存儲(chǔ)型XSS
由于我們能注入其他HTML標(biāo)簽及屬性,最終還是可以在WordPress中實(shí)現(xiàn)存儲(chǔ)型XSS。這是因?yàn)閃ordPress會(huì)以某種錯(cuò)誤的方式解析并處理正常評(píng)論中通常不會(huì)設(shè)置的某些屬性,導(dǎo)致出現(xiàn)任意屬性注入問題。
當(dāng)WordPress執(zhí)行完評(píng)論的過濾過程后,就會(huì)修改評(píng)論字符串中的標(biāo)簽,以適配SEO(搜索引擎優(yōu)化)應(yīng)用場(chǎng)景。
WordPress會(huì)將標(biāo)志的屬性字符串(如href="#" title="some link" rel="nofollow")解析成一個(gè)關(guān)聯(lián)數(shù)組(如下代碼片段),其中key為屬性名,而value為屬性值。
源文件:wp-includes/formatting.php
function wp_rel_nofollow_callback( $matches ) {
$text = $matches[1]; $atts = shortcode_parse_atts($matches[1]); ?隨后WordPress會(huì)檢查其中是否設(shè)置了rel屬性。只有通過wp_filter_post_kses()過濾評(píng)論時(shí)才會(huì)設(shè)置該屬性。如果設(shè)置了該屬性,則WordPress會(huì)處理rel屬性,然后再次與標(biāo)簽拼接起來。
源文件:wp-includes/formatting.php
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行處存在缺陷,其中屬性值在沒有被轉(zhuǎn)義處理的情況下就再次拼接在一起。
攻擊者可以創(chuàng)建包含精心構(gòu)造的標(biāo)簽的評(píng)論,并將title屬性設(shè)置為title='XSS " οnmοuseοver=alert(1) id="'。這個(gè)屬性是合法的HTML數(shù)據(jù),因此可以通過數(shù)據(jù)過濾檢查。然而,只有當(dāng)title標(biāo)簽使用單引號(hào)時(shí)這種方法才有效。
當(dāng)屬性再次拼接時(shí),title屬性會(huì)被封裝到雙引號(hào)中(第3018行)。這意味著攻擊者可以注入雙引號(hào),閉合title屬性,因此可以注入其他HTML屬性。
比如:在處理之后會(huì)變成。
由于此時(shí)評(píng)論已經(jīng)被過濾處理過,因此攻擊者注入的onmouseover事件處理函數(shù)會(huì)存儲(chǔ)在數(shù)據(jù)庫中,不會(huì)被刪除。將這種過濾缺陷與CSRF漏洞結(jié)合起來,攻擊者就可以將存儲(chǔ)型XSS payload注入目標(biāo)網(wǎng)站中。
通過iframe直接執(zhí)行XSS
創(chuàng)建惡意評(píng)論后,為了實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行(RCE),下一步攻擊者需要讓管理員執(zhí)行已注入的JavaScript。WordPress評(píng)論會(huì)在目標(biāo)博客的前端顯示,而WordPress本身并沒有使用X-Frame-Options來保護(hù)前端頁面。這意味著攻擊者可以以隱藏iframe的方式在網(wǎng)站上顯示評(píng)論。由于注入的屬性是一個(gè)onmouseover事件處理函數(shù),因此攻擊者可以讓iframe跟隨受害者鼠標(biāo),立刻觸發(fā)XSS payload。
這樣一來,攻擊者就可以在目標(biāo)網(wǎng)站上使用觸發(fā)CSRF漏洞的管理員會(huì)話來執(zhí)行任意JavaScript代碼。有所的JavaScript都在后臺(tái)執(zhí)行,不會(huì)引起管理員的注意。
提升至RCE
現(xiàn)在攻擊者已經(jīng)可能使用管理員會(huì)話來執(zhí)行任意JavaScript代碼,那么也很容易就能實(shí)現(xiàn)RCE。默認(rèn)情況下,WordPress允許博客管理員在管理面板中直接編輯站點(diǎn)主題和插件的.php文件。攻擊者只需要簡單插入一個(gè)PHP后門,就可以在遠(yuǎn)程服務(wù)器上獲得任意PHP代碼執(zhí)行權(quán)限。
四、補(bǔ)丁情況
默認(rèn)情況下,WordPress會(huì)自動(dòng)安裝安全更新,因此我們應(yīng)該已經(jīng)更新至最新的5.1.1版。如果用戶或所屬托管商由于某些原因禁用了自動(dòng)更新功能,那么在安裝補(bǔ)丁前,可以考慮禁用評(píng)論功能。更為重要的一點(diǎn)是,請(qǐng)管理員確保訪問其他網(wǎng)站之前,已經(jīng)注銷當(dāng)前的管理員會(huì)話。
五、時(shí)間線
2018/10/24:反饋漏洞報(bào)告,說明攻擊者有可能通過CSRF在WordPress中注入更多的HTML標(biāo)簽
2018/10/25:WordPress官方在Hackerone上將該漏洞報(bào)告進(jìn)行分類
2019/02/05:WordPress提供了一個(gè)安全補(bǔ)丁,我們測(cè)試后提供了反饋
2019/03/01:通知WordPress我們可以將HTML注入升級(jí)為存儲(chǔ)型XSS漏洞
2019/03/01:WordPress與我們溝通,表示安全團(tuán)隊(duì)的某個(gè)成員已經(jīng)發(fā)現(xiàn)該問題,準(zhǔn)備推出補(bǔ)丁
2019/03/13:WordPress 5.1.1發(fā)布
六、總結(jié)
本文從CSRF漏洞開始介紹了一個(gè)完整的漏洞利用鏈。攻擊者只需要誘導(dǎo)目標(biāo)網(wǎng)站管理員訪問某個(gè)惡意網(wǎng)站,然后就可以通過這條利用鏈來接管使用默認(rèn)配置的WordPress站點(diǎn)。目標(biāo)管理員并不會(huì)發(fā)現(xiàn)攻擊者的網(wǎng)站有任何異常,除了訪問攻擊者設(shè)置的網(wǎng)站之外,整條攻擊鏈中沒有其他交互過程。
感謝WordPress安全團(tuán)隊(duì),這些小伙伴們非常友善,并且合作解決問題時(shí)也非常專業(yè)。
總結(jié)
以上是生活随笔為你收集整理的WordPress 5.1:从CSRF到RCE的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】【Linux】Linux下统计当前
- 下一篇: python3基础知识一