顺手戳了下Safari,薅到个跨域洞"

admin 2026-10-16 13:49:39 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

顺手戳了下 Safari,薅到个跨域洞

原创

升斗安全XiuXiu
升斗安全XiuXiu

升斗安全

2026年10月14日 07:55
广东

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

【文章说明】

  • 目的:本文内容仅为网络安全技术研究与教育目的而创作。
  • 红线:严禁将本文知识用于任何未授权的非法活动。使用者必须遵守《网络安全法》等相关法律。
  • 责任:任何对本文技术的滥用所引发的后果自负,与本公众号及作者无关。
  • 免责:内容仅供参考,作者不对其准确性、完整性作任何担保。

阅读即代表您同意以上条款。

几个月前 PortSwigger 放出一个叫 Hackability 的工具,专门用来\"蹂躏\"那些冷门、未知渲染引擎。但它只能在没 Chrome 的环境里渲染页面,常规的 DevTools 根本看不了里面的 JS 对象。于是他们又造了个配套的检查器,不管什么引擎都能把对象扒个底朝天。这篇文章讲清楚这玩意儿怎么用,以及作者拿它测 Safari 时,顺手捡到一个把跨域源\"写进报错里\"的漏洞。


为什么还要再造一个 DevTools

几个月前我们发了Hackability——一套测试套件,让研究人员能用各种手法去戳那些\"从没见过的渲染引擎\"。它顺带还会挖出一堆有意思的 JavaScript 对象。

问题来了:Hackability 渲染页面时不依赖 Chrome,可你平时查对象靠的是 Chrome 开发者工具。没有 Chrome,DevTools 就瞎了。所以我们需要一个全新的、专注安全的工具——不管底下跑的是啥渲染引擎,都能把 JS 对象揪出来审一遍。Hackability Inspector 就是为这个生的。

检查器到底能干什么

开箱即用,它会枚举你给它的任意对象,靠 ES5/ES6 特性加暴力破解,把属性能翻的都翻出来。它还内置了一份\"已知 window 属性清单\",按\"有多可疑/多好玩\"给属性排个序,帮你判断这个属性到底是渲染引擎自带的,还是用户自己塞进去的对象。

枚举的时候,它会顺手做几项安全检查:

  • 这个属性的构造函数会不会泄露跨域对象?(这种通常直接等于同源策略绕过)
  • 你能不能往跨域对象上写属性?
  • 异常信息里有没有把跨域源给抖出来?
  • 它是不是个 Java 桥接?
  • 调 getOwnPropertyDescriptor 看看这个属性可配置 / 可枚举 / 可写不。

怎么用:三栏 + 三个过滤框

在输入框里敲你想查的对象,回车就行。界面是三栏布局:左边属性名、中间值、右边类型等附加信息。对象下面挂着属性列表,点箭头能继续往里钻。

三个趁手的过滤/操作框:

  • regex 框:用正则筛属性名;
  • js 框:对每个属性跑一段 JS,这里 obj 指代当前对象、prop 指代属性名。比如想挨个调用对象上的函数,就写 obj[prop](\"My argument\");
  • 类型选择菜单:除了常规 JS 类型,还能按 window、跨域 window、DOM 节点、Java 桥接这类来筛。

控制台手感和 Chrome DevTools 差不多:上下方向键翻历史命令;Control+Backspace 清控制台,Control+Shift+Backspace 清历史。它还认 HTML——Control+Enter 只执行不检查(多行模式好用),命令以 < 开头会被当成 HTML 输入。

遇上\"不让你交互\"的客户端怎么办

有些客户端压根不给你输入框。没关系,所有功能都能塞进查询字符串:

  • input=

想发进控制台的内容
* regex=

正则过滤
* js=

对每个属性执行的代码
* type=

按类型过滤
* blind=1

盲测模式

盲测专为\"渲染引擎不回显结果\"的场景准备:它把渲染出的 HTML 存下来,你回头慢慢看。对付那些你完全看不到枚举输出的目标,先发个 blind=1 存份副本再说——虽然这份副本不能交互,但你可以连发多个请求反推对象结构。

官方放了在线演示,但正经玩法还是 fork 一份自己托管。

顺手捡的漏:Safari 把跨域源写进了报错

拿检查器去测 Safari 的 proto bug 时,作者撞上一个全新的跨域问题。

Safari 有个毛病:当你去碰一个跨域对象的属性,它会抛个异常,而异常里直接带着那个 frame 的源(origin)。换句话说,不同域上任何 iframe、任何跨域 window 的位置,都能被你读出来。

代码就这么几行:

var win = document.getElementById('iframe').contentWindow, regex;try {   win.location.x;          // 随便碰一下跨域属性} catch(e){   regex = /accessing a frame with origin ”(.+?)”/.exec(e);  if(regex) {     alert('frame is pointing to:' + regex[1]);  }}

win 是 iframe 的跨域 contentWindow 引用,碰一下 x 就抛错,报错里含着 iframe 的源。更损的是:你读 contentWindow 的 length,就能把那个 window 上每一个 iframe 的源挨个读出来。作者的 PoC 里,subdomain1 挂着指向 subdomain2 和 burpcollaborator.net 的 iframe,用这招全读到了。

有人会想:上 X-Frame-Options 不就防住了?挡不住——因为不一定要用 iframe,换成弹出窗口(popup)照样读,作者也给了对应 PoC。

给猎人的两点收尾

  1. 冷门渲染引擎是金矿。 厂商的 DevTools、文档都按 Chrome 那套来,换个小众引擎,属性泄露、跨域越权这类\"老毛病\"又活过来了。Hackability 这套\"枚举 + 跨域检测\"的思路,值得搬进你自己的武器库。
  2. 报错信息是最容易被忽略的泄露面。 Safari 这洞本质就是\"异常里塞了源\"。审计任何客户端/引擎时,把 try/catch 里的 e 打印出来看看,经常有惊喜。

一个跨引擎查对象的小工具,顺手在 Safari 上薅了个跨域源泄露——这种\"工具顺手、漏洞凑巧\"的故事,正是猎人最爱的地方。觉得有用点个赞;点关注,后面继续拆这类\"趁手工具 + 顺手捡漏\"的实战。顺手转发给那个还在用 Chrome DevTools 硬刚小众引擎的朋友;也欢迎推荐给刚学客户端审计的新人——别只会看控制台,报错里也藏着洞。

你以为手机在偷听?真相比这更糟" 网络安全文章

你以为手机在偷听?真相比这更糟"

文章从安全从业者角度剖析手机偷听传闻,指出算法无需麦克风即可通过行为数据精准预测用户需求,成本、噪声和法律风险使偷听不划算。推荐系统历经协同过滤、停留时长优化及探索利用平衡三阶段进化。文章警示千人千面价格差异,并给出关闭麦克风权限、关闭个性化推荐、无痕比价等五项可操作建议,强调行为分析合法且普遍存在。
评论:0   参与:  0