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