0x01 漏洞介紹 Drupal是一個開源內容管理系統(CMS),全球超過100萬個網站(包括政府,電子零售,企業組織,金融機構等)使用。兩周前,Drupal安全團隊披露了一個非常關鍵的漏洞,編號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