HackerOne | GitLab中Wiki頁面存儲型XSS

  • 2019 年 12 月 15 日
  • 筆記

漏洞資訊

發現者:ryhmnlfj

漏洞種類:存儲型xss

危害等級:高危

漏洞狀態:已修復

前言

Ryhmnlfj發現GitLab的Wiki特定的分層鏈接Markdown存在存儲型XSS漏洞。

漏洞再現

1、登錄到GitLab

2.、打開您有權編輯Wiki頁面的「項目」頁面

3、打開Wiki頁面

4、點擊」New page」 按鈕

5、Page slug項填寫javascript:

6、點擊」 Create page」按鈕

7、填寫表單如下

Title: javascript; Format: Markdown Content: [XSS](.alert(1);)

8、點擊」 Create page」按鈕

9、在創建的頁面中點擊」XSS」鏈接

單擊創建頁面中的「 XSS」鏈接後,將出現alert對話框

詳細說明

GitLab應用程式將Markdown字元串.alert(1);轉換為href屬性javascript:alert(1);

在這種情況下,Wiki特定的Markdown字元串.轉換為javascript:

漏洞影響

1、應過濾危險的鏈接屬性javascript:alert(1);

2、提交一個安全的HTTP/HTTPS鏈接

附加資訊

1、另一個特定Wiki的Markdown字元串..也會被轉換為javascript:

2、使用標題字元串像javascript:STRING_EXPECTED_REMOVING也會重現此漏洞。例如,如果使用偽裝的title字元串JavaScript::SubClassName.function_name創建一個這個wiki頁面,則GitLab應用程式會將Wiki特定的Markdown字元串.轉換JavaScript:

3、攻擊者可以用各種方式來替換title字元串javascript: (例如data:, vbscript:, 等)

存在此漏洞的Gitlab版本資訊為11.9.4-ee

附加影響

如果使用該漏洞創建的Wiki頁面在「公共」項目中對所有人都是可見的(「 Wiki可見性」設置為「具有訪問許可權的所有人」),則可能有相當數量的GitLab用戶和訪問者單擊惡意鏈接。

提交第一份報告後,我研究了後端源程式碼。結果,我發現了一些新東西,因此我發送了此附加報告。儘管您的緩解措施可能已經在進行中或已完成,但我希望此報告能幫助您進行審核和測試。

我研究的環境是GitLab Enterprise Edition的官方Docker安裝11.10.4-ee

程式碼分析

在GitLab應用程式將Markdown文本轉換為HTML Markup文本後,它將執行URI字元串重建和鏈接替換,作為Wiki特定的處理。問題在於此時沒有對重構的URI字元串執行任何過濾。這是執行URI字元串重構的程式碼:

lib/banzai/filter/wiki_link_filter/rewriter.rb

def apply_rules            # Special case: relative URLs beginning with `/uploads/` refer to            # user-uploaded files will be handled elsewhere.            return @uri.to_s if public_upload?              # Special case: relative URLs beginning with Wikis::CreateAttachmentService::ATTACHMENT_PATH            # refer to user-uploaded files to the wiki repository.            unless repository_upload?              apply_file_link_rules!              apply_hierarchical_link_rules!            end              apply_relative_link_rules!            @uri.to_s          end            private            # Of the form 'file.md'          def apply_file_link_rules!            @uri = Addressable::URI.join(@slug, @uri) if @uri.extname.present?          end            # Of the form `./link`, `../link`, or similar          def apply_hierarchical_link_rules!            @uri = Addressable::URI.join(@slug, @uri) if @uri.to_s[0] == '.'          end

apply_hierarchical_link_rules!函數執行URL字元串重構。如果Title是JavaScript::ClassName.function_name並且內容是[XSS](.alert(1);),在wiki頁面創建表單,@slug和@uri被Addressable::URI.join函數合併。

但是內部解析時Addressable::URI.join函數分別從@slug刪除:ClassName.function_name,從@uri刪除.(我在第一份報告中寫到.被轉換為JavaScript:,但實際上是分別從每個變數中刪除了不必要的字元串。)

問題在於,對Addressable::URI.join函數重構的URI字元串未執行過濾。在這種情況下,apply_rules函數將按原樣返回重構的URI字元串。並且此字元串用於鏈接替換。