本文原創(chuàng)作者:華為未然實(shí)驗(yàn)室
來(lái)源:FreeBuf.COM
近日,來(lái)自Sucuri的研究人員發(fā)現(xiàn)WordPress存在重大漏洞,漏洞在于WordpressREST API,成功利用該漏洞可刪除頁(yè)面或修改頁(yè)面內(nèi)容。官方很快發(fā)布了升級(jí)版Wordpress,但很多管理員沒(méi)有及時(shí)升級(jí),以至于被篡改的網(wǎng)頁(yè)從最初的幾千一路飆升到了150萬(wàn),在此也提醒各位管理員盡快升級(jí)。
漏洞詳情
1. 漏洞信息:
WordPress是一個(gè)以PHP和MySQL為平臺(tái)的自由開(kāi)源的博客軟件和內(nèi)容管理系統(tǒng)。在4.7.0版本后,REST API插件的功能被集成到WordPress中,由此也引發(fā)了一些安全性問(wèn)題。近日,一個(gè)由REST API引起的影響WorePress4.7.0和4.7.1版本的漏洞被披露,該漏洞可以導(dǎo)致WordPress所有文章內(nèi)容可以未經(jīng)驗(yàn)證被查看,修改,刪除,甚至創(chuàng)建新的文章,危害巨大。
2. 漏洞影響版本:
WordPress4.7.0、WordPress 4.7.1
3. 復(fù)現(xiàn)環(huán)境:
Apache 2.4
PHP 7.0
WordPress4.7.1
4.復(fù)現(xiàn)過(guò)程:
(1) 安裝WordPress并配置REST API
① 配置Apache+PHP+Mysql的運(yùn)行環(huán)境,下載含有漏洞版本的WordPress (https://wordpress.org/wordpress-4.7.1.tar.gz)并安裝。
② 加載Apache的rewrite模塊。
在Apache的配置文件中添加
LoadModule rewrite_module/usr/lib/apache2/modules/mod_rewrite.so
并在主配置文件中設(shè)置對(duì)應(yīng)的WEB目錄的AllowOverride為All
③設(shè)置WordPress站點(diǎn)為固定鏈接
在Settings->Permalinks中的Common Settings設(shè)置為非Plain模式。例如下圖,我們?cè)O(shè)置為Day and name。
(2) 漏洞復(fù)現(xiàn)
①根據(jù)REST API文檔,修改文章內(nèi)容的數(shù)據(jù)包構(gòu)造如下:
可以看到,不帶任何驗(yàn)證信息會(huì)提示不允許編輯文章
②構(gòu)造可利用的數(shù)據(jù)包:
當(dāng)url為/wp-json/wp/v2/posts/1?id=1a時(shí),可以看到,已經(jīng)成功跳過(guò)驗(yàn)證看到文章內(nèi)容了。
漏洞發(fā)現(xiàn)之技術(shù)細(xì)節(jié)
Sucuri研究人員的漏洞發(fā)現(xiàn)過(guò)程始于./wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
這里有幾件事值得注意。注冊(cè)的路由用于用數(shù)字填充ID請(qǐng)求參數(shù)。比如,如果向/wp-json/wp/v2/posts/1234 –發(fā)送請(qǐng)求,則ID參數(shù)被設(shè)置為1234。
這種行為本身不失為一種防止攻擊者編制惡意ID值的好方法,但是當(dāng)查看REST API如何管理訪(fǎng)問(wèn)時(shí),研究人員很快發(fā)現(xiàn)其給予$_GET 和$_POST值的優(yōu)先級(jí)高于路由的正則表達(dá)式生成的值。這使攻擊者可以發(fā)送/wp-json/wp/v2/posts/1234?id=12345helloworld這樣的請(qǐng)求,這樣會(huì)將12345helloworld分配到ID參數(shù),這樣包含的不僅僅是數(shù)字。
研究人員進(jìn)一步查看了各種回調(diào)(上面截圖中),其中一個(gè)引起了研究人員的注意:update_item及其權(quán)限檢查方法:update_item_permissions_check。
簡(jiǎn)言之,它將字母數(shù)字ID值直接傳遞給了get_post()函數(shù)。該函數(shù)通過(guò)檢查帖子是否實(shí)際存在以及用戶(hù)是否有權(quán)編輯此帖來(lái)驗(yàn)證請(qǐng)求。研究人員認(rèn)為這種審驗(yàn)請(qǐng)求的方式較為奇特。如果我們發(fā)送一個(gè)沒(méi)有相應(yīng)帖子的ID,我們可以通過(guò)權(quán)限檢查,并被允許繼續(xù)執(zhí)行對(duì)update_item方法的請(qǐng)求。
出于對(duì)是什么導(dǎo)致get_post()無(wú)法找到帖子(除ID不存在外)的好奇,研究人員意識(shí)到其使用wp_posts中的get_instance()靜態(tài)方法來(lái)抓取帖子。
從代碼中可以看出,對(duì)于不是由純數(shù)字字符組成的任何輸入,其基本上會(huì)失敗 – 因此123ABC會(huì)失敗。
對(duì)于攻擊者,這意味著WordPress(將其視作具有足夠權(quán)限編輯此帖的用戶(hù))會(huì)運(yùn)行update_item方法。
我們認(rèn)為有必要查看該方法的作用。
截圖中有一個(gè)微妙但非常重要的細(xì)節(jié)——WordPress在將ID參數(shù)傳遞給get_post前先將其轉(zhuǎn)換為一個(gè)整數(shù)。鑒于PHP進(jìn)行類(lèi)型比較和轉(zhuǎn)換的方式,這是一個(gè)問(wèn)題。比如,你會(huì)發(fā)現(xiàn)以下代碼片段會(huì)返回123:
這導(dǎo)致了非常危險(xiǎn)的情形,即攻擊者可以提交/wp-json/wp/v2/posts/123?id=456ABC這樣的請(qǐng)求來(lái)對(duì)ID為456的帖子進(jìn)行篡改。
鑒于此類(lèi)型欺騙問(wèn)題,攻擊者便可篡改受害者網(wǎng)站上的任何帖子或頁(yè)面的內(nèi)容。這樣他們便可以添加插件特定的短代碼來(lái)利用漏洞(原本僅限于貢獻(xiàn)者)、使用SEO垃圾郵件活動(dòng)感染網(wǎng)站內(nèi)容或注入廣告,等等。甚至可以很容易地執(zhí)行PHP代碼——取決于網(wǎng)站上啟用的插件。
結(jié)語(yǔ)
這是一個(gè)可以以不同方式利用的嚴(yán)重漏洞,如果您的網(wǎng)站尚未啟用自動(dòng)更新,請(qǐng)盡快更新。
參考來(lái)源:
https://blog.sucuri.net/2017/02/content-injection-vulnerability-wordpress-rest-api.html
https://www.seebug.org/vuldb/ssvid-92637
原文地址:http://www.freebuf.com/vuls/126734.html