JSON ハイジャックについては、この記事で簡単に説明しています。
現在認証されているユーザーにクレジット カード番号のリストを返す Web サービスがあるとします。
[{"id":"1001","ccnum":"4111111111111111","balance":"2345.15"},
{"id":"1002","ccnum":"5555555555554444","balance":"10345.00"},
{"id":"1003","ccnum":"5105105105105100","balance":"6250.50"}]
攻撃の実行方法は次のとおりです。
認証されたユーザーが悪意のあるページにアクセスするようにします。
悪意のあるページは、ユーザーがログインしているアプリケーションの機密データにアクセスしようとします。スクリプト タグには同一オリジン ポリシーが適用されないため、HTML ページにスクリプト タグを埋め込むことで、これを行うことができます。<script src="http://<json site>/json_server.php"></script>
. ブラウザーは GET 要求をjson_server.php
行い、ユーザーの認証 Cookie が要求と共に送信されます。
この時点で、悪意のあるサイトがスクリプトを実行している間は、機密データにはアクセスできません。データへのアクセスは、オブジェクト プロトタイプ セッターを使用して実現できます。以下のコードでは、プロパティを設定しようとしたときに、オブジェクト プロトタイプ プロパティが定義された関数にバインドされてい"ccnum"
ます。
Object.prototype.__defineSetter__('ccnum',function(obj) {
secrets = secrets.concat(" ", obj);
});
この時点で、悪意のあるサイトは、ccnum
によって返された機密の金融データ ()を乗っ取ることに成功していjson_server.php
ます。
関数のブラウザ サポートに依存しない、他の形式の JSON ハイジャック テクニックもあり__defineSetter__
ます。これは攻撃を実行する 1 つの方法にすぎませんが、この記事Array constructor clobbering
で説明されているように、 、UTF-7
、など、他にも多くの方法がありますES5 functionality
。
このため、JSON を返す GET 要求は、ASP.NET では既定で無効になっています。