比如?#prefix?代表了在 Render 時(shí)元素的前綴,#suffix?代表了后綴。

通過查閱 Drupal 的代碼和文檔,可以知道,對(duì)于?#pre_render,#post_render、#submit、#validate?等變量,Drupal 通過?call_user_func?的方式進(jìn)行調(diào)用。

在 Drupal 中,對(duì)于?#pre_render?的處理如下:

所以如果我們能將這些變量注入到?$form?數(shù)組中,即可造成代碼執(zhí)行的問題。

但是由于 Drupal 代碼復(fù)雜,調(diào)用鏈很長(zhǎng),所以導(dǎo)致了所謂“開局一個(gè) #,剩下全靠猜”的尷尬局面,即使知道了漏洞觸發(fā)點(diǎn),但是找不到入口點(diǎn)一樣尷尬。直到昨日,CheckPoint 發(fā)布了一篇分析博客,我才注意到原來 Drupal 8.5 提供了 Ajax 上傳頭像的點(diǎn),并且明顯存在一個(gè)?$form?數(shù)組的操縱。在已經(jīng)知道觸發(fā)點(diǎn)的情況下,構(gòu)造剩下的 PoC 就非常容易了。

PoC 構(gòu)造

CheckPoint 提供的截圖顯示,是在 Drupal 8.5.0 注冊(cè)處,漏洞文件為:

\core\modules\file\src\Element\ManagedFile.php

代碼如下:

代碼第五行,取出?$_GET[“element_parents”]?賦值給$form_parents,然后進(jìn)入NestedArray::getValue?進(jìn)行處理:

NestedArray::getValue?函數(shù)的主要功能就是將?$parents?作為 key path,然后逐層取出后返回。舉個(gè)例子,對(duì)于數(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?時(shí)候造成代碼執(zhí)行:

Exploit 構(gòu)造

雖然實(shí)現(xiàn)了代碼執(zhí)行,但是?#pre_render?調(diào)用的參數(shù)是一個(gè)數(shù)組,所以導(dǎo)致我們不能任意的執(zhí)行代碼。不過 Render API 存在很多可以查看的地方,通過翻閱?Renderer::doRender?函數(shù),注意到?#lazy_builder:

#lazy_builder?是一個(gè) array,其中元素 0 為函數(shù)名,元素 1 是一個(gè)數(shù)組,是參數(shù)列表。接著利用?call_user_func_array?進(jìn)行調(diào)用。不過注意到上方這段代碼:

意思為傳入的?$elements?數(shù)組中不能存在除了?$supported_keys?之外的 key,常規(guī)傳入的數(shù)組為:

比要求的數(shù)組多了?#suffix?和?#prefix。不過 Render API 有 children element 的說法:

當(dāng)數(shù)組中的參數(shù)不以 # 開頭時(shí),會(huì)當(dāng)作 children element 進(jìn)行子渲染,所以我們傳入?mail[a][#lazy_builder]?,在進(jìn)行子渲染的過程中,就會(huì)得到一個(gè)干凈的數(shù)組,最終導(dǎo)致命令執(zhí)行。

其他版本

本文分析的是 Drupal 8.5.0,對(duì)于 8.4.x,在注冊(cè)時(shí)默認(rèn)沒有上傳頭像處,但是也可以直接進(jìn)行攻擊,對(duì)于 Drupal 7,暫時(shí)未找到可控點(diǎn)。

參考

https://research.checkpoint.com/uncovering-drupalgeddon-2/

應(yīng)對(duì)策略

為避免攻擊者進(jìn)行批量利用從而造成更大影響,騰訊云安全團(tuán)隊(duì)對(duì)云上與企業(yè)用戶做了以下兩個(gè)應(yīng)對(duì)策略:

一、如果您 Drupal 服務(wù)為官方源碼方式安裝,騰訊云安全團(tuán)隊(duì)建議升級(jí)更新。

1)Drupal 7.x版本:更新到Drupal 7.58 版本或者應(yīng)用補(bǔ)丁:

https://cgit.drupalcode.org/drupal/rawdiff/?h=7.x&id=2266d2a83db50e2f97682d9a0fb8a18e2722cba5

2)Drupal 8.5.x版本:更新到Drupal 8.5.1 版本或應(yīng)用補(bǔ)?。?/p>

https://cgit.drupalcode.org/drupal/rawdiff/?h=8.5.x&id=5ac8738fa69df34a0635f0907d661b509ff9a28f

3)Drupal 8.3.x:建議更新到 Drupal 8.3.9 版本或應(yīng)用補(bǔ)?。?/p>

https://cgit.drupalcode.org/drupal/rawdiff/?h=8.5.x&id=5ac8738fa69df34a0635f0907d661b509ff9a28f

4)Drupal 8.4.x: 建議更新到 Drupal 8.4.6 版本或應(yīng)用補(bǔ)丁:

https://cgit.drupalcode.org/drupal/rawdiff/?h=8.5.x&id=5ac8738fa69df34a0635f0907d661b509ff9a28f

二、部署騰訊云網(wǎng)站管家 ?WAF 服務(wù)

騰訊云網(wǎng)站管家 WAF 早在該漏洞公布后,第一時(shí)間更新防御規(guī)則,已經(jīng)部署騰訊云網(wǎng)站管家服務(wù)的用戶將不受此漏洞的威脅影響。

騰訊云網(wǎng)站管家 WAF,了解一下

主動(dòng)監(jiān)測(cè)并及時(shí)發(fā)現(xiàn)高危 Web 漏洞,0day 漏洞;騰訊安全團(tuán)隊(duì)7×24小時(shí)持續(xù)響應(yīng) 0day 漏洞,緊急漏洞問題;12h 內(nèi)更新高危漏洞防護(hù)補(bǔ)丁,24h 內(nèi)更新常見通用型漏洞防護(hù)補(bǔ)??;網(wǎng)站管家云端自動(dòng)升級(jí)針對(duì)漏洞的攻擊防護(hù)策略,全球秒級(jí)同步下發(fā);

需要防護(hù)請(qǐng)點(diǎn)擊:

https://cloud.tencent.com/product/waf

 

分享到

songjy

相關(guān)推薦