web-dev-qa-db-ja.com

XSSの脆弱性からJSコンテンツを取得する方法

私は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を取得するためのアイデアはありますか?

2
pancho

クロスサイトスクリプトインクルージョンアタック を成功させるには、このOriginチェックをバイパスする必要があります。

if (window.location.hostname === 'Demo.site.com')

herehere で説明されているように、最近のブラウザでは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ハイジャックへのアプローチのように見えますが、ここでは役に立ちません。また、最近のブラウザーでは一般的に失敗します。)

3
Arminius