欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談javascript函數(shù)劫持[轉(zhuǎn)自xfocus]第2/3頁

 更新時間:2008年02月18日 22:03:26   作者:  
javascript函數(shù)劫持,也就是老外提到的javascript hijacking技術(shù)。最早還是和劍心同學(xué)討論問題時偶然看到的一段代碼

三、反劫持
談到劫持也就必然要談?wù)劮唇俪值脑掝},假設(shè)你要寫一個健壯的xss playload,就需要考慮反劫持,有兩個問題要解決:
如何判斷是否被劫持了?
如果發(fā)現(xiàn)被劫持了,如何反劫持?
1. 判斷某個函數(shù)是否被劫持,這個好辦,寫個小程序?qū)Ρ纫幌乱粋€函數(shù)被hook前后,有什么差別:
復(fù)制代碼 代碼如下:

<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ù)定義,用這個特征就可以簡單的檢測函數(shù)是否被劫持:
function checkHook(proc) {
if (proc.toString().indexOf("[native code]") > 0) {
return false;
} else {
return true;
}
}
2. 如何反劫持,第一個想法就是恢復(fù)被劫持的函數(shù),如果劫持的人把原函數(shù)保存在某個變量里那還好辦,直接調(diào)用原函數(shù)就可以了,但是劫持者自己也沒保存副本怎么辦,只能自己創(chuàng)建個新的環(huán)境,然后用新環(huán)境里的干凈的函數(shù)來恢復(fù)我們這里被hook了的,怎么創(chuàng)建新環(huán)境?整個新的iframe好了,里面就是個全新的環(huán)境。ok,動手吧:
復(fù)制代碼 代碼如下:

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é),整個測試代碼如下:
<!--antihook.htm-->
復(fù)制代碼 代碼如下:

<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. 不是上面兩個問題都解決了么,為什么要有第3節(jié)?因為那不是個最好的解決辦法,既然我們可以創(chuàng)建全新的iframe,何不把代碼直接放到全新iframe里執(zhí)行呢,這樣做的話綠色環(huán)保,既不用考慮當(dāng)前context里的hook問題,也不用改動當(dāng)前context,不會影響本身的程序執(zhí)行。給出兩個比較通用點的函數(shù):
復(fù)制代碼 代碼如下:

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封裝進一個函數(shù),然后調(diào)用這兩個方法來在iframe里執(zhí)行:
function payload() {
// your code goes here
}
var f = createIframe(top);
injectScriptIntoIframe(f, payload);

四、最后
由于國內(nèi)很少有見文章提及這個東西,所以才草成這篇,希望能夠拋磚引玉。由于本人水平有限,難免有錯誤或者疏漏之處請諒解,沒有說清楚的地方,歡迎和我交流。
還有就是一些不得不感謝的人,感謝劍心一直以來毫無保留的交流,感謝黑鍋多次鼓勵我把自己的心得體會寫成文字,感謝幻影所有的朋友們、B.C.T的朋友們以及群里那幫經(jīng)常一起扯淡的朋友們。
廣告一下,沒法幻影blog的朋友,可以添加hosts來突破:
72.14.219.190 pstgroup.blogspot.com

相關(guān)文章

最新評論