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字元串。並且此字元串用於鏈接替換。