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