比如?#prefix?代表了在 Render 時元素的前綴,#suffix?代表了后綴。
通過查閱 Drupal 的代碼和文檔,可以知道,對于?#pre_render,#post_render、#submit、#validate?等變量,Drupal 通過?call_user_func?的方式進行調用。
在 Drupal 中,對于?#pre_render?的處理如下:
所以如果我們能將這些變量注入到?$form?數組中,即可造成代碼執(zhí)行的問題。
但是由于 Drupal 代碼復雜,調用鏈很長,所以導致了所謂“開局一個 #,剩下全靠猜”的尷尬局面,即使知道了漏洞觸發(fā)點,但是找不到入口點一樣尷尬。直到昨日,CheckPoint 發(fā)布了一篇分析博客,我才注意到原來 Drupal 8.5 提供了 Ajax 上傳頭像的點,并且明顯存在一個?$form?數組的操縱。在已經知道觸發(fā)點的情況下,構造剩下的 PoC 就非常容易了。
PoC 構造
CheckPoint 提供的截圖顯示,是在 Drupal 8.5.0 注冊處,漏洞文件為:
\core\modules\file\src\Element\ManagedFile.php
代碼如下:
代碼第五行,取出?$_GET[“element_parents”]?賦值給$form_parents,然后進入NestedArray::getValue?進行處理:
NestedArray::getValue?函數的主要功能就是將?$parents?作為 key path,然后逐層取出后返回。舉個例子,對于數組:
及?$parents:a/b/c,最后得到的結果為?456。
查看一下在正常上傳中,傳入的?$form:
似乎?#value?是我們傳入的變量,嘗試注入數組:
發(fā)現成功注入:
那么通過?NestedArray::getValue?函數,可以傳入?element_parents?為?account/mail/#value,最后可以令?$form?為我們注入的數組:
在 Render API 處理?#pre_render?時候造成代碼執(zhí)行:
Exploit 構造
雖然實現了代碼執(zhí)行,但是?#pre_render?調用的參數是一個數組,所以導致我們不能任意的執(zhí)行代碼。不過 Render API 存在很多可以查看的地方,通過翻閱?Renderer::doRender?函數,注意到?#lazy_builder:
#lazy_builder?是一個 array,其中元素 0 為函數名,元素 1 是一個數組,是參數列表。接著利用?call_user_func_array?進行調用。不過注意到上方這段代碼:
意思為傳入的?$elements?數組中不能存在除了?$supported_keys?之外的 key,常規(guī)傳入的數組為:
比要求的數組多了?#suffix?和?#prefix。不過 Render API 有 children element 的說法:
當數組中的參數不以 # 開頭時,會當作 children element 進行子渲染,所以我們傳入?mail[a][#lazy_builder]?,在進行子渲染的過程中,就會得到一個干凈的數組,最終導致命令執(zhí)行。
其他版本
本文分析的是 Drupal 8.5.0,對于 8.4.x,在注冊時默認沒有上傳頭像處,但是也可以直接進行攻擊,對于 Drupal 7,暫時未找到可控點。
參考
https://research.checkpoint.com/uncovering-drupalgeddon-2/
應對策略
為避免攻擊者進行批量利用從而造成更大影響,騰訊云安全團隊對云上與企業(yè)用戶做了以下兩個應對策略:
一、如果您 Drupal 服務為官方源碼方式安裝,騰訊云安全團隊建議升級更新。
1)Drupal 7.x版本:更新到Drupal 7.58 版本或者應用補?。?/p>
https://cgit.drupalcode.org/drupal/rawdiff/?h=7.x&id=2266d2a83db50e2f97682d9a0fb8a18e2722cba5
2)Drupal 8.5.x版本:更新到Drupal 8.5.1 版本或應用補?。?/p>
https://cgit.drupalcode.org/drupal/rawdiff/?h=8.5.x&id=5ac8738fa69df34a0635f0907d661b509ff9a28f
3)Drupal 8.3.x:建議更新到 Drupal 8.3.9 版本或應用補?。?/p>
https://cgit.drupalcode.org/drupal/rawdiff/?h=8.5.x&id=5ac8738fa69df34a0635f0907d661b509ff9a28f
4)Drupal 8.4.x: 建議更新到 Drupal 8.4.6 版本或應用補?。?/p>
https://cgit.drupalcode.org/drupal/rawdiff/?h=8.5.x&id=5ac8738fa69df34a0635f0907d661b509ff9a28f
二、部署騰訊云網站管家 ?WAF 服務
騰訊云網站管家 WAF 早在該漏洞公布后,第一時間更新防御規(guī)則,已經部署騰訊云網站管家服務的用戶將不受此漏洞的威脅影響。
騰訊云網站管家 WAF,了解一下
主動監(jiān)測并及時發(fā)現高危 Web 漏洞,0day 漏洞;騰訊安全團隊7×24小時持續(xù)響應 0day 漏洞,緊急漏洞問題;12h 內更新高危漏洞防護補丁,24h 內更新常見通用型漏洞防護補丁;網站管家云端自動升級針對漏洞的攻擊防護策略,全球秒級同步下發(fā);
需要防護請點擊:
https://cloud.tencent.com/product/waf