Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2020-00698
- Vendor: 台北國際社區廣播電台
- Title: ICRT Blog 使用了含有已知漏洞的 WordPress 導致可 RCE
- Introduction: 使用了含有已知漏洞的 Wordpress 導致可 RCE
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
未回報修補狀況
-
未複測
-
公開
處理歷程
- 2020/07/31 02:15:33 : 新提交 (由 Cyku 更新此狀態)
- 2020/08/02 22:27:53 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2020/08/03 19:22:10 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2020/08/03 19:22:10 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2020/09/30 03:00:02 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2020-00698
- 通報者:kanade86514 (Cyku)
- 風險:高
- 類型:使用已知含漏洞之元件 (Using Known Vulnerable Components)
參考資料
漏洞說明: OWASP - Top 10 - 2017 A9 - Using Components with Known Vulnerabilities
https://www.owasp.org/index.php/Top_10-2017_A9-Using_Components_with_Known_Vulnerabilities
相關網址
敘述
目標使用了含有已知弱點 CVE-2018-20148 的 WordPress 4.7.2 開源軟體,
該版本的 WordPress 在 XML-RPC 功能中存在一個函式 wp.getMediaItem,
該函式未正確檢查檔案路徑,導致可傳入 phar:// URL 觸發任意反序列化 ,
最終可能導致攻擊者可以執行任意系統指令。
前置條件
觸發此弱點必須登入一組至少有 Author 權限的帳號 (可以上傳圖片、附件檔案),
經過 recon 之後,發現目標存在一組 Author 權限帳號「joeychou」並使用弱密碼「1******2」。
( 保護當事人,因此將密碼打碼 )
截圖佐證
分析
雖然可以透過 phar 進行任意反序列化,
但要達成 RCE 需要目標存在可以利用的 gadget chain,
而在原生 WordPress 中尚未被發現一條可以直接利用的 gadget chain,
因此需要針對目標尋找可利用的物件,
經過觀察後發現目標安裝了 Jetpack 4.2.2 插件,
而恰好在此插件的原始碼中就發現了可以利用的 gadget。
在 Jetpack 4.2.2 中有一個 Jetpack 類別,定義了 __destruct 魔術方法可以作為我們 gadget chain 的起點,
可以看到在 do_stats 函式中,如果 $this->stats 陣列裡的物件是陣列,
就會執行 implode 函式將元素串接成字串,這可以進一步觸發 __toString 魔術方法的呼叫。
class Jetpack {
function __destruct() {
if ( ! empty( $this->stats ) ) {
$this->do_stats( 'server_side' );
}
}
function do_stats( $method = '' ) {
if ( is_array( $this->stats ) && count( $this->stats ) ) {
foreach ( $this->stats as $group => $stats ) {
if ( is_array( $stats ) && count( $stats ) ) {
$args = array( "x_jetpack-{$group}" => implode( ',', $stats ) );
if ( 'server_side' === $method ) {
self::do_server_side_stat( $args );
} else {
echo '<img src="' . esc_url( self::build_stats_url( $args ) ) . '" width="1" height="1" style="display:none;" />';
}
}
unset( $this->stats[ $group ] );
}
}
}
}
而在另一個 Crunion_Contact_Form_Shortcode 類別中定義了 __toString,
其中會對成員 $this->attributes 以 foreach 進行遍歷,
這可以進一步觸發任何繼承自 ArrayIterator 的物件的 current 函式被呼叫。
class Crunion_Contact_Form_Shortcode {
function __toString() {
$r = "[{$this->shortcode_name} ";
foreach ( $this->attributes as $key => $value ) {
// .. 略 ..
}
}
透過上述兩個物件的 gadget chain,
就可以接入 WordPress 內建已知可利用的 Requests_Utility_FilteredIterator 類別,
觸發任意函式呼叫,達成 Remote Code Execution。
class Requests_Utility_FilteredIterator extends ArrayIterator {
protected $callback;
public function current() {
$value = parent::current();
$value = call_user_func($this->callback, $value);
return $value;
}
}
備註
另外感謝 @vtim 的協助,使得能順利發現此弱點。
修補建議
1.
立即針對使用弱密碼的帳號進行密碼修改,並盤點確認所有帳號的密碼均使用高強度的密碼。
建議可要求包含大小寫英文、數字及特殊符號,並且長度須大於 12 碼。
2.
將 WordPress 更新至最新版本