作者:
EtherDream
·
2014/08/19 11:29
0x00 前言
終於趕上個想寫點東西的日子,原本打算繼續更新那拖了好久的流量劫持系列的部落格和工具。不過中午閒來無事去烏雲逛了圈,發現百度的漏洞又雙叒叕上頭條了!而且還是那個 BDUSS 洩露的問題,記不得這已經是第幾回了。儘管這事和我們沒啥關係,但本著拯救世界和平的目的,還是打算去研究下:)
既然是 cookie 洩露,無非就兩種。要麼就是硬傷,例如之前 Apache 就會因為太多的請求頭,導致 HttpOnly 也被輸出到錯誤頁裡,當然這種嚴重的漏洞,隨著補丁的更新很快就能解決;另一個當然就是內傷,由於程式猿的粗心大意,把重要的資料不加掩蓋就放到頁面裡了。
前者很好解決,把線上的伺服器都掃描一遍,修復一個就少一個。而後者就不那麼容易了,產品經常更新迭代,誰也不能保證每次升級之後是否出現新的隱患。
既然找不到一勞永逸的方案,不如就用最簡單最原始的土辦法 —— 暴力窮舉:把網頁一個個抓回來,看看裡面是否出現隱私資料了。當然你會說這也太挫太低效了,不過事實上這種方案還是有意義的,至少能很快的找出一些明顯的問題。而且在此基礎上,我們還可以再做最佳化和改進,讓它變得更完善。
說到抓網頁,大家總是先想到蜘蛛。雖然全自動化的流程是我們的終極目標,但在目前遐想階段,就開始搞這麼複雜的一套系統,還是不合適。而且如今遍地都是 AJAX 的互動網頁,蜘蛛也很難爬到一些動態資料。
所以,不如先從最簡單的開始:Chrome 外掛。在我們平時看網頁的時候,同時對頁面進行分析。這樣既節省了蜘蛛服務,而且還充分利用了真實的使用者行為,覆蓋到更多的動態互動內容。
0x01 獲取隱私資料
使用 Chrome 外掛來實現這個基本功能,是非常簡單的。只要得到了帶 HttpOnly 的 cookie 值,在瀏覽頁面時掃描下 HTML 字元就可以了。
首先得獲取瀏覽器的 cookie 資料庫,得到我們想要的。例如,我們獲取所有百度域下的 cookie:
#!js
chrome.cookies.getAll({domain: 'baidu.com'}, function(cookies) {
console.dir(cookies);
});
稍加過濾即可獲得 HttpOnly 的資料。
詳細 API 可以參考這裡。關於 Chrome 外掛開發這裡就不詳細介紹了。
值得注意的是,有些 cookie 值很簡單,例如 1、true、ok 之類的;或者很常見,例如使用者名稱、日期數字等,這些都得排除掉,否則會有太多的匹配。
0x02 掃描頁面內容
有了關鍵字列表,我們就可以對頁面內容做分析了。
我們新建一個 content 指令碼,向 background 指令碼獲取列表。之後在頁面的 DOMContentLoaded 事件裡,即可對文件的 HTML 進行關鍵字掃描了:
#!js
// content.js
chrome.extension.sendRequest('GET_LIST', function(list) {
window.addEventListener('DOMContentLoaded', function() {
var html = document.documentElement.outerHTML;
list.forEach(function(item) {
if (html.indexOf(item) >= 0) {
alert('found: ' + item);
}
});
});
});
// background.js
chrome.extension.onRequest.addListener(function(message, sender, sendResponse) {
if (message == 'GET_LIST') {
sendResponse(list);
}
});
到此,一個最簡易的隱私嗅探器完成了。我們馬上就來試驗下,看看是否有效果。
先試試百度首頁上的幾個產品。不到 10 秒鐘,就逮到了一個:
開啟原始檔一搜,果然看見了傳說中帶 HttpOnly 的 BDUSS:
趕緊測試其他頁面。開始的幾分鐘時間裡,不斷發現新的洩漏點:
。。。
不過十分鐘後,出現的越來越少了。我們是不是漏了些什麼東西?
0x03 擴大掃描範圍
顯然,如果只掃描 HTML 內容,這和爬蟲有什麼區別?
我們之所以做成瀏覽器外掛,就是為了能得到真實的使用者行為操作。要是放棄了那些透過互動產生的動態資料,意義就大幅下降了。
遺憾的是,Chrome API 裡並沒有獲得網路資料的介面。即使是 HTML,我們也是透過