根據(jù)CVE官方漏洞通報(bào)得知wordpress新出一個(gè)組合式rce漏洞,漏洞編號分別為CVE-2019-8943和CVE-2019-8942,下載漏洞版本源碼,分析漏洞觸發(fā)過程,注:漏洞復(fù)現(xiàn)時(shí)一定要斷網(wǎng)搭建,WordPress在聯(lián)網(wǎng)狀態(tài)時(shí)會自動更新代碼包。找到漏洞發(fā)生文件post.php,wordpress有多個(gè)post.php文件,這里簡要說明一下各自的作用,wp-includes/post.php為post的源文件,wp-admin/includes/post.php為有后臺權(quán)限的post接口,wp-admin/post.php為后臺post的請求處理,具體調(diào)用代碼如下:
wp-admin/post.php:require_once(?dirname(?__FILE__?)?.?'/admin.php'?); wp-admin/admin.php:require_once(ABSPATH?.?'wp-admin/includes/admin.php'); wp-admin/includes/admin.php:require_once(ABSPATH?.?'wp-admin/includes/post.php'); wp-admin/admin.php::require_once(dirname(dirname(__FILE__))?.?'/wp-load.php'); wp-load.php:require_once(?dirname(?ABSPATH?)?.?'/wp-config.php'?); wp-config.php:require_once(ABSPATH?.?'wp-settings.php'); wp-settings.php:require(?ABSPATH?.?WPINC?.?'/post.php'?); define(?'WPINC',?'wp-includes'?);
根據(jù)以上調(diào)用流程,漏洞利用流程為上傳一個(gè)圖片到媒體庫,然后進(jìn)行更新操作,調(diào)用wp-admin/post.php函數(shù),并根據(jù)switch到case:editpost,如下圖所示:
其中edit_post為漏洞函數(shù),進(jìn)入函數(shù)聲明,如下圖所示:
$post_data為post數(shù)組,并未作任何過濾防護(hù),對此產(chǎn)生了之后的漏洞,對比修復(fù)后的代碼,如下圖所示:
在此我多說兩句,因一開始并未發(fā)現(xiàn)wordpress在聯(lián)網(wǎng)時(shí)會進(jìn)行自動更新,所以,我定位了另一個(gè)類似漏洞點(diǎn),如下圖所示:
以上代碼會根據(jù)傳入的meta數(shù)組進(jìn)行update_meta,根據(jù)代碼中的$key(數(shù)據(jù)庫中的meta_id),$value[‘key’](數(shù)據(jù)庫中的meta_key),$value[‘value’](數(shù)據(jù)庫中的meta_value),構(gòu)造meta[1][key]=_wp_attached_file&meta[1][value]=123,最終執(zhí)行類似以下數(shù)據(jù)庫語句UPDATE `wp_postmeta` SET `meta_key` = ‘_wp_attached_file’, `meta_value` = ‘123’ WHERE `meta_id` = 2,實(shí)現(xiàn)過程,如下圖所示:
相關(guān)推薦:《WordPress教程》
根據(jù)meta_id更新wp_postmeta表中內(nèi)容,最終執(zhí)行do_action函數(shù),如下圖所示 :
但是由于第三個(gè)和第四個(gè)if的限制,導(dǎo)致無法執(zhí)行成功,這也算是一個(gè)漏洞復(fù)現(xiàn)上的一個(gè)有趣的點(diǎn)吧,繼續(xù)跟蹤,如下圖所示:
找到可利用的點(diǎn),并根據(jù)代碼所示,進(jìn)入wp_updae_post函數(shù),如下圖所示:
此函數(shù)會經(jīng)過一些獲取參數(shù)的操作,將數(shù)組中的變量提取出來并進(jìn)行賦值,跟蹤到漏洞發(fā)生點(diǎn),如下圖所示:
發(fā)現(xiàn)返回wp_insert_attachment函數(shù),跟蹤此函數(shù),如下圖所示:
返回wp_insert_post函數(shù),跟蹤此函數(shù),在此函數(shù)中定位到漏洞發(fā)生點(diǎn),如下圖所示:
所以根據(jù)以上漏洞點(diǎn),可傳入meta_input[_wp_attached_file] =../evil.jpg?shell.php,執(zhí)行SQL語句為UPDATE `wp_postmeta` SET `meta_value` = ‘../evil.jpg?shell.php ‘ WHERE `post_id` = 8 AND `meta_key` = ‘_wp_attached_file’,測試條件為前提必須知道post_id,不過正常情況下更新圖片時(shí)會自帶此參數(shù),如果是測試的話,可以觀察數(shù)據(jù)庫填寫相關(guān)內(nèi)容。具體SQL語句嵌套執(zhí)行方法,如下圖所示:
通過傳入?yún)?shù),賦值到相對應(yīng)的表名和列名,最終執(zhí)行do_action函數(shù),如下圖所示:
在此完成wordpress目錄遍歷漏洞,并在之后利用本地文件包含漏洞執(zhí)行rce,wordpress官方使用圖像庫為GD和Imagick,如下圖所示:
其中Imagick并不是wordpress自帶,需要下載插件,所以默認(rèn)可以使用繞過GD庫的方法執(zhí)行任意代碼。