26

この質問を読んだ後、google/facebook などが次のような解析不能なクラフトを追加する理由について:

  • while(1);
  • for(;;);
  • &&&START&&& ... &&&END&&&
  • 1と3を合わせて

彼らの JSON 応答に対して、私はその動機を理解しました。しかし、同様の効果が

  • )構文エラーで無効な行全体をレンダリングするためのエクストラを先頭に追加する
  • JSON をコメントでラップする

現在、この無限ループと (奇妙な) 構文エラーの追加保護は、古くて寛容な JavaScript パーサーを回避することになるようですが、これが事実であることを示す参照を見つけることができないようです。別のSOの質問があり、while(1);回避策を否定し(1を壊すことができると述べています)、フォームの別の回避策を拒否しますが、{}&&理由を説明したり、ソースを引用したりしません。

その他の参照:

4

2 に答える 2

10

解析不可能な残骸の形態に関連するいくつかの詳細があると思います。

  • {}&&接頭辞は、文字列を有効な構文としてJSON検証しないパーサー(明らかに、たとえば古いバージョンのDojo)にさかのぼります。私が知っているすべてのパーサーライブラリは最近検証を行っていますが、2008年のこのブログ投稿は、前述のバージョンのdojoがjsonを正常に許可し、単に失敗することを示唆しています。これにより、ハイジャックに対する便利な保護が提供されます。JSONJSONJSONJSON.parseevalJSON

  • while(1)の値としてNumber割り当てることにより、プロトタイプを使用して無効にすることができます。01

  • for(;;)while(1)どちらも、ハイジャックされたサイトをクラッシュさせる効果があります。これにより、スクリプトの実行がエラーなしで効果的に停止されるため、保護が強化されます。定義上、エラーはjavascriptでのスクリプト実行の終了を示すものではなく、その後にスクリプトが実行されないようにするため、これは重要ですfor(;;)。これは、攻撃者がエラーオブジェクトのインスタンス化(の上書きなど)の弱点を悪用したりwindow.onerror、上書きしたり、プロキシしたりすることで、スクリプトエラーを正常に傍受する(架空の)状況を防ぐためです。evalconstructorError.prototype

    アップデート

    また、security.stackexchangeには、使用しないことを示唆するこの質問for(;;)があります。またはwhile(1)、サイトがDoSである可能性があるため、クライアントのCPUを攻撃するか、マルウェアスキャナーをトリガーします。最新のブラウザはサンドボックス化されてタブごとに実行されるため、深刻なDoSの問題は発生しません。しかし、それは確かに古いブラウザの問題です。マルウェアスキャナーは実際の問題であり、サイトが攻撃していると報告する場合があります。

  • &&&START&&&(および対応する&&&END&&&タグ)jsonを受信するクライアント側での解析を、)意図せずに閉じられる可能性のあるコメントを使用するよりも簡単にし、プログラマーの可読性と可視性を向上させる可能性があります。コメントの折り返しは、/*開始タグと*/終了タグを提供するため、そのバリエーションにすぎません。私の意見では、最初と最後の明確で明確なマークは、がらくたの意味に気付くのに役立ちます。コメントの使用は実際にはそれを提供していません。

于 2013-02-13T18:14:18.727 に答える
3

「1は上書き可能」について:

次のことを行う場合(Webkitで):

var test = 1;
console.log(test.constructor == window.Number); //true is logged

1理論的には、window.Number またはそのプロトタイプを変更して、の値が次のようにならないようにする方法がある可能性があり1ます。

window.Number.prototype.toString = function() { return 0 };
window.Number.prototype.valueOf = function() { return 0 }; 

幸いなことに、これは機能しません。でもそれが著者の言いたいことだと思います。

編集 一般に、コンテンツをコメントにラップするアプローチも使用する傾向があります(ただし、jsonオブジェクトにこのようなものが含まれていないことを確認する必要があります{"test":"*/"}。これにより、構文エラーが発生するためです。スローされたエラーでさえ可能性がありますキャッチ可能で、エラーが発生した行に関する情報を公開している可能性がある場合、または Error オブジェクト自体が変更されている可能性がある場合は、問題になる可能性があります。

于 2013-02-06T07:11:45.290 に答える