作者:fate0
來源:小米安全中心
相關閱讀:
《爬蟲基礎篇[Web 漏洞掃描器]》
《爬蟲調度篇[Web 漏洞掃描器]》
《漏洞掃描技巧篇 [Web 漏洞掃描器]》
0x00 前言
上一篇主要講了如何通過修改 Chromium 代碼為 Web 漏洞掃描器的爬蟲打造一個穩定可靠的 headless 瀏覽器。這篇我們從瀏覽器底層走到上層,從 C++ 切換到 JavaScript,講一下如何通過向瀏覽器頁面注入 JavaScript 代碼來儘可能地獲取頁面上的鏈接信息。
0x01 注入 JavaScript 的時間點
首先我們要解決的第一個問題是:在什麼時間點向瀏覽器頁面注入 JavaScript 代碼?
答案非常簡單, 在頁面加載前,我們希望能夠注入一段 JavaScript 代碼以便於能夠 Hook、備份各種未被污染的函數, 在頁面加載后,我們希望能夠注入一段 JavaScript 代碼以便於能夠進行遍歷各個元素、觸發各種事件、獲取鏈接信息等操作。
那麼下一個問題又來了:怎麼定義頁面加載前、頁面加載后?
頁面加載前的定義非常簡單,只要能在用戶代碼執行前執行我們注入的 JavaScript 代碼即可,也就是在頁面創建之後、用戶代碼執行之前的時間段對於我們來說都算是頁面加載前,CDP 剛好提供了這麼一個 API Page.addScriptToEvaluateOnNewDocument
能夠讓我們在頁面加載前注入 JavaScript 代碼。
接下來考慮一下該如何定義頁面加載后。最簡單的方法就是不管三七二一,每個頁面都加載 30s (即便是空白的頁面),隨後再注入我們的代碼,但很明顯這會浪費很多資源,我們需要根據每個頁面的複雜度來控制加載時間。可能會有同學說我們可以監聽 load
事件,等待頁面加載結束之後再注入代碼,那我們考慮一個比較常見的場景,在某個頁面上剛好有那麼一兩個圖片字體資源加載速度特別慢,導致 load
遲遲未被觸發(甚至不觸發),但這些資源其實我們並不在乎,完全可以直接注入我們代碼,所以只等待 load
事件也並不是一個特別好的選擇。
我們先看一下加載一個頁面的過程,除了會觸發 load
事件之外還會觸發什麼事件:
转载请注明:IAMCOOL » 爬蟲 JavaScript 篇[Web 漏洞掃描器]