原型污染是一個有趣的漏洞,無論是服務器端還是客戶端。基於應用邏輯,原型污染會導致其他漏洞。例如,posix 引入了一種有趣的技術來在模板引擎中實現RCE,MichałBentkowski 展示了繞過客戶端HTML 清理程序,而William Bowling 使用原型污染在HackerOne 上發現了一個反射型XSS。從RCE 到SQL,任何漏洞都可能與javascript 應用程序中的原型污染有關。
介紹在這項研究中,我們的目標很簡單,即掃描所有漏洞披露程序的原型污染,並找到實現XSS 的腳本小工具。這篇技術文章將涉及我們創建的工具、面臨的挑戰以及整個過程中的案例研究。
我們對Web 應用程序感興趣的兩種情況是檢查它是否容易受到原型污染。
情況1在第一種情況下,我們要檢查應用程序是否正在解析查詢/哈希參數,並檢查它是否在過程中污染原型。我們發現80% 的嵌套參數解析器容易受到原型污染的影響。
讓我們假設Web 應用程序使用canjs-deparam 庫來解析查詢參數。正如你在下面的代碼中看到的,它創建了一個空對象並添加了鍵值對。顯然,如果我們請求的URL 是https://victim.com/#a=b__proto__[admin]=1,這會導致原型污染。
如你所想,通過在location.hash 和location.search 中迭代不同的原型污染有效負載,很容易識別應用程序是否具有易受攻擊的原型污染解析器。
以下是查詢字符串的不同變體,這些變體在解析時可能會導致污染。
SeleniumBot為了實現自動化,我們編寫了一個seleniumBot,它運行在一個巨大的子域數據庫上,並檢查應用程序是否存在漏洞。
瀏覽器擴展Bot的一個漏洞是我們無法掃描應用程序的目錄和授權終端,因為數據庫變得非常大,掃描需要幾天時間,且大多數程序禁止掃描。為了解決這個漏洞,我們編寫了一個chrome 擴展,其運行邏輯與Bot相同,但它會在用戶訪問chrome 中的特定終端時進行掃描。使用擴展程序,我們可以隨便使用chrome,並在後台掃描原型污染,你可以在這裡找到插件。
情況2在這種情況下,我們要檢查是否有任何功能在客戶端的用戶輸入或某些數據/響應處理導致原型污染,大多數情況下這會導致self-XSS,因為攻擊者無法控制輸入如情況1 中的來自該位置輸入。但它值得掃描,大多數時候self-XSS可以轉換為reflection-XSS。
幸運的是,在這種情況下,自動化有點困難,CodeQL 使事情變得更容易。我們只選擇了收入最高的頂級程序,並轉儲了所有的javascript 文件,創建了一個CodeQL 數據庫,並掃描了導致原型污染的模式。
這樣,我們就能夠找到一個用戶控制的JSON,他可以與另一個導致原型污染的應用程序合併。
識別易受攻擊的庫一旦Bot識別出易受攻擊的應用程序,我們的下一個任務是識別易受攻擊的庫和原型被污染的確切行,並將結果存儲在數據庫中。為了識別,我們使用了幾種不同的技術。
如果應用程序並不復雜,在Chrome 開發者工具中搜索諸如location.hash/decodeURIComponent/location.search 之類的關鍵字將導致找到易受攻擊的實現的確切功能。
在Firefox 中阻止JS 資源請求在Firefox 開發者工具網絡活動中有一個很好的選項叫做Block URL,所以為了找到負責原型污染的js 資源,我們阻止URL 並檢查污染的屬性是否未定義。
setter 上的調試器斷點這種技術比其他技術更簡單,當屬性設置為object .prototype時,我們可以設置一個斷點。
查找腳本小工具什麼是腳本小工具?在某個屬性被污染後,是否有應用程序邏輯或函數會導致Javascript執行?
讓我們看一個在SwiftType Search庫中找到的腳本小工具的簡單示例。實現XSS的有效負載是https://example.com/#__proto__[xxx]=alert(1)。
下面是一段代碼(腳本小工具)負責彈出警報,$.each 迭代this._userServerConfiguration.install.hooks 對像以及原型上的屬性,這導致我們被污染的屬性xxx 被評估。
基於這個應用程序,我們使用了不同的技術來查找腳本小工具。
關鍵字搜索和源代碼審查如果應用比較簡單,我們可以搜索srcdoc/innerHTML/iframe/createElement 等關鍵字,查看源代碼,檢查是否導致javascript 執行。有時,提到的技術可能根本找不到小工具。在這種情況下,純源代碼審查會顯示一些不錯的小工具,如下例所示。
BlackFan 通過源代碼審查在jQuery 中發現了這個很酷的小工具。
小工具
這是一段小工具的代碼:
SecurityMB 的pollute.js我們已經圍繞SecurityMB 的pollute.js 編寫了一個burp 擴展,它將所有JS 資源替換為由pollute.js 生成的修改版本。此外,我們修改了pollute.js,使其僅在某個屬性受到污染時才記錄信息。
pollute.js 的基本思想是它通過在所有屬性訪問周圍添加調試函數來檢測代碼,該函數會記錄訪問Object.prototype 屬性時的確切訪問行。
檢查下面的插件。
注意:插件並不完美,tmp.js 可能會被覆蓋,最好使用一個隨機名稱。
Filedescriptor 的不受信任類型擴展不受信任類型通過濫用可信類型來記錄DOM sink,我們檢查這些DOM sinks是否有任何可能被污染的屬性,進而導致XSS。
如果你在安裝了插件的情況下訪問https://msrkp.github.io/,你會注意到jQuery 中的一個innerHTML sink。其中,wrapMap[tag] 是未定義的,這意味著我們可以用數組污染wrapMap 的“li”屬性,並且第一個或第二個元素將被注入到頁面中。
通過污染“li”屬性導致XSS類似於文件描述符的擴展securitymb的pollution .js記錄類似的堆棧跟踪,我們必須檢查源代碼,並檢查它是否導致手動XSS。
一旦找到這個小工具,我們就向相應的程序報告這個漏洞。
將易受攻擊的庫和小工具存儲在數據庫中我們計劃將所有易受攻擊的小工具和庫存儲在數據庫中。
在構建了易受攻擊的庫和腳本、小工具的數據庫後,可以使用它來促進Prototype Pollution 的搜索和利用。
例如,在某些情況下,JavaScript 代碼中存在易受攻擊的庫,但會在特定條件下執行。為了覆蓋這些變體,可以使用正則表達式檢測庫。由於代碼可以通過縮小修改並組裝成一個大的JS 文件,所以搜索正則表達式不應太嚴格,應該使用在縮小過程中不改變的片段。例如,你可以搜索在查詢字符串處理中使用的正則表達式。
為此,構建了一個規則庫,可以通過使用Burp 的“漏洞消息檢查”或“軟件版本報告器”擴展分析HTTP 響應來檢測被動模式下的易受攻擊的庫。
chrome 擴展中添加了相同的功能,它使用數據庫中提到的導致污染的模式搜索js 資源。
Web 應用程序中的被動搜索記錄jQuery 查詢對象易受攻擊的庫。鏈接到burp 插件:https://github.com/BlackFan/cspp-tools/tree/main/match_rules。
示例研究案例研究1:CodeQL這是我最喜歡的一個漏洞,有一次我試圖使用插件和selenium bot 找到污染。但他們都沒有顯示出任何有趣的結果。所以,我想到了使用CodeQL來掃描這個漏洞,因為程序的範圍非常大,而且有很多JS密集型的應用程序。
於是我只能掃描所有有趣的應用程序並將JS 文件下載到一個文件夾中。然後,我創建了一個CodeQL 數據庫,並在https://github.com/github/codeql 上提供的查詢的幫助下編寫了一個查詢,但我面臨的漏洞是我必須為每個庫的基本deparam 查詢編寫一個易受攻擊的代碼模式,這是不可行的。來自GHSecurity 實驗室的@asgerf 提出了一個通用查詢,其中RemoteFlowSource 或location.{hash,search} 作為源,不安全的屬性分配作為Sink。此查詢的缺點是應該調用解析器函數https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fgithub%2Fsecuritylab%2Fdiscussions%2F209%23discussioncomment-145109sa=Dsntz=1usg=AFQjCNFDSqqg5OWJTbhafhqaa4OR2chcjg。無論如何,我在我創建的JS 數據庫上運行這些查詢,並希望找到易受攻擊的合併調用或位置解析器。
令我驚訝的是,它顯示了下載的javascript 文件中存在易受攻擊的合併的結果。然後一位研究人員和我開始努力利用它。由於位置解析中不存在污染,我們必須找出哪些函數污染了原型。
1、污染原型
經過兩天的努力,我們能夠通過將JSON 有效負載發送到保存有效負載的某個終端來污染原型,當客戶端收到相同的有效負載時,原型就會受到污染。
2、尋找小工具
我們花了兩天多的時間才找到合適的小工具,在一個Web Worker中發現了一個javascript代碼的執行。
由於Web Worker 不能直接操作DOM,所以這個XSS 的影響非常低。經過大量的源代碼審查,我們能夠找到合適的小工具。
3、帳戶接管權限
你可能已經註意到這是一個self XSS,我們必須展示其影響。又過了一天,我們通過在iframes/windows 中打開敏感頁面來升級self XSS 以接管帳戶,並使用SAML 登錄我們的帳戶並讀取敏感頁面中的數據以接管帳戶。
案例研究2:Jira Service Management 4.16.0 上的原型污染我們使用selenium bot 掃描了HackerOne、Bugcrowd 和Intigriti 中的所有私有和公共程序。有許多具有位置解析功能的應用程序會導致污染,而且大多數情況下漏洞在於第三方分析服務或使用易受攻擊的庫。我們注意到一個易受攻擊的網站,其域為jira.random.com/servicedesk/customer/user/requests?__proto__.x=11111。出於好奇,我們尋找了各個公司的Jira 服務管理。
污染的根本原因:Jira服務管理使用的骨干查詢參數容易受到原型污染的影響。
XSS腳本小工具:Posix想出了下面這個小工具,它可以在所有Jira網站上使用。
Gadget:__proto__.isFresh=xxx__proto__.onmousemove=alert(1)//__proto__.onmousemove=1
腳本:
下面是使用文件描述符的不受信任類型找到的其他一些小工具。
jira.mozilla.com 上的XSS
其中一個使用Jira的Mozilla域也有同樣的漏洞,我們把這個漏洞提交給了Mozilla,得到了2000美元的獎勵。
URL:
我們最初認為這是用戶安裝的模塊漏洞,但後來意識到該漏洞存在於所有自託管的4.16.0 版以下的Jira網站中。
Jira 通過將__proto__, constructor和prototype項列入黑名單來修復該漏洞,但是如果你清楚地註意到_setParamValue 函數,字符[] 將從項中刪除,這意味著我們可以使用像__pro[]to__ 這樣的項繞過修復。
繞過:https://local:8080/servicedesk/customer/user/signup?__pro[]to__.div=1__pro[]to__.div=%3Cimg%20src%20onerror=alert(document.domain)%3E__pro[]to__.div=1
案例研究3:使用Rahul 和Harsh 的chrome 擴展程序發現apple.com 上的XSS1、發現漏洞
Rahul 和Harsh最終確定了創建可用於這些終端的chrome 擴展。他們編寫了一個基本的chrome 擴展,基本上用原型污染有效載荷更改location.search/location.hash 並檢查原型是否被污染。
當時,他們已經在研究蘋果的計劃。所以,他們做的第一件事就是開始瀏覽apple.com的網頁來測試這個插件。該擴展程序在https://www.apple.com/shop/buy-watch/apple-watch 彈出了存在原型污染的通知。有那麼一瞬間,我們都認為這是一個誤報,但原型確實被污染了。
2、尋找小工具
在BlackFan 的幫助下,我們很快找到了一個小工具。最終的URL 是,https://www.apple.com/shop/buy-watch/apple-watch?__proto__[src]=image__proto__[onerror]=alert(1)
污染位於蘋果用來解析位置的canJS-deparam 庫中。
最初,蘋果通過檢查__proto__ 是否在屬性中來修復該漏洞,因為你可能已經知道這可以使用[constructor][prototype] 繞過,因此最終繞過URL 將是https://www.apple.com/shop /buy-watch/apple-watch?a[constructor][prototype]=imagea[constructor][prototype][onerror]=alert(1)。
我們提交了繞過修復,蘋果通過完全刪除位置解析修復了這個漏洞。
案例研究4:HubSpot 分析HubSpot 容易受到原型污染的影響,它在解析查詢字符串(location.search)的js 文件中使用了deparam。 HubSpot 被超過121000 家公司使用。我們發現,由於HubSpot使用的第三方分析,許多應用程序容易受到XSS的攻擊。
1、第一種繞過方法
Hubspot通過將__proto__ key列入黑名單來修復這個漏洞,因此它可以被構造函數[prototype][taint]=contamination繞過,我們報告了這個繞過,他們通過創建一個空Object來修復這個繞過。
2、第二種繞過方法:通過Nikita Stupin 繞過
Nikita Stupin 使用以下有效載荷找到了一個很酷的繞過方法:
?__proto__=0[taint]=polluted
如果__proto_, constructor, prototype 存在於項中,他們通過將小寫更改為大寫來修復繞過。
案例研究5:Masato Kinugawa 的細分分析污染Segment Analytics 使用容易受到原型污染的組件查詢字符串。這是一個有趣的原型污染,只有當屬性為Number 時才會發生污染。
這是造成污染的代碼。
找到一個只有數字污染的小工具是非常困難的。我們發現許多使用組件查詢字符串或分段分析的漏洞賞金網站仍然容易受到污染,但沒有小工具,就沒有任何影響。我們無法在任何易受此漏洞影響的應用程序中實現XSS。
Trello 就是這個漏洞的一個例子,你可以注意到Object.prototype[123] 被污染了:https://trello.com/?__proto__[123]=xx
在knockout.js中,securityymb找到了一個使用數字的小工具,如果易受攻擊的網站使用knockout.js,那你就太幸運了。
緩解措施1.在合併兩個對像或解析位置並將其轉換為對象時,請確保使用包含以下__proto__、prototype、constructor 的屬性的拒絕列表,確保在將屬性添加到對象之前進行拒絕列表檢查,並且不要像Jira 那樣犯錯誤。
2.如果應用程序是Node.js,你可以使用命令行選項--disable-proto 禁用Object.prototype.__proto__ 屬性。