web-dev-qa-db-ja.com

JavaScriptでJavaScriptの実行を防止しますか?

この質問 XSS防止の扱いに関するコメントで、@ dandavisは次のように提案しました。

スクリプトが最初に実行される場合、次のスクリプトを壊すのは簡単です

アイデアは、CSPをサポートしないブラウザーに対してJavaScriptを(インラインで)防止するフォールバックを提供することです。

既存の関数を上書きすることは可能ですが、これがどのように機能するのか正確にはわかりません。 100%がそれ以上のスクリプトの実行を防ぐ簡単な解決策はありますか?そうでない場合、ほとんどのコンテキストまたはほとんどのブラウザーで機能するソリューション(および他のコンテキスト/ブラウザーでそれらをバイパスする方法)はありますか?

6
tim

100%がそれ以上のスクリプト実行を防止する簡単な解決策はありますか?

いいえ、そうは思いません。すべてのスクリプトタグはそれ自体で実行されるため、エラーをスローしても次のスクリプトは停止しません。 alertと会社およびおそらく同期AJAXは、それ以上のスクリプトの実行を防ぐために頭に浮かびますが、それはブラウザー全体をロックします。

そうでない場合、ほとんどのコンテキストまたはほとんどのブラウザーで機能するソリューション(および他のコンテキスト/ブラウザーでそれらをバイパスする方法)はありますか?

まあ、ウィンドウのプロパティをループすることで、すべてのグローバル変数をnullにしてみることができます。その場合、理論的には、スクリプトはDOMにアクセスして何も実行できなくなります。 practiceでは、これらのプロパティのすべてが書き込み可能ではないため、これはおそらくうまく機能しません。興味のあるものすべてを削除することは可能だと思います。

他に考えられるハッキングは、おそらくdocument.writeを使用して、他のスクリプトを実行する前にドキュメントを破壊しようとすることです。これは未定義の行動とドラゴンの土地にあるでしょう。

コードサンプル:

誰もが良いコードサンプルを愛しているので、ここでは、私が打ち負かすのが難しいと思うペイロードの例を示します。

<iframe name="iwin"></iframe>
<script>
(function() {
    // Due to the name attribute on the iframe, iwin is now
    // an implicit global for the iframe's contentWindow.
    // It should not have been there before the tag was parsed,
    // and the name could be randomized.

    // For legacy IE, to make globals accessible (0_o).
    iwin.execScript && iwin.execScript();

    // PWND, we have new globals.
    var XMLHttpRequest = iwin.XMLHttpRequest;
})();
</script>
5

このアイデアは、CSPをサポートしていないブラウザーに対してJavaScriptを(インラインで)防止するフォールバックを提供することです。

CSPは防御の最前線としては使用されないことに注意してください。アプリケーションでXSSを防ぐために、コンテキストごとに適切にエンコードする必要があります。 OWSAPはこれについて良い情報を持っています。

そうは言っても、アプリケーションでXSSの脆弱性(つまり、ページのどこかに間違った、またはエンコードがない)が発見されて悪用された場合、CSPはXSSをそれほど深刻にしない良いフォールバックになる可能性があります。

既存の関数を上書きすることは可能ですが、これがどのように機能するのか正確にはわかりません。

とても簡単です。たとえば、XMLHttpRequest = myFunction、またはXMLHttpRequest = nullは、スクリプトがXMLHttpRequestを直接使用できないようにします。

問題は、攻撃者がその特定の機能を使用していない可能性があり、攻撃者がこれを実行していることを知っている場合、別の方法を簡単に使用できることです。 mightall関数を上書きすることは可能ですが、信頼できるソリューションとしてはお勧めできません。

100%がそれ以上のスクリプト実行を防止する簡単な解決策はありますか?

<script>に構文エラーがある場合、その<script>...</script>は何も実行されません。残念ながら、XSSを使用すると、攻撃者は問題なく機能する新しい<script>を簡単に開始できます。

また、<script>以外にも、JavaScriptを挿入する方法はたくさんあります。たとえば、<img onload>onerrorなどです。

私の知る限り、次のすべてのHTMLがXSS実行を含むことを確実に阻止することはできません。

そうでない場合、ほとんどのコンテキストまたはほとんどのブラウザーで機能するソリューション(および他のコンテキスト/ブラウザーでそれらをバイパスする方法)はありますか?

CSPバージョン1のブラウザーサポートは うまくいくようになる であり、CSPはとにかく(最初の防御策ではなく)バックアップとして設計されているため、停止できる可能性がありますブラウザーでのサポートが縮小する問題であることを知っている、そこでの検索.

そうは言っても、関数を上書きするという考えは、成功に向けて長い道のりを歩むことができると思います。それはらしいそのように確実に機能する可能性があります理論上。これはお勧めできませんが、興味深い研究になると思います。実装するのがいかに複雑になるのでしょうか。

6
Bryan Field

このコメントはjQueryを念頭に置いて書きました。誤って破るのは本当に簡単だからです。ほとんどの複雑なクライアント側コード(ベクターを使用する種類)はjQueryを使用するため、脆弱性を引き起こす一般的なajaxとテンプレートは、それなしでは実行できません。

JavaScriptのセキュリティモデルは 参照ベース です。つまり、何かに到達できない場合、コードには存在しません。 constructor.constructor("alert(666)")()のような予期しない参照が2つありますが、JSには提供できる組み込み関数が(phpまたは.netのlibと比較して)単純にないため、それらは扱いやすいです。参照を隠蔽または破棄できる場合は、機能を削除します。 Doug Crockford これについて多くのことを語る 、そして_"use strict"_モードでは、それはより細かいレベルでさらに強制可能です。

  • スクリプトタグのないページにリダイレクトするのが最善です。可能であれば、非jsまたは「lofi」バージョン。

  • 100%サイズのiframeとsandbox属性を使用して、スクリプトなしでページを再予約できます。互換性テストに使用するためのブックマークレットがあるもの(新しいiframeを作成し、サイズを変更し、_.src_を_location.href_に設定するだけ)。すべてのブラウザーがsandboxをサポートしているわけではないため、目的が何らかの方法で見落とされているXSSを削減することである場合は、ピーターから強盗を招く可能性があります。

  • window.stop()は一部のブラウザー(確かにFF)で動作し、ページのインプレース読み込みを停止するのに使用するのに十分簡単です。

  • 「それらすべてを燃やす」;言語の純粋なロジック機能のみを残して、すべての組み込みグローバルプロパティを上書きします。欠点は、documentが変更できないことです。これは、すべての賢い敵が本当に必要としていることです。 documentを壊す簡単な方法があるかもしれませんが、それはそのまま巨大なベクトルです。

3
dandavis