CVE-2018-7600 Drupal核心遠端程式碼執行漏洞分析
0x01 漏洞介紹
Drupal是一個開源內容管理系統(CMS),全球超過100萬個網站(包括政府,電子零售,企業組織,金融機構等)使用。兩週前,Drupal安全團隊披露了一個非常關鍵的漏洞,編號CVE-2018-7600 Drupal對錶單請求內容未做嚴格過濾,因此,這使得攻擊者可能將惡意注入表單內容,此漏洞允許未經身份驗證的攻擊者在預設或常見的Drupal安裝上執行遠端程式碼執行。
0x02 漏洞分析
Drupal渲染陣列的情況有頁面載入和Ajax表單發出的請求,在這裡Ajax API呼叫是攻擊者最佳的選擇。那麼作為使用者登錄檔單的一部分,圖片欄位使用Ajax API將圖片上傳到伺服器,並且生成縮圖
查閱了相關文件資料現在,我們所要做的就是注入一個惡意渲染陣列,該陣列使用Drupal的渲染回撥方法在系統上執行程式碼。有幾個屬性我們可以注入:
#access_callback 標籤雖然callback回撥函式可控,但需要回調處理的字串不可控,導致無法利用。以下場景以post_render和lazy_builder為例
2.1、漏洞場景1:引入#post_render
#post_render
這個API標籤可以被所有的元素和表單使用,它是在drupal_render()方法中呼叫,可以渲染當前元素和子元素,也可對內容進行修改。
例子中$ element通過呼叫admin_form_html_cleanup函式處理返回處理後的結果。再來看可以觸發攻擊載荷的程式碼,在渲染的過程中呼叫了call_user_func進行回撥處理,但$callable 回撥函式通過表單偽造,$elements的子元素同樣也是通過表單可控
攻擊者利用攻擊載荷 mail[#post_render][]=passthru&mail[#type]=markup&mail[#markup]=whoami ,這裡的#markup是當前元素#type的子元素,通過陣列的方式傳入值,執行過程如圖
魔術方法__toString得到$this->string 等於whoami ,帶入到call_user_func中交給passthru函式執行,導致漏洞觸發
PHP內建函式pasthru執行後會回顯結果
2.2、漏洞場景2:引入#lazy_builder
#lazy_builder 可選,陣列值,必須有且只有兩個元素,一個是回撥函式名,一個回撥的引數,引數只能是NULL或者標量型別
$callable變數取#lazy_builder元素標籤陣列下標0的值作為回撥函式名,取陣列下標1的值當回撥方法的引數, 下面攻擊載荷呼叫PowerShell 遠端下載檔案到本地儲存為php網頁後門,程式碼如下圖
我們傳入的lazy_builder[0]和lazy_builder[1]的值在渲染的時候用call_user_func_array完成整個攻擊過程
整個漏洞的產生過程都是因為call_user_func或者call_user_func_array等回撥函式導致的任意程式碼執行,API元素標籤中可能還會觸發漏洞的標籤有#theme 、#create_placeholder、#theme_wrappers等等。
0x04 緩解措施
官方在最新版本8.5.1中增加了下圖方法
對請求的GET、POST、COOKIE 進行過濾處理
希望廣大使用者儘快升級到最新版本Drupal 8.5.1 , 下載地址:https://www.drupal.org/project/drupal/releases/8.5.1
0x05 Reference
https://research.checkpoint.com/uncovering-drupalgeddon-2/
https://github.com/g0rx/CVE-2018-7600-Drupal-RCE/blob/master/exploit.py