WF曲速未來(lái) 消息:邪惡的老師——Moodle中的代碼注入區(qū)塊鏈
Moodle通常集成到更大的系統(tǒng)中,將WebMailer,電子學(xué)習(xí)平臺(tái)和其他技術(shù)加入到單一體系結(jié)構(gòu)中,共享帳戶憑據(jù)跨越一個(gè)巨大的攻擊面,以供未經(jīng)身份驗(yàn)證的攻擊者進(jìn)行網(wǎng)絡(luò)釣魚(yú)或提取教師帳戶的憑據(jù)。
概要
在這篇文章中,說(shuō)明了Moodle中的一個(gè)關(guān)鍵漏洞。Moodle通常集成到更大的系統(tǒng)中,將WebMailer,電子學(xué)習(xí)平臺(tái)和其他技術(shù)加入到單一體系結(jié)構(gòu)中,共享帳戶憑據(jù)跨越一個(gè)巨大的攻擊面,以供未經(jīng)身份驗(yàn)證的攻擊者進(jìn)行網(wǎng)絡(luò)釣魚(yú)或提取教師帳戶的憑據(jù)。在某些情況下,存在一個(gè)用于請(qǐng)求Moodle課程的自動(dòng)服務(wù),該服務(wù)將利用學(xué)生的權(quán)利進(jìn)入他可以執(zhí)行他選擇的惡意軟件的位置,并在他參加的大學(xué)課程中為自己評(píng)定長(zhǎng)期A。
Moodle是一種廣泛使用的開(kāi)源電子學(xué)習(xí)軟件,擁有超過(guò)1.27億用戶,允許教師和學(xué)生以數(shù)字方式管理課程活動(dòng)和交換學(xué)習(xí)材料,這些材料通常由大型大學(xué)部署。但檢測(cè)到的先前Moodle版本中的關(guān)鍵漏洞的技術(shù)內(nèi)在性。它位于Moodle的Quiz組件中,可以通過(guò)教師角色成功利用,以執(zhí)行遠(yuǎn)程代碼執(zhí)行。如果您正在運(yùn)行Moodle <3.5.0,就強(qiáng)烈建議您立即將實(shí)例更新到最新版本。
影響 - 誰(shuí)可以利用什么?
必須在使用默認(rèn)配置運(yùn)行的最新Moodle(早于3.5.0)的過(guò)程中為攻擊者分配教師角色。通過(guò)另一個(gè)漏洞(例如XSS)升級(jí)到此角色也是可能的。鑒于這些要求和漏洞的知識(shí),攻擊者將能夠在運(yùn)行Moodle的服務(wù)器的底層操作系統(tǒng)上執(zhí)行任意命令。通過(guò)使用由Moodle評(píng)估的特制數(shù)學(xué)公式 - 攻擊者繞過(guò)內(nèi)部安全機(jī)制,阻止惡意命令的執(zhí)行。
測(cè)驗(yàn)組件中的數(shù)學(xué)公式
Moodle允許教師設(shè)置包含多種類(lèi)型問(wèn)題的測(cè)驗(yàn)。其中包括計(jì)算出的問(wèn)題,允許教師輸入一個(gè)數(shù)學(xué)公式,由Moodle動(dòng)態(tài)評(píng)估隨機(jī)輸入變量。這可以防止學(xué)生作弊并簡(jiǎn)單地分享他們的結(jié)果。例如,教師可以輸入{x}添加到{y}的內(nèi)容?答案公式為{x} {y}。然后,Moodle將生成兩個(gè)隨機(jī)數(shù),并在問(wèn)答文本(例如3.9 2.1)中為占位符{x}和{y}插入它們。最后,它將通過(guò)調(diào)用安全敏感的PHP函數(shù)來(lái)評(píng)估答案6.0eval()公式輸入因其惡意潛力而眾所周知,因?yàn)樗试S執(zhí)行任意PHP代碼。
為了強(qiáng)制使用無(wú)害的PHP代碼,Moodle的開(kāi)發(fā)人員引入了一個(gè)驗(yàn)證函數(shù)qtype_calculated_find_formula_errors(),該函數(shù)在危險(xiǎn)調(diào)用之前被eval()調(diào)用,目的是檢測(cè)教師提供的公式中的非法和惡意代碼。
開(kāi)發(fā)旁路
正如你在上面的源代碼中所看到的,最后一次preg_match()調(diào)用,是在1939,非常嚴(yán)格,并且將禁止除- /*%>:^\~<?=&|!.0-9eE公式中的左側(cè)之外的任何字符。然而,先前的str_replace()嵌套在一個(gè)while循環(huán)中對(duì)line 1927將取代公式中類(lèi)似于所有的占位符{x}的1遞歸。對(duì)應(yīng)的正則表達(dá)式表示占位符的名稱(chēng)在其字符集的考慮幾乎沒(méi)有限制{system(ls)}是有效的占位符,并也將受到1所取代的line 1928。這個(gè)事實(shí)指向一個(gè)弱點(diǎn),因?yàn)樗鼤?huì)preg_match()在函數(shù)返回之前隱藏安全調(diào)用中的所有潛在惡意字符false表示有效的公式。使用此技術(shù)隱藏惡意代碼并將其與嵌套占位符組合,會(huì)出現(xiàn)可利用的漏洞。
驗(yàn)證器拒絕第一個(gè)惡意公式qtype_calculated_find_formula_errors()。如果將它作為占位符并將其嵌入大括號(hào)中,如第二個(gè)有效負(fù)載所示,驗(yàn)證器將不會(huì)檢測(cè)到我們的攻擊,但Moodle將1.2在它到達(dá)之前用隨機(jī)數(shù)替換我們的占位符eval()。但是,如果我們引入另一個(gè)占位符并將其嵌入到我們已有的占位符中,Moodle將只替換內(nèi)部占位符,并且將在表eval()的第三行中看到一個(gè)危險(xiǎn)的剩余占位符。此時(shí),由于輸入的原因,我們的有效負(fù)載將拋出PHP語(yǔ)法錯(cuò)誤eval()是無(wú)效的PHP代碼。因此,我們只需要糾正PHP語(yǔ)法,方法是使用PHP注釋從PHP解析器中排除無(wú)效部分,從而得到第4行的最終有效公式,最終允許通過(guò)GET參數(shù)0執(zhí)行代碼。
適應(yīng)不足的補(bǔ)丁
Moodle了解問(wèn)題后,他們立即做出了一個(gè)快速解決問(wèn)題的補(bǔ)丁。但是,再重新掃描應(yīng)用程序后,仍然被檢測(cè)到相同的漏洞,指向繞過(guò)剛剛引入的漏洞補(bǔ)丁。在更精確地檢查相關(guān)的源代碼結(jié)果之后,能夠繞過(guò)補(bǔ)丁并實(shí)現(xiàn)與以前相同的影響。對(duì)于前三個(gè)提議的補(bǔ)丁,這是可能的,我們將在下一個(gè)小節(jié)中解釋每個(gè)旁路。
第一個(gè)補(bǔ)丁:黑名單
Moodle開(kāi)發(fā)人員提出的第一個(gè)補(bǔ)丁是基于拒絕包含漏洞有效負(fù)載中使用的PHP注釋的公式的想法。正如你在代碼中看到的那樣,補(bǔ)丁前置了一個(gè)foreach循環(huán),用于檢查公式是否包含特定字符串。
這個(gè)補(bǔ)丁使我們當(dāng)前的有效載荷不能作為驗(yàn)證功能qtype_calculated_find_formula_errors()檢測(cè)其發(fā)起的PHP注釋字符串//,/*,#在我們使用的電流攻擊的有效載荷。此修補(bǔ)程序?qū)崿F(xiàn)了黑名單方法,并基于以下假設(shè):沒(méi)有攻擊者能夠?qū)⑸媳碇械?行的第3列的無(wú)效PHP語(yǔ)法更正為有效的PHP語(yǔ)法而不使用注釋。但是,補(bǔ)丁程序不足并允許利用此有效負(fù)載的更復(fù)雜版本。
二個(gè)補(bǔ)丁:拒絕嵌套占位符
第二個(gè)補(bǔ)丁的想法是通過(guò)在檢測(cè)占位符時(shí)刪除“遞歸”來(lái)防止在我們的有效負(fù)載中使用的嵌套占位符。但同樣,再重新掃描應(yīng)用程序仍然報(bào)告了相同的漏洞,這使我們更精確地查看以下新代碼行。
每當(dāng)我們輸入一個(gè)嵌套占位符時(shí),{a}該方法qtype_calculated_find_formula_errors()現(xiàn)在只替換占位符,并且剩余的公式{a1}被檢測(cè)為非法。但是,如果我們將公式改為{a1}{a}兩個(gè)占位符,{a1}并由函數(shù)檢測(cè)并返回find_dataset_names()。一個(gè)接一個(gè)地,每個(gè)占位符都在foreach循環(huán)中替換,從我們開(kāi)始并離開(kāi)我們的公式1{a1}{a1}。最后,在替換{a1}公式等于111并且驗(yàn)證器批準(zhǔn)嵌套占位符,從而打破了此修補(bǔ)程序的意圖。考慮到這個(gè)技巧,我們只需要適當(dāng)調(diào)整我們的最后一個(gè)有效負(fù)載,以獲得與以前相同的關(guān)鍵效果:
第三個(gè)補(bǔ)?。汉诿麊魏途€性替換
第三個(gè)補(bǔ)丁結(jié)合了前兩種方法,看起來(lái)非常適合防止嵌套占位符。但是,如果攻擊者瞄準(zhǔn)了Quiz組件的導(dǎo)入功能并重新導(dǎo)入了惡意破壞的XML問(wèn)題文件,則攻擊者能夠控制(參見(jiàn)此處)的$dataset參數(shù)并使占位符替換無(wú)效。substitute_variables()
突出顯示的行顯示XML文件{x}在1951行上定義占位符的名稱(chēng)。此占位符從不在1946行中的公式中使用。這將使我們的危險(xiǎn)占位符的替換無(wú)效,{system($_GET[0])}并導(dǎo)致我們?cè)谥暗难a(bǔ)丁中遇到的相同代碼注入漏洞。
首先要感謝Moodle團(tuán)隊(duì)在修補(bǔ)問(wèn)題時(shí)的快速響應(yīng)。WF曲速未來(lái)建議更新到最新的Moodle版本。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來(lái)源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來(lái)源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為T(mén)MT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。