JavaScriptセキュリティ分析を真に自動化できないのはなぜですか?

JavaScriptの場合、自動コード分析にさらに興味深いアプローチがあるのに、単純な静的分析アプローチを行う必要があるのはなぜですか?



この質問に答えて、私の同僚のAlexey Goncharov kukumumuは簡潔に答えました。「JavaScriptはパンク言語です」とJasper Cashmore 記事「6文字だけのJavascriptの旅」へのリンクを投げてくれました。その場所に置きます。

とても気に入ったので、この記事をロシア語に翻訳することにしました。





画像



「たった6文字のJavascriptの旅」の翻訳



Javascriptは、とにかく動作するクレイジーなコードを作成できる、奇妙で素晴らしい言語です。 彼は、データの処理方法に基づいてデータを特定のタイプに変換することで、私たちを助けようとしています。



何かの前にプラス記号またはマイナス記号を追加すると、JSはテキストを追加し、データ型をString



変換すると想定します。

JSは番号を参照していると判断し、データは(可能な場合) Number



型に変換されます。



データを拒否すると、 Boolean



変換されます。

JSを使用して、文字[,



] ,



( ,



) ,



! +




のみを使用して、あらゆる種類の魔法のようなことを行うことができます[,



] ,



( ,



) ,



! +




[,



] ,



( ,



) ,



! +








モバイルデバイスからこれを読んでいない場合は、JSコンソールを開いてストーリーを追跡し、コピーするだけでサンプルの機能を確認できます。



基本から始めましょう。 覚えておくべきいくつかの黄金律:



で始まる!



Boolean



型を取得

+



始まるNumber



を取得します

[]



を追加すると、 String



型が取得されます



これらのルールは実行中です。



 ![] === false +[] === 0 []+[] === ""
      
      





知っておくべきもう1つのことは、次のように角かっこを使用して文字列から特定の文字を返すことができるということです。



 "hello"[0] === "h"
      
      





さらに、文字列の形式でコンポーネントを追加し、ルールNo.2を使用して結果をNumber型に変換することで、数値を取得できることを忘れないでください。



 +("1" + "1") === 11
      
      





行くぞ 次に、上記のすべてを組み合わせて、文字a



を取得します。



 ![] === false ![]+[] === "false" +!![] === 1 ------------------------ (![]+[])[+!![]] === "a" // same as "false"[1]
      
      





かっこいい!



比較的単純な組み合わせで、単語true



およびfalse



を構成する任意の文字を取得できることがわかりました。 a



e



f



l



r



s



t



u



残りの文字を取得するにはどうすればよいですか?



たとえば、 undefined



があります。これは、 [][[]]



ようなナンセンスを書くことで取得できます。 ゴールデンルールの1つを使用してString



型に変換し、さらに文字d



i



、およびn



を取得します。



 [][[]] + [] === "undefined"
      
      





すでに持っているすべての文字から、 fill



filter



find



などの単語を取得できfind



。 もちろん、他のものも取得できますが、これらは配列メソッドであるという事実で注目に値します 。 これは、それらが配列オブジェクトであり、配列で直接[2,1].sort()



[2,1].sort()







JSについて知っておくべきもう1つの重要なことは、 ポイント表記またはブラケット表記を使用してオブジェクトのプロパティにアクセスできることです。 上記の配列メソッドは配列自体のプロパティであるため、ドット表記の代わりに角括弧を使用してこれらのメソッドを呼び出すことができます。



したがって、 [2,1]["sort"]()



[2,1].sort()



と同じであることが[2,1].sort()



ます。



先に進み、現在の文字のコレクションを使用して記述された配列メソッドを呼び出さずに使用しようとするとどうなるかを見てみましょう。



 []["fill"]
      
      





function fill() { [native code] }



が判明しました。 ゴールデンルールを使用して、このメソッドを文字列に変換できます。



 []["fill"]+[] === "function fill() { [native code] }"
      
      





そして、次の文字を取得します: c



o



v



(



)



{



[



]



}



 







新しく取得したc



o



を使用して、ワードconstructor



形成できます。 constructor



は、すべてのJSオブジェクトが持つメソッドであり、コンストラクター関数を返します。



これまでに扱ったオブジェクトのコンストラクター関数の表現を文字列として取得しましょう。



 true["constructor"] + [] === "function Boolean() { [native code] }" 0["constructor"] + [] === "function Number() { [native code] }" ""["constructor"] + [] === "function String() { [native code] }" []["constructor"] + [] === "function Array() { [native code] }"
      
      





したがって、次のシンボルを武器に追加します: B



N



S



A



m



g



y







これで、角括弧で使用できる関数「 toString



」を作成できます。



 (10)["toString"]() === "10"
      
      





しかし、ゴールデンルールを使用して何かを文字列に変えることさえできます。



Number



型のtoString



メソッドに秘密の引数、つまりradix



と呼ばれる秘密の引数があり、文字列に変換される前に指定された数値の数値システムのradix



を変更できるとしたらどうでしょうか。 見てみましょう:



 (12)["toString"](10) === "12" // base 10 - normal to us (12)["toString"](2) === "1100" // base 2, or binary, for 12 (12)["toString"](8) === "14" // base 8 (octonary) for 12 (12)["toString"](16) === "c" // hex for 12
      
      





しかし、なぜ16で停止しますか? 最大値は36です。これは、基本的に0-9



およびaz



すべての文字を提供します。 したがって、任意の番号または文字を呼び出すことができます。



 (10)["toString"](36) === "a" (35)["toString"](36) === "z"
      
      





いいね! しかし、大文字や句読点などの他の文字はどうでしょうか? より深く掘ります。



コードの実行場所によっては、定義済みのオブジェクトまたはデータにアクセスできる場合があります。 ブラウザでコードを実行する場合、いくつかのHTMLラッパーメソッドにアクセスできる可能性があります。



たとえば、boldは<



b



>



タグを追加するString



メソッドです。



 "test"["bold"]() === "<b>test</b>"
      
      





これにより、文字<



>



および/



ます。



文字列を、単純なブラウザでダイジェストできるURI互換形式に変換します。 この機能は私たちの探求の重要な部分なので、それにアクセスする必要があります。 私たちはそれを書くことができますが、それを成し遂げることはできますか? これは、以前のすべての機能のような典型的な機能ではなく、グローバルレベルの機能です。



関数コンストラクターとは何ですか?



答えはfunction Function() { [native code] }



で、Functionオブジェクト自体がコンストラクターです。



 . []["fill"]["constructor"] === Function
      
      





これを使用して、コード行を渡して関数を作成できます。



 Function("alert('test')");
      
      





判明した:



 Function anonymous() { alert('test') }
      
      





最後に()



を使用するだけで、このコードを既に呼び出すことができます。

そこで、次のようにエスケープ関数を使用します。



 []["fill"]["constructor"]("return escape(' ')")() === "%20"
      
      





前述の<



エスケープ関数に渡すと、 %3C



得られます。 この大文字のC



、不足している残りの文字を取得するために非常に重要です。



 []["fill"]["constructor"]("return escape('<')")()[2] === "C"
      
      





これを使用して、特定の10進表現からUnicode文字を返すfromCharCode



関数を作成することができます。 これは、以前とまったく同じ方法で取得できるString



オブジェクトの一部です。



 ""["constructor"]["fromCharCode"](65) === "A" ""["constructor"]["fromCharCode"](46) === "."
      
      





ここでUnicode文字の10進表現を確認できます: Unicode lookup



ふう。 すべてが好き!



今では、世界中のほぼすべてのキャラクターを呼び出し、それらからコードを作成し、実行する機会さえあります。 つまり、Javascriptでは、 [



]



(



)



+



!



6文字だけを使用してチューリングの完全性が得られます!







証明したいですか? ブラウザで次のコードを実行します。



コードを明らかにする
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(+(!+[]+!+[]+!+[]+[!+[]+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]+!+[]])+(!![]+[])[+[]]+(![]+[])[+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()







これをモバイルから読んでいる場合、上記のコードはアラート(「wtf」)です。



変換を自動化するJSFuckというツールもあります。 ここでは、各文字の翻訳方法を確認できます。



実用とは何ですか?



なし。 まさか! 確かに、最近eBayはいくつかの悪いことをしました 。おかげで、売り手はこれらのシンボルのみを使用してJSコードをページに埋め込むことができますが、これはかなり珍しい攻撃方法です。 さらに難読化について覚えている人もいますが、正直なところ、これを難読化するより良い方法があります。



ごめんなさい



旅行を楽しんだことを願っています!



翻訳を手伝ってくれたVladimirKochetkovとKsenia Kirillovに感謝します。



All Articles