1. 漏洞概述

此報告提供了對 Novarain/Tassos Framework 中關鍵漏洞的全面技術分析。該框架是一個系統外掛程式,廣泛部署於多個 Joomla! 擴充套件中。這些漏洞包括未經身分驗證的任意檔案讀取、未經身分驗證的任意檔案刪除以及 SQL Injection,攻擊者可串聯這些漏洞在未修補的 Joomla! 網站上實現遠端程式碼執行 (RCE) 和管理員帳戶接管 [1] 。本次分析將深入探討這些缺陷的技術機制,檢視相關程式碼片段,並討論緩解策略,同時借鑒一般安全性最佳實務及相關研究的見解 [2] [3]

Joomla Tassos Framework致命組合:AJAX觸發SQLi竊取權限,再用檔案刪除埋下後門 | 資訊安全新聞

1. 漏洞概述

Novarain/Tassos Framework 以 plg_system_nrframework 的形式發布,是 Convert Forms、EngageBox、Google Structured Data、Advanced Custom Fields 和 Smile Pack 等多種 Joomla! 擴充套件的基礎組件。原始碼審查發現,該框架的設計缺陷共同構成了一個嚴重的安全態勢,使攻擊者能夠嚴重危害受影響的系統。主要漏洞如下:

  • 未經身分驗證的任意檔案讀取: 允許攻擊者讀取伺服器上 Joomla! 執行使用者有權限存取的任何檔案。
  • 未經身分驗證的任意檔案刪除: 允許攻擊者刪除伺服器上的任意檔案。
  • SQL Injection: 可導致任意資料庫讀取,可能洩露敏感資訊。

單獨來看,這些漏洞各自構成重大風險。然而,將它們組合起來則會形成一個強大的攻擊鏈,可將權限提升至完整的遠端程式碼執行,這凸顯了在所有程式碼路徑上進行徹底的安全性驗證及持續套用安全控制措施的重要性 [3]

2. 進入點: onAjaxNrframework 方法

攻擊鏈始於一個未經驗證的 AJAX 請求,該請求由 plg_system_nrframework 外掛程式中的 onAjaxNrframework 方法處理。此方法設計用於在端點 ?option=com_ajax&format=raw&plugin=nrframework 監聽 AJAX 請求。關鍵在於,它存在一個邏輯缺陷,允許未經驗證的使用者執行特定任務,尤其是 include 任務。

來自 nrframework.php 的相關程式碼片段如下:

  1. public function onAjaxNrframework()
  2. {
  3. Session::checkToken('request') or jexit(Text::_('JINVALID_TOKEN'));
  4. // Check if we have a valid task
  5. $task = $this->app->input->get('task', null);
  6. $non_admin_tasks = [
  7. 'include'
  8. ];
  9. // Only in backend
  10. if (!in_array(strtolower($task), $non_admin_tasks) && !$this->app->isClient('administrator'))
  11. {
  12. return;
  13. }
  14. // Check if we have a valid method task
  15. $taskMethod = 'ajaxTask' . $task;
  16. if (!method_exists($this, $taskMethod))
  17. {
  18. die('Task not found');
  19. }
  20. $this->$taskMethod();
  21. }

如上所示, $non_admin_tasks 陣列明確將 'include' 列為無需管理員權限即可存取的任務。這使得攻擊者能夠繞過身分驗證檢查,透過在其 AJAX 請求中將 task 參數設定為 include ,直接呼叫 ajaxTaskInclude 方法 [1]

3. ajaxTaskInclude 方法及其影響

這些漏洞的利用主要依賴於 ajaxTaskInclude 方法。它根據使用者提供的輸入動態建構檔案路徑和類別名稱,然後嘗試引入指定的 PHP 檔案,並在指定類別中呼叫 onAjax 方法。這種缺乏健全驗證的動態引入機制是一個關鍵的安全缺陷。

ajaxTaskInclude 的漏洞程式碼如下所示:

  1. private function ajaxTaskInclude()
  2. {
  3. $input = $this->app->input;
  4. $file = $input->get('file');
  5. $path = JPATH_SITE . '/' . $input->get('path', '', 'RAW');
  6. $class = $input->get('class');
  7. $file_to_include = $path . $file . '.php';
  8. if (!file_exists($file_to_include))
  9. {
  10. die('FILE_ERROR');
  11. }
  12. @include_once $file_to_include;
  13. if (!class_exists($class))
  14. {
  15. die('CLASS_ERROR');
  16. }
  17. if (!method_exists($class, 'onAJAX'))
  18. {
  19. die('METHOD_ERROR');
  20. }
  21. (new $class())->onAJAX($input->getArray());
  22. }

此函數接受三個主要輸入: file path class path 參數與 JPATH_SITE 連接,然後再與 file .php 副檔名連接,形成 $file_to_include 。隨後,程式碼嘗試引入此檔案,並實例化使用者指定的 $class ,呼叫其 onAJAX 方法。由於對 file path class 缺乏嚴格的輸入驗證,攻擊者得以控制引入的 PHP 檔案以及執行的類別方法,為各種攻擊打開了大門 [1]

4. 利用 ajaxTaskInclude 的特定漏洞

4.1. 任意檔案讀取

ajaxTaskInclude 所導致的最重大漏洞之一是任意檔案讀取。此漏洞可透過 plugins/system/nrframework/fields/nrchainedfields.php 中的 onAjax 方法來進行攻擊。該方法目的為載入 CSV 資料,但其實作存在缺陷。

nrchainedfields.php onAjax 方法的相關部分為:

  1. public function onAjax($options)
  2. {
  3. $options = new Registry($options);
  4. // ... input validation for select_id, value, data_source, csv ...
  5. // get all CSV data
  6. if (!$this->choices = \Tassos\Framework\Helpers\ChainedFields::loadCSV($csv, $data_source, $this->separator, $this->id . '_', $this->name))
  7. {
  8. echo json_encode([
  9. 'error' => true,
  10. 'response' => Text::_('NR_CANNOT_PROCESS_REQUEST')
  11. ]);
  12. jexit();
  13. }
  14. // ...
  15. }

ChainedFields::loadCSV() 方法負責載入 CSV 檔案內容。然而,由於對檔案類型和路徑的驗證不足,攻擊者可以操控 csv data_source 參數,指向伺服器上的任意檔案。這使他們能夠讀取 Joomla! 程序具有讀取權限的任何檔案的內容,從而有效實現任意檔案讀取 [1] 。例如,攻擊者可以讀取設定檔案、密碼雜湊或其他敏感資料。

4.2. 任意檔案刪除

另一個嚴重漏洞源於 plugins/system/nrframework/fields/nrinlinefileupload.php 中的 onAjax 方法。此方法處理檔案上傳和移除。具體來說,當 action 參數設定為 remove 時,它會呼叫 onRemove 方法,而該功能存在可被利用以刪除任意檔案的漏洞。

onRemove 方法的程式碼如下:

  1. private function onRemove($options)
  2. {
  3. if (!$file = $options->get('remove_file'))
  4. {
  5. echo json_encode([
  6. 'error' => true,
  7. 'response' => Text::_('NR_UPLOAD_ERROR_INVALID_FILE')
  8. ]);
  9. jexit();
  10. }
  11. // If file exists, remove it
  12. if (file_exists($file))
  13. {
  14. unlink($file);
  15. }
  16. echo json_encode([
  17. 'error' => false,
  18. 'response' => Text::_('NR_FILE_DELETED')
  19. ]);
  20. jexit();
  21. }

這裡的漏洞很直接:攻擊者直接控制的 remove_file 參數未經任何清理或驗證就被傳遞給 unlink() 函數。這使得攻擊者可以指定伺服器上的任何檔案路徑,從而刪除任意檔案。此漏洞可用於刪除關鍵系統檔案、設定檔案,甚至是與安全相關的檔案(如 .htaccess .htpasswd ),這可能會導致進一步的攻擊 [1]

4.3. SQL Injection

第三個主要漏洞是 SQL Injection 缺陷,存在於 plugins/system/nrframework/fields/ajaxify.php onAjax 方法中,該方法由 plugins/system/nrframework/fields/componentitems.php 繼承。 componentitems.php 類別繼承了這些有漏洞的方法,並包含用於資料庫存取和讀取的程式碼。

ajaxify.php 中的 onAjax 方法處理各種選項,包括 limit page search_term ,這些選項用於建構資料庫查詢。關鍵問題在於,使用者為這些參數提供的輸入,在未經適當清理或使用參數化查詢的情況下,直接被組合進 SQL query 中。這與一般 SQL Injection 防禦策略中討論的問題相似,即寬鬆的型別處理和直接的字串連接是漏洞產生的主要原因 [2]

雖然原始揭露中未詳細說明確切的 SQL query 建構方式,但報告指出,能夠影響用於資料庫存取的資料,實際上就構成了 SQL Injection 漏洞。這使得攻擊者可以讀取 Joomla! 指定使用者有權限存取的任何資料表和欄位 [1]

5. 串聯漏洞以實現遠端程式碼執行 (RCE)

當這些單一漏洞被串聯起來以實現遠端程式碼執行 (RCE) 時,其真正的嚴重性便顯現出來。一個典型的攻擊鏈涉及多個步驟:

  1. 利用 SQL Injection 竊取管理員連線: 攻擊者可利用 SQL Injection 漏洞查詢資料庫,以獲取啟用中的超級管理員連線。這使他們能夠取得連線 cookie 或其他 authentication tokens,從而冒充管理員 [1]
  2. 利用任意檔案刪除繞過安全機制: 在取得管理員權限後(甚至在此之前,如果知道特定的安全檔案位置),可利用任意檔案刪除漏洞移除安全限制。例如,刪除 .htpasswd 檔案或其他身分驗證機制,可能直接授予對管理介面的存取權限 [1]
  3. 取得管理員權限並上傳網頁後門: 一旦攻擊者取得 Joomla! 後台的管理員權限,他們就可以上傳惡意擴充套件或修改現有的模板 PHP 檔案。這實際上使他們能夠上傳並執行網頁後門,從而完全控制受入侵的伺服器 [1]

此攻擊鏈展示了看似不同的漏洞如何結合起來造成毀滅性的影響。正如在不完整安全覆蓋的情境中所強調的那樣,缺乏全面的安全性驗證會導致這些缺陷持續存在並被利用 [3]

graph TD A[Unauthenticated
AJAX Request] --> B{"onAjaxNrframework
(task=include)"} B --> C[ajaxTaskInclude] C --> D{User-Controlled
File/Class Inclusion} D --> E1["nrchainedfields.php
(Arbitrary File Read)"] D --> E2["nrinlinefileupload.php
(Arbitrary File Deletion)"] D --> E3["ajaxify.php/
componentitems.php
(SQL Injection)"] E3 --> F1[Dump Admin Sessions] E2 --> F2["Delete Security Files
(.htpasswd)"] F1 & F2 --> G[Gain Admin Access] G --> H[Upload Web Shell /
Modify Templates] H --> I["Remote Code Execution
(RCE)"]

圖 1:實現遠端程式碼執行的攻擊鏈

6. 緩解指引

為防止此類漏洞,開發人員和系統管理員必須採用多層次的安全方法。以下指引至關重要:

  • 立即修補: 始終及時安裝廠商發布的修補程式和更新。對於 Novarain/Tassos Framework,更新到已修補的版本(例如,Novarain/Tassos Framework v6.0.37+,Convert Forms v5.1.0+)至關重要 [1]
  • 輸入驗證與清理: 對所有使用者提供的資料實施嚴格的輸入驗證。這包括型別檢查、長度限制和字元白名單。絕不直接信任使用者輸入。
  • 參數化查詢: 對於資料庫互動,始終使用參數化查詢(Parameterized queries)或預備陳述式(Prepared statements)以防止 SQL Injection。這確保使用者輸入被視為資料而非可執行程式碼,有效地將資料與指令分離 [2]
  • 安全的檔案操作: 在處理檔案上傳、刪除或引入時,實施強健的檢查,確保檔案路徑在預期邊界內,並嚴格控管檔案類型。避免利用未經驗證的使用者輸入進行動態檔案引入。正規化路徑以及對允許的字元和路徑結構使用白名單至關重要 [3]
  • 最小權限原則: 確保網頁伺服器程序和資料庫使用者僅具備必要的最小權限。這可以限制成功利用漏洞所帶來的影響。
  • 網頁應用程式防火牆 (WAF): 部署 WAF 以過濾和封鎖惡意請求,特別是針對已知有漏洞的端點或包含可疑模式的請求。限制對 ?option=com_ajax 端點的存取可以減少曝險面 [1]
  • 安全稽核與程式碼審查: 定期進行安全稽核和程式碼審查,以在漏洞被利用前識別並修復它們。透過原始碼審查發現這些缺陷,凸顯了此實務的重要性 [1]
  • 一致的安全覆蓋: 正如 Monsta FTP RCE 案例所強調的,安全控制措施應用不一致可能導致繞過。確保對所有處理使用者提供資料的程式碼路徑,特別是影響檔案系統操作的程式碼路徑,普遍且一致地套用安全性驗證常式 [3]

7. 結論

Joomla! Novarain/Tassos Framework 中的漏洞清楚地提醒我們保護網頁應用程式的複雜性。未經驗證的存取、動態程式碼引入以及輸入驗證不足的組合,為嚴重的漏洞利用創造了肥沃的土壤,最終導致遠端程式碼執行。透過了解這些缺陷的技術細節並採用全面的安全實務,開發人員和系統管理員可以顯著增強其應用程式抵禦類似威脅的能力。強調嚴格的輸入驗證、參數化查詢、安全的檔案處理以及一致的安全覆蓋,對於建構穩固且安全的軟體系統至關重要。