JS代碼靜態分析及挖掘


JavaScript 已經成為現代 Web 瀏覽器開發中最普遍的技術之一。使用客戶端 JavaScript 框架(如 AngularJS,ReactJS 和 Vue.js)構建的應用程序已向前端輸送了大量功能和邏輯。

隨着客戶端功能和邏輯的增加,客戶端的攻擊面也在逐漸增加。

作為安全測試人員,必須了解這些應用程序的攻擊面。對測試來說,了解要查找的信息,查找的位置以及如何查找那些能導致在應用程序中發現潛在安全問題的信息都很重要。

在這篇博文中,我們將介紹如何對客戶端 JavaScript 代碼進行靜態分析來發現應用程序中潛在的安全問題。

我們特別感興趣的事情是通過執行靜態分析發現安全問題。我們不會深入研究性能分析或功能測試。
Picture
 
Static analysis is analysing code without executing it.

我們需要找哪些信息?

​作為滲透測試人員,對客戶端 JavaScript 進行靜態分析時,我們或多或少會對以下幾類信息感興趣 :
  1. 會增加攻擊面(URL,域等)的信息
  2. 敏感信息(密碼,API 密鑰,存儲等)
  3. 代碼中的潛在危險位置(eval,dangerouslySetInnerHTML 等)
  4. 具有已知漏洞的組件(過時的框架等)

執行靜態分析的步驟

我們將執行靜態分析分解為以下幾個步驟:
  1. 識別和收集應用程序中的 JavaScript 文件
  2. 將收集的 JavaScript 代碼進行可讀處理(Unminify / Deobfuscate)
  3. 識別可能導致發現安全問題的信息

收集 JavaScript 文件

1.如果你使用的是 Burp Suite 測試應用程序,那么有多種方法可以收集應用程序中的所有 JavaScript 文件。

在 Appsecco 中,我們遵循用戶驅動的工作流程來測試 Web 應用程序,我們通過模擬用戶瀏覽整個應用程序來開始測試。

通過設置 Burp 代理在瀏覽應用程序時將產生的流量發送到Burp。完成瀏覽后,你可以使用 Burp 的工具集來提取所有的 JavaScript 文件。

如果你使用的是 Burp Suite Community Edition,則可以在菜單中導航到 proxy > HTTP history 並使用顯示過濾器,設置為僅顯示應用程序使用的JavaScript文件。你還可以復制已顯示的所有 JavaScript 文件的 URL。
Picture
 
Burp display filters to display only JavaScript files for a given application
Picture
 
Copy the URLs for all the JavaScript file displayed after filtering
Picture
 
Burp “Find Scripts” to identify all the JS files on an application
Picture
 
Burp “Find scripts” can export all the scripts, not just URLs

另一種在應用程序中快速列出 JavaScript 文件的有趣技術是挖掘類似 Wayback Machine 之類的互聯網檔案數據庫。此技術完全是被動的,因為我們不需要向目標應用程序的服務器發送任何請求。

挖掘 Wayback Machine 等互聯網檔案對於識別應用程序中的 JavaScript 文件非常有用。有時你將能夠找到在服務器上還未刪除的 JavaScript 文件。
go get waybackurls waybackurls internet.org | grep“\ .js”| uniq | sort
Picture
 
Using “waybackurls” to extract URLs for JavaScript files that belong to a domain that are listed in Wayback Machine archive

  • 使用 Wayback Machine 可能會導致誤報,即有些 JavaScript 文件可能在服務器上已經不存在了。收集 JavaScript 文件的 URL 列表后,可以使用 curl 快速檢查服務器上 JavaScript 文件的狀態。
cat js_files_url_list.txt | parallel -j50 -q curl -w 'Status:%{http_code}\t Size:%{size_download}\t %{url_effective}\n' -o /dev/null -sk
Picture
 
Using cURL to quickly check for the status of the JavaScript files on the server

對收集的 JavaScript 代碼進行可讀處理

有時,你收集的 JavaScript 文件可能無法讀取或可讀性較差。這可能是因為開發人員已經將 JavaScript 代碼進行縮小或混淆。

縮小
:指在不影響瀏覽器處理資源的方式的情況下刪除不必要或冗余數據的過程;例如代碼注釋和格式化,刪除未使用的代碼,使用較短的變量和函數名稱等等。

混淆:涉及對程序進行修改,更改變量,函數和成員的名稱,使程序更難理解。
  • 有各種工具可以縮小 JavaScript。UglifyJS 是一個簡潔的 JS 代碼處理工具,它也可以作為 npm 包使用
Picture
 
Minify JavaScript using UglifyJS

有各種工具可以簡化 JavaScript。 JS Beautifier 是一個可以美化和反混淆某些混淆方案的工具。你可以通過  node.jspythononline 或  VS Code 等代碼編輯器使用此工具。
Picture
 
Unminify JavaScript using JS Beautifier

在執行反混淆處理尤其是在處理惡意軟件時,沒有一種適合所有技術的通用工具。你將不得不嘗試各種工具,反混淆方案並執行一些手動分析。但是有多種工具可以幫助你反混淆 JavaScript 代碼。我們經常使用的一些工具是 JStilleryJSDetoxJS-BeautifierIlluminateJsJSNice 等。

在 JavaScript 中識別有趣的信息

1. 在 JavaScript 文件中尋找的關鍵信息之一:端點,即完整的 URL,相對路徑等。

識別完整的 URL 和 JavaScript 文件中的相對路徑將幫助我們發現攻擊面並可能發現更多的漏洞
  • relative-url-extractor 是由 Jobert ABMA 開發的一個非常方便且快速識別一個 JavaScript 文件中的所有相對路徑的工具。此工具可以在本地和遠程 JavaScript 文件上工作。此工具可以直接在壓縮過的 JavaScript 上工作
Picture
 
Using relative-url-extractor to extract relative paths from remote JS file

  • LinkFinder 是由 Gerben Javado 開發的一個確定所有端點和端點所對應的 JavaScript 文件中的參數的工具。此工具也可以直接在壓縮過的 JavaScript 上工作,它通過 jsbeautifier 還原 JavaScript。也可以針對某個域名運行此工具來枚舉所有的 JavaScript 文件。
python linkfinder.py -i https://example.com -d -o cli

Picture
 
Using LinkFinder to extract endpoints from all the JS files in an application

2.  CloudScraper 是一種用於搜尋雲資源的爬蟲和抓取目標的工具。可以查看 JavaScript 文件來查找對雲資源的引用。此搜索產生的副作用是該工具還會識別托管在雲服務(如 Amazon S3 Buckets)上的所有 JavaScript 文件。
Picture
 
Using CloudScraper to identify cloud resources in source code

3. JavaScript 文件還可能包含敏感信息,如憑據和 API 密鑰。從廣義上講,我們可以使用正則表達式或熵來識別源代碼文件中的秘密。正則表達式搜索將能夠識別用戶設置的憑據,例如用戶名和密碼。基於熵的搜索在識別足夠隨機的密鑰(例如 API 密鑰和令牌)方面是非常有效的。
  • truffleHog 是一個在源代碼文件中搜索密鑰的神奇工具。此工具支持基於熵和基於正則表達式的搜索。在正則表達式搜索和熵搜索中,truffleHog 也可以輕松高度的自定義。
  • 不要忘記,在搜索源代碼文件的特定敏感信息時,grep / sed / awk 也非常強大。

4. 在查看 JavaScript 文件時,重要的是識別代碼中的危險位置,即開發人員往往會犯錯誤的地方,這會導致潛在的安全問題。
  • innerHTML 的用法表示可能存在XSS問題。在現代客戶端 JavaScript 框架中也存在與 innerHTML 等價的方法,eval 功能是另一個在客戶端和服務器端都可能出錯的地方。例如 React 框架中的 dangerouslytSetInnerHTML 並且它們確實在過去導致過嚴重的安全漏洞。在 Angular 中對於 bypassSecurityTrustX 方法的不正確使用也會導致 XSS 問題。
​​
Picture
 
List of bypassSecurityTrustX methods in Angular
  • postMessage API 是 JSONP 和帶有 CORS 頭的 XHR 以及其他方法的替代方法,可以通過繞過同源策略(SOP)在源之間發送數據。繞過 SOP 並與不同來源進行通信的想法應該是攻擊者非常感興趣的事情。使用 postMessage 時會存在各種安全隱患,一旦了解了與 postMessage 相關的安全問題,就可以在 JavaScript 文件中查找實現。在消息發送方,尋找 window.postMessage 並在接收方端尋找一個監聽器 window.addEventListener。你必須記住,很多框架都在 postMessage 代碼的附近實現了包裝器。
  • localStorage 和 sessionStorage 是 HTML Web 存儲對象。在 JavaScript 中,你可以查找 window.localStorage 和 window.sessionStorage 實現,通過 Web 存儲,Web 應用程序可以在用戶的瀏覽器中本地存儲數據。使用 Web 存儲識別存儲內容是重要的,特別是存儲敏感的任何內容都可能導致潛在的安全問題。

在 JavaScript 中查找可能導致潛在安全問題的危險位置強依賴於正在使用的技術堆棧。你應該確定正在使用的框架,在框架中識別危險的函數,然后在源代碼中查找它們。

5. 使用安全評估工具和靜態安全掃描程序可以輕松識別 JavaScript 代碼中的低危漏洞。JSPrime 是一個靜態分析工具,用於查找 JavaScript 代碼中的安全問題,但項目暫時沒有更新。ESLint 是最流行的 JavaScript 評估工具之一。通過添加自定義規則,可以輕松自定義 ESLint。ESLint 提供了許多自定義安全規則,特別是針對 Angular,React 等現代框架。
Picture
 
ESLint with Angular security rules reporting potential security issues

6. 在執行安全性評估時,識別應用程序中使用的老版本的和易受攻擊的 JavaScript 框架/庫非常重要。Retire.js 是一個可以識別正在使用的 JavaScript 框架是否過時的工具。此工具可用作獨立工具,瀏覽器擴展,grunt 插件或 Burp / ZAP 擴展。如果你以用戶驅動的方式執行測試,則 RetireJS Burp 擴展特別有用。盡管 RetireJS 可以產生一些誤報,但 RetireJS 報告的並非易受攻擊的漏洞。
Picture
 
RetireJS Burp suite extension reporting an outdated JavaScript library


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM