淺談javascript函數(shù)劫持[轉(zhuǎn)自xfocus]第2/3頁(yè)
三、反劫持
談到劫持也就必然要談?wù)劮唇俪值脑掝},假設(shè)你要寫一個(gè)健壯的xss playload,就需要考慮反劫持,有兩個(gè)問(wèn)題要解決:
如何判斷是否被劫持了?
如果發(fā)現(xiàn)被劫持了,如何反劫持?
1. 判斷某個(gè)函數(shù)是否被劫持,這個(gè)好辦,寫個(gè)小程序?qū)Ρ纫幌乱粋€(gè)函數(shù)被hook前后,有什么差別:
<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>
結(jié)果:
function eval() {
[native code]
}
function(s) {
alert(s);
_eval(s);
}
我們發(fā)現(xiàn)那些內(nèi)置函數(shù)是[native code],而自定義的則是具體的函數(shù)定義,用這個(gè)特征就可以簡(jiǎn)單的檢測(cè)函數(shù)是否被劫持:
function checkHook(proc) {
if (proc.toString().indexOf("[native code]") > 0) {
return false;
} else {
return true;
}
}
2. 如何反劫持,第一個(gè)想法就是恢復(fù)被劫持的函數(shù),如果劫持的人把原函數(shù)保存在某個(gè)變量里那還好辦,直接調(diào)用原函數(shù)就可以了,但是劫持者自己也沒(méi)保存副本怎么辦,只能自己創(chuàng)建個(gè)新的環(huán)境,然后用新環(huán)境里的干凈的函數(shù)來(lái)恢復(fù)我們這里被hook了的,怎么創(chuàng)建新環(huán)境?整個(gè)新的iframe好了,里面就是個(gè)全新的環(huán)境。ok,動(dòng)手吧:
function unHook(proc) {
var f = document.createElement("iframe");
f.style.border = "0";
f.style.width = "0";
f.style.height = "0";
document.body.appendChild(f);
var d = f.contentWindow.document;
d.write("<script type=\"text/javascript\">window.parent.escape = escape;<\/script>");
d.close();
}
綜合1、2節(jié),整個(gè)測(cè)試代碼如下:
<!--antihook.htm-->
<script type="text/javascript">
<!--
escape = function(s) {
return s;
}
//-->
</script>
<html>
<body>
<input type="button" onclick="javascript: test();" value="test" />
<script type="text/javascript">
<!--
function test() {
alert(escape("s y"));
if (checkHook(escape)) {
unHook(escape);
}
alert(escape("s y"));
}
function checkHook(proc) {
if (proc.toString().indexOf("[native code]") > 0) {
return false;
} else {
return true;
}
}
function unHook(proc) {
var f = document.createElement("iframe");
f.style.border = "0";
f.style.width = "0";
f.style.height = "0";
document.body.appendChild(f);
var d = f.contentWindow.document;
d.write("<script type=\"text/javascript\">window.parent.escape = escape;<\/script>");
d.close();
}
//-->
</script>
</body>
</html>
3. 不是上面兩個(gè)問(wèn)題都解決了么,為什么要有第3節(jié)?因?yàn)槟遣皇莻€(gè)最好的解決辦法,既然我們可以創(chuàng)建全新的iframe,何不把代碼直接放到全新iframe里執(zhí)行呢,這樣做的話綠色環(huán)保,既不用考慮當(dāng)前context里的hook問(wèn)題,也不用改動(dòng)當(dāng)前context,不會(huì)影響本身的程序執(zhí)行。給出兩個(gè)比較通用點(diǎn)的函數(shù):
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封裝進(jìn)一個(gè)函數(shù),然后調(diào)用這兩個(gè)方法來(lái)在iframe里執(zhí)行:
function payload() {
// your code goes here
}
var f = createIframe(top);
injectScriptIntoIframe(f, payload);
四、最后
由于國(guó)內(nèi)很少有見文章提及這個(gè)東西,所以才草成這篇,希望能夠拋磚引玉。由于本人水平有限,難免有錯(cuò)誤或者疏漏之處請(qǐng)諒解,沒(méi)有說(shuō)清楚的地方,歡迎和我交流。
還有就是一些不得不感謝的人,感謝劍心一直以來(lái)毫無(wú)保留的交流,感謝黑鍋多次鼓勵(lì)我把自己的心得體會(huì)寫成文字,感謝幻影所有的朋友們、B.C.T的朋友們以及群里那幫經(jīng)常一起扯淡的朋友們。
廣告一下,沒(méi)法幻影blog的朋友,可以添加hosts來(lái)突破:
72.14.219.190 pstgroup.blogspot.com
相關(guān)文章
JavaScript實(shí)現(xiàn)防止網(wǎng)頁(yè)被嵌入Frame框架的代碼分享
這篇文章主要介紹了JavaScript實(shí)現(xiàn)防止網(wǎng)頁(yè)被嵌入Frame框架的代碼分享,本文給出了2種防嵌入方法,需要的朋友可以參考下2014-12-12
javascript中字符串替換函數(shù)replace()方法與c# 、vb 替換有一點(diǎn)不同
JavaScript 不像和c# vb.net 中一樣 直接就可以替換所以的要替換的字符2010-06-06
es6函數(shù)之rest參數(shù)用法實(shí)例分析
這篇文章主要介紹了es6函數(shù)之rest參數(shù)用法,結(jié)合實(shí)例形式分析了es6函數(shù)rest參數(shù)功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04
JavaScript中的一些實(shí)用小技巧總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于JavaScript中的一些實(shí)用小技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
詳解基于webpack2.x的vue2.x的多頁(yè)面站點(diǎn)
本篇文章主要主要介紹了基于webpack2.x的vue2.x的多頁(yè)面站點(diǎn) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-08-08
找到了一篇jQuery與Prototype并存的沖突的解決方法
找到了一篇jQuery與Prototype并存的沖突的解決方法...2007-08-08
JavaScript實(shí)現(xiàn)九宮格抽獎(jiǎng)功能的示例代碼
這篇文章主要為大家介紹了如何利用JavaScript實(shí)現(xiàn)九宮格抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
在JavaScript中對(duì)HTML進(jìn)行反轉(zhuǎn)義詳解
下面小編就為大家?guī)?lái)一篇在JavaScript中對(duì)HTML進(jìn)行反轉(zhuǎn)義詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05

