javascript的函數(shù)劫持淺析
javascript的函數(shù)劫持是什么?
函數(shù)劫持,顧名思義,即在一個函數(shù)運行之前把它劫持下來,添加我們想要的功能。當(dāng)這個函數(shù)實際運行的時候,它已經(jīng)不是原本的函數(shù)了,而是帶上了被我們添加上去的功能。這也是我們常見的鉤子函數(shù)的原理之一。
乍一看上去,這很像是函數(shù)的改寫。函數(shù)的改寫也可以理解為是函數(shù)劫持的一種,但是這種方式太惡心了。作為一個劫持者,在綁票獲得好處以后也應(yīng)該遵守職業(yè)道德,把人原封不動地還回去,所以我們得在合適的地方把函數(shù)原本的功能給重新調(diào)用回來。
推而廣之,其實“劫持”這一概念我們經(jīng)常會遇到,比方說某網(wǎng)站被運營商劫持了,在瀏覽該網(wǎng)站的時候會彈出運營商的廣告。
舉例分析
現(xiàn)在我們來舉個簡單的例子,劫持一下alert()函數(shù),為它增添一點小小的功能:
let warn = alert window.alert = (t) => { if (confirm('How are you?')) warn(t) } alert('Help me...!!!')
可以打開開發(fā)者工具嘗試一下這個例子,你會發(fā)現(xiàn)只有你在confirm
里面點擊了OK,才會彈出Help me...!!!
。
接下來我們把這部分的內(nèi)容封裝一下,成為一個通用的函數(shù):
const hijack = (obj, method, fun) => { let orig = obj[method] obj[method] = fun(orig) }
首先我們定義了一個hijack
函數(shù),它會先把原函數(shù)給保存下來,然后執(zhí)行自定義函數(shù),而原函數(shù)將會在自定義函數(shù)內(nèi)部進(jìn)行調(diào)用。
然后我們來劫持confirm()
函數(shù):
hijack(window, 'confirm', (orig) => { return (text) => { alert('HELP ME PLZ!!!') if (orig.call(this, text)) { alert('YOU SEEMS FINE AND I AM LEAVING, GOOD BYE!') } else { alert('HOLD ON! I AM COMING!!') } } })
這段函數(shù)的功能很簡單就不詳細(xì)說明了,直接調(diào)用confirm()
你就知道了。
反劫持
新建一個頁面,打開你的開發(fā)者工具控制臺,輸入alert
,你會看到這樣的輸出:
function alert() { [native code] }
然后使用本文開頭的那段代碼,把alert()
劫持一下,再重新在控制臺輸入alert
,你會看到這樣的輸出:
function (t) => { if (confirm('How are you?')) warn(t) }
通過上述的例子可以知道,要看一個函數(shù)是否被劫持了,只需要直接把它打印出來即可。針對系統(tǒng)原生的函數(shù), [native code]
即代表它是純凈無污染的。
函數(shù)劫持的作用
除了為函數(shù)增加功能以外,還能夠利用函數(shù)劫持去追蹤惡意用戶的信息。一般的XSS攻擊會先利用alert()
等能夠輸出信息的方法進(jìn)行測試,這時候我們可以先對原生alert()
進(jìn)行劫持,向其輸入追蹤信息的代碼,最后才把原函數(shù)釋放出去。當(dāng)惡意用戶在測試alert()
的時候就會立即被我們追蹤,而他本人卻無從察覺。
JavaScript劫持與JavaScript Hijacking黑客技術(shù)
注:圖中的序號表示的是JavaScript黑技術(shù)的實現(xiàn)順序
這里面是通過在存在漏洞的信任網(wǎng)站下正常登入,然后切換到已經(jīng)惡意網(wǎng)站(這個時候信任網(wǎng)站不能登出),這時在惡意網(wǎng)站會吧返回的JavaScript腳本和信任網(wǎng)站返回的cookie
一起重新發(fā)送給信任網(wǎng)站,從而獲取信任網(wǎng)站的敏感信息
注意事項:
1、信任網(wǎng)站(步驟2)返回的內(nèi)容必須是JSON數(shù)組,如果是JSON
對象的話那么會發(fā)生JavaScript錯誤,但是我們可以在返回的時候檢測返回的類型,如果是對象的話,那么我們也是可以在對象的前后加上中括號
2、劫持與JavaScript Hijacking技術(shù)的關(guān)系是在步驟五上面體現(xiàn)的,在步驟五的實現(xiàn)上是一定要通過JavaScript劫持去重寫對象中的方法,從而記錄信任網(wǎng)站中敏感信息的功能,所以JavaScript Hijacking的實現(xiàn)與劫持密不可分
3、信任網(wǎng)站必須響應(yīng)一個GET
請求
總結(jié)
關(guān)于JS的函數(shù)劫持,也不是什么新鮮的東西,只是在最近的工作中遇到了這個知識點感覺比較陌生,所以花了一些時間進(jìn)行了研究,并把結(jié)果記錄下來。以上就是這篇文章的全部內(nèi)容了,如果發(fā)現(xiàn)有什么錯漏的地方歡迎指正!
相關(guān)文章
javascript實現(xiàn)TreeView 無刷新展開的實例代碼
這篇文章介紹了javascript實現(xiàn)TreeView 無刷新展開的實例代碼,有需要的朋友可以參考一下2013-07-07JavaScript高級程序設(shè)計 閱讀筆記(十四) js繼承機制的實現(xiàn)
繼承是面向?qū)ο笳Z言的必備特征,即一個類能夠重用另一個類的方法和屬性。在JavaScript中繼承方式的實現(xiàn)方式主要有以下五種:對象冒充、call()、apply()、原型鏈、混合方式2012-08-08