作者:LoRexxar'@知道創宇404實驗室
時間:2019年3月14日
英文版本:http://www.bjnorthway.com/936/
2019年3月13日, RIPS團隊公開了一篇關于WordPress 5.1.1的XSS漏洞詳情,標題起的很響亮,叫做wordpress csrf to rce, https://blog.ripstech.com/2019/wordpress-csrf-to-rce/
下面我們就來詳細聊聊這個漏洞。
關于WordPress防護
早在2017年10月25號,我曾經寫過一篇關于WordPress安全機制的文章。
https://lorexxar.cn/2017/10/25/wordpress/
在其中,我著重描述了WordPress整體安全機制中的最核心機制,Nonce安全機制。
出于防御CSRF攻擊的目的,WordPress引入了Nonce安全機制,Nonce是通過用戶id、token、操作屬性來計算的。簡單來說就是,Nonce值受限于用戶以及操作屬性兩點,不同用戶同一個操作Nonce值不同,同一個用戶不同操作Nonce值不同,同一個用戶同一個操作不同站Nonce不同。
雖然是出于防御CSRF攻擊的目的誕生,但卻在WordPress薄弱的后臺安全防御下,打上了最強的一節防御外殼。
在WordPress Core開發團隊的認知中,任何一個WordPress的超級管理員,都應該保管好自己的網站以及賬號安全,超級管理員也應該能對自己的網站以及服務器負責。
在這樣的觀點設計下,WordPress的超級管理員可以直接修改后臺插件模板來getshell,超級管理員的評論不會有任何過濾。
所以在WordPress的防御體系下,如何繞過Nonce、如何獲取超級管理員權限、如果在非超級管理員權限下做任何可以威脅網站安全操作,就是WordPress安全漏洞的主要方向。
關于 CSRF to RCE 漏洞
在我們熟悉了WordPress的安全機制之后,我們再回到這個漏洞來。
作者提到,在WordPress的評論處有一個比較神奇的機制。剛才提到,對于WP的超級管理員來說,文章的評論不會有任何過濾,但仍舊有Nonce值_wp_unfiltered_html_comment,而WordPress其中有一些特殊的功能例如trackbacks and pingbacks會受到該值的影響,所以在評論處,Nonce不會直接阻止請求,而是另外生成了一套邏輯來做處理
/wp-includes/comment.php line 3245
if ( current_user_can( 'unfiltered_html' ) ) {
if ( wp_create_nonce( 'unfiltered-html-comment' )!=$_POST['_wp_unfiltered_html_comment'] ) {
kses_remove_filters(); // start with a clean slate
kses_init_filters(); // set up the filters
}
}
繼續跟下去,我們簡單的把邏輯寫成偽代碼
if 有權限:
if nonce正確:
wp_filter_post_kses()
else:
wp_filter_kses()
而其中的區別就是,wp_filter_post_kses不會做任何過濾,會保留請求的完整評論,而wp_filter_kses將只允許白名單的標簽存在,就比如a標簽等。
而問題的核心就在于,如何在wp_filter_kses的白名單中找到一個可以導致xss的輸入點。這個點就在a標簽的rel屬性處理中。
在/wp-includes/formatting.php line 3025

這里對整個標簽全部做了一次處理,而沒有額外的轉義,再加上這里是通過拼接雙引號符號來完成,那么如果我們構造一個評論為
<a title='aa " onmouseover=alert() id=" ' rel='111'>please click me
原鏈接中的屬性會被取出,然后被雙引號包裹,就成了
<a title="aa " onmouseover=alert() id=" " rel='111'>please click me
惡意鏈接就構造成功了,當管理員鼠標放在這條評論上時,則可以執行任意JS。
最后就是在執行任意JS之后,我們可以通過JS直接修改后臺的模板,來實現管理員權限下的惡意操作,在我曾經寫過的文章《從瑞士軍刀到變形金剛--XSS攻擊面拓展》中,我就曾經以WordPress為例子來舉了多個從XSS到進一步惡意操作的利用方式。
https://lorexxar.cn/2017/08/23/xss-tuo/#Xss-to-Rce
我們仔細回顧一下整個漏洞,攻擊者需要誘騙超級管理員點擊他的惡意鏈接,然后需要手動把鼠標放置到評論上,甚至還需要保留該頁面一段時間,整個攻擊才有可能成功。
不難發現,如果我們把漏洞放在WordPress Core樹立的安全標準下來說,該漏洞實際能算作是漏洞的部分只有一個,就是繞過Nonce機制實現的一個WordPress XSS漏洞。當我們拋開這個關鍵點之后,我們不難發現,這個漏洞看上次利用條件還不錯,但實際上,在WordPress的安全機制中,插件安全一直是最嚴重的問題,一旦WordPress的高量級插件爆了一個后臺的反射性XSS漏洞,利用難度反而甚至比這個漏洞更低,不是嗎?
漏洞要求
- WordPress commit < 2504efcf9439c1961c4108057e8f3f48239a244b(5.2-alpha-44833)
- 超級管理員點擊惡意鏈接。
漏洞復現
搭建完成后使用admin賬號登陸
然后構造惡意頁面
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="http://127.0.0.1/wordpress/wp-comments-post.php" method="POST">
<input type="hidden" name="comment" value="<a title='aa " onmouseover=alert() id=" ' rel='111'>please click me" />
<input type="hidden" name="submit" value="%E5%8F%91%E8%A1%A8%E8%AF%84%E8%AE%BA />
<input type="hidden" name="comment_post_ID" value="1" />
<input type="hidden" name="comment_parent" value="0" />
<input type="hidden" name="_wp_unfiltered_html_comment" value="1" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
使用登陸過超級管理員的瀏覽器點開該頁面,然后就會提交評論,當鼠標移動到評論上是,則會執行相應的js

從漏洞補丁看漏洞分析
剛才我們說到了一個關鍵點,整個漏洞實際上可以看作是一個繞過Nonce機制實現的一個WordPress XSS漏洞。
這里我們從漏洞補丁出發,重新分析下這個漏洞的幾個關鍵點。這個漏洞到目前為止,一共有2個commit用來修復。
- https://github.com/WordPress/WordPress/commit/2504efcf9439c1961c4108057e8f3f48239a244b#diff-e7c589fb0969e0f690bf2f051517d0ad
- https://github.com/WordPress/WordPress/commit/0292de60ec78c5a44956765189403654fe4d080b#diff-91531896c6f70c8a4b4b321d1369c988
第一個commit首先是修復了那個不該有的xss漏洞

esc_attr是WordPress內置的過濾函數,專用來處理屬性處的可能出現xss的位置。
第二個commit就比較有趣了,在我看來這個commit更像是一個半成品,可能是由于修復比較匆忙,先把修復的patch更新了再說的感覺。

這個commit我們需要跟進到函數wp_filter_kses才看得懂,我們跟著這個函數一路跟下去,一直到/wp-includes/kses.php line 1039

這里的pre_comment_content大概像是請求的類型,要到wp_kses_allowed_html去獲取允許的標簽以及屬性列表。
/wp-includes/kses.php line 829

由于還沒有針對性的設置,所以在現在的版本中,如果沒有設置nonce,享受的是和其他用戶相同的評論過濾,也就從另一個角度修復了這個漏洞:>
寫在最后
當我們一起分析完整個漏洞之后呢,不難發現RIPS為了pr不惜吹了個大牛,其實當我們把整個漏洞重新壓縮之后,我們發現其實漏洞就相當于其他CMS爆了一個存儲型XSS漏洞一樣,之所以會有這樣的利用鏈,反而是因為WordPress對其本身錯誤的安全認知導致的。
在WordPress的安全認知中,Nonce機制的確是一個效果非常好的安全機制,但從一個安全從業者的觀點來說,WordPress的超級管理員應不應該等同于服務器管理員仍然是一個需要考慮的問題,在安全的世界里來說,給每個用戶他們應有的權限才是最安全的做法,不是嗎?
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/854/
暫無評論