1. ホーム
  2. ジャバスクリプト

[解決済み】なぜ人々はjsonレスポンスの前に「throw 1; <dont be evil>」や「for(;;);」のようなコードを置くのでしょうか?重複

2022-04-06 10:09:49

質問

<ブロッククオート

重複の可能性があります。

なぜGoogleはJSONレスポンスにwhile(1);を前置するのですか?

Googleはこのようなjsonを返します。

throw 1; <dont be evil> { foo: bar}

で、Facebookのajaxにはこんな感じのjsonがあります。

for(;;); {"error":0,"errorSummary": ""}

  • なぜ、停止するようなコードを入れているのでしょうか? が実行され、無効なjsonが作成されるのでは?
  • 無効なのにどうやって解析するんだ? で、evalしようとするとクラッシュします。 というのは?
  • から取り除くだけなのでしょうか? 文字列(高そう)?
  • セキュリティ上の利点はありますか? これは?

セキュリティのためということに対し

スクレイパーが別のドメインにいる場合、スクレイパーは script タグでデータを取得することができます。たとえ for(;;); 攻撃者はどのようにデータを取得するのでしょうか?変数に代入されていないのだから、参照先がなくてガベージコレクションされるだけではないのか?

基本的にクロスドメインでデータを取得するためには、次のようなことが必要です。

<script src="http://target.com/json.js"></script>

しかし、クラッシュスクリプトを付加しなくても、グローバルにアクセスできる変数に代入されていない限り、攻撃者はJsonデータを使用することができません(このようなケースでは代入されていません)。クラッシュスクリプトがない場合でも、サイト上でデータを使用するにはサーバーサイドスクリプトを使用しなければならないため、クラッシュコードは事実上何の役にも立ちません。

解決方法は?

<ブロッククオート

がなくても for(;;); 攻撃者はどのようにしてデータを入手するのでしょうか?

攻撃は、組み込み型の挙動を変更することに基づいており、特に ObjectArray を変更することで、そのコンストラクタ関数やその prototype . そして、対象となるJSONが {...} または [...] を構成すると、それらのオブジェクトは攻撃者自身のバージョンとなり、予期せぬ振る舞いをする可能性があります。

例えば、セッタープロパティをハックして Object オブジェクト・リテラルで書かれた値を裏切ることになります。

Object.prototype.__defineSetter__('x', function(x) {
    alert('Ha! I steal '+x);
});

次に <script> は、そのプロパティ名を使用するいくつかのJSONを指していた。

{"x": "hello"}

"hello" が漏れてしまいます。

配列とオブジェクトのリテラルがセッターを呼び出す方法は、議論の余地があります。Firefox は、有名なウェブサイトへの攻撃を受けて、バージョン 3.5 でこの挙動を削除しました。しかし、この記事を書いている時点では、Safari (4) と Chrome (5) はまだこの脆弱性を持っています。

また、コンストラクタ関数を再定義する攻撃も、現在ではすべてのブラウザで禁止されています。

Array= function() {
    alert('I steal '+this);
};

[1, 2, 3]

そして今のところ、IE8 のプロパティの実装(ECMAScript 第 5 版の標準と Object.defineProperty ) では現在動作しません。 Object.prototype または Array.prototype .

しかし、過去のブラウザを保護するだけでなく、将来的にJavaScriptの拡張が同様のリークを引き起こす可能性もあり、その場合、chaffはそれらからも保護する必要があります。