一、為什么我會寫這篇文章
這篇文章其實是在一個偶然的機會下發現了居然有JavaScript劫持這種東西,雖然這種東西在平時用的比較少,而且一般實用價值不高,但是在一些特殊的情況下還是要使用到的,所以在這里我就簡單的介紹一下
不知道你們在平時有沒有注意到這樣的一種情況就是每當使用alert()方法的時候,都會感覺這樣的方法太過的單調,像加個樣式或者是什么的。下面我們就來講解一下
二、一個關於JavaScript函數劫持的小DEMO
下面我們就來演示一下對alert方法進行劫持的小案例,樣式不是很漂亮,大家請見諒呀
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScript簡單小DEMO</title> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> window.onload=function(){ var _alert=alert; window.alert=function(string){ $("#alert").removeClass('hide'); } $('#test').click(function(){ alert(); }) $("#sure").click(function(){ $("#alert").addClass('hide'); _alert("這是一個JavaScript劫持DEMO"); }); } </script> <style> *{ font-size:16px; } .hide{ display:none; } #alert{ width:300px; height:200px; background:#3598DC; margin-left: 500px; margin-top:150px; line-height:200px; } #sure{ background:purple; float:right; margin-top:170px; margin-right:5px; width:60px; height:20px; } #sure:hover{ cursor:pointer; background:#E86FE0; } </style> </head> <body> <input id="test" type="button" value="測試"></input> <div id="alert" class="hide"> <input id="sure" value=" 確定"></div> </div> </body> </html>
在chrome中的運行效果如下:
是不是挺神奇的呢?
,下面我們就來進入的學習一下什么是JavaScript劫持
三、JavaScript劫持介紹
JavaScript劫持的本質就是重寫。但是在重寫的時候,我們應該注意的是要把原來的方法進行保存,這樣就不會擔心原來的方法被覆蓋掉而不能調用。
JavaScript劫持的經典結構是這樣的
window.onload=function(){ var _func=func; window.func=function(){ } }
var _func=func中func指代的就是一個實際的JavaScript native方法,window.func=function(){}指的就是重寫的內容。JavaScript劫持的原理挺簡單的,但是JavaScript劫持在實際中到底有什么應用呢?
JavaScript劫持的應用
1、對一些在程序中比較常見功能的重寫,這個如上述例子所示
2、設置陷阱實時捕捉跨站測試者,搞跨站的人總習慣用alert來確認是否存在跨站,如果你要監控是否有人在測試你的網站xss的話,可以在你要監控的頁面里hook alert函數,記錄alert調用情況:
function log(s) { var img = new Image(); img.style.width = img.style.height = 0; img.src = "http://www.leslieblog.online?caller=" + encodeURIComponent(s); } var _alert = alert; window.alert = function(s) { log(alert.caller); _alert(s); }
這段代碼的意思是將調用者的相關信息保存到指定網站的相關文件夾下面,然后保存形式是存儲為圖片。最后在把調用者要的相關信息打印出來,這樣就可以在測試者不知道的情況下獲取測試者的相關信息,而且測試者根本不知道
3、JavaScript可以用來非法獲取用戶的資料,這個會在JavaScript劫持與JavaScript Hijacking黑客技術中介紹
上張暴走輕松一下
四、JavaScript劫持檢測與反劫持
要進行反劫持,我們首先需要知道是否被惡意用戶劫持了,這個時候我們可以通過下面的代碼來檢測
相關的代碼如下所示:
<textarea id="tb1" cols="80" rows="8"></textarea> <script type="text/javascript"> <!-- document.getElementById("tb1").value = eval + "\n"; var _eval = eval; eval = function(s) { alert(s); _eval(s); } document.getElementById("tb1").value += eval; //--> </script>
我們主要要關注的API是alert、eval、console.log這些可以向用戶反饋信息,運行腳本或者是可以發送請求的API是否被劫持
上述代碼運行結果如下:
其中的native code 指的就是沒有被重新定義的,也就是說沒有被劫持
博主也嘗試過制作一個萬能的JS來檢測哪個方法被劫持了,無奈博主的能力有限無法完成這個JS,另外想說的是window這個對象的內容真的挺多挺復雜的
假設我們已經知道了哪個JS被劫持了,那么我們應該怎樣來防止被劫持呢 ,這個就是我們現在要探討的問題
先想一想如果是方法已經別劫持(重寫)了,那么我們第一反應是不是將這個API還原了就好了,但是被劫持了的API不一定有備份(也就是劫持API的非法用戶不一定會對原來的API重新保存,例如:var _alert=alert),這個時候我們應該怎樣辦呢?其實仔細想想還原還是一定要的,但是我們可以換個思路,直接還原環境就可以了。環境一還原,那么相關的API也就還原了。
還原環境我們可以通過iframe來實現
兩個比較通用的方法
function createIframe(w) { var d = w.document; var newIframe = d.createElement("iframe"); newIframe.style.width = 0; newIframe.style.height = 0; d.body.appendChild(newIframe); newIframe.contentWindow.document.write("<html><body></body></html>"); return newIframe; } function injectScriptIntoIframe(f, proc) { var d = f.contentWindow.document; var s = "<script>\n(" + proc.toString() + ")();\n</script>"; d.write(s); }
把你的payload封裝進一個函數,然后調用這兩個方法來在iframe里執行:
function payload() { // your code goes here } var f = createIframe(top); injectScriptIntoIframe(f, payload);
這兩段js代碼也沒有什么好講的,到時候代入使用即可
五、JavaScript劫持與JavaScript Hijacking黑客技術
注:圖中的序號表示的是JavaScript黑技術的實現順序
這里面是通過在存在漏洞的信任網站下正常登入,然后切換到已經惡意網站(這個時候信任網站不能登出),這時在惡意網站會吧返回的JavaScript腳本和信任網站返回的cookie一起重新發送給信任網站,從而獲取信任網站的敏感信息
注意事項:
1、信任網站(步驟2)返回的內容必須是JSON數組,如果是JSON對象的話那么會發生JavaScript錯誤,但是我們可以在返回的時候檢測返回的類型,如果是對象的話,那么我們也是可以在對象的前后加上中括號
2、劫持與JavaScript Hijacking技術的關系是在步驟五上面體現的,在步驟五的實現上是一定要通過JavaScript劫持去重寫對象中的方法,從而記錄信任網站中敏感信息的功能,所以JavaScript Hijacking的實現與劫持密不可分
3、信任網站必須響應一個GET請求
更多的詳細內容詳見十有三博客 ,這里我就不做太多的解釋
五、參考文獻
http://shiyousan.com/post/635441704246553316
http://www.cnblogs.com/hyddd/archive/2009/07/02/1515768.html
http://www.2cto.com/Article/201101/82110.html