2023/09/19:HITCON2023
https://github.com/maple3142/My-CTF-Challenges/tree/master/HITCON%20CTF%202023/Canvas
大学牲看不来这个,尽量看吧
Canves
js沙箱逃逸+CSP绕过+xss?
关于docker
根据这篇wp,执行docker-compose up -d
前需要创建一个.env
文件,写上SITE=http://web
当然也可以装作没看到这句话直接起,但是很慢且可能出错导致失败提升血压
大体思路
翻译一下,“可以发现在web的worker里面有个‘jain’(老外意义不明简写?)可以进行js命令执行,目标是通过某种方法从localStorage获得flag”
这什么玩意?
先看看web里有啥
main.js
1 |
|
可以看到mian.js中第一行代码在localStorage后有一长串单引号包起来的玩意,这些就是刚进入题目时代码框里的代码,百度可知通过html的canves可以让这些代码生成一张图片,就是点进去映入眼帘的动图
大概意思是main.js用worker.js生成了个<canves>
,可以操作它,重点应该在worker.js那里
worker.js
1 |
|
worker.js用escapeHTML()
转义了特殊字符,hardening()
使某些对象和原型不可变,并阻止构造函数属性的修改来增强 JavaScript 环境的安全性和完整性,限制对某些属性的访。在尝试访问或修改 constructor 属性时会抛出错误,对于每个构造函数,它都会冻结构造函数本身和其原型使其不可变,防止对其属性的进一步修改或添加新属性。
剩下就是渲染了
再看看localStorage
是一个在浏览器中存储数据的 Web API,它提供了一个简单的键值对存储系统,用于将数据存储在客户端的浏览器中。这意味着您可以在浏览器中存储持久性数据,以便在用户会话之间保留状态或保存用户首选项等信息。localStorage.savedCode
可能是用来存储用户在网页或应用程序中输入或编辑的代码或其他文本数据的属性
这里保存了代码
最后看看bot
1 |
|
由main.js可知flag在localStorage.savedCode
1 |
|
执行新代码会重写,但由mian.js,flag在fallback里,最后可通过eval("fallback")
执行
问题解决
全局变量->->CSP绕过
获得全局变量
1.
使用this
:
1 |
|
2.
滥用V8 Stack Trace API:
1 |
|
以上两种方法都可以获得worker的全局变量[object DedicatedWorkerGlobalScope]
worker逃逸(?
以此获得访问lacalStorage
的方法
可以用URL.createObjectURL
创建一个URL对象,这个对象与main同源
1 |
|
以上代码可以创建一个类似blob:https://chal-canvas.chal.hitconctf.com/17a33cd9-ca3d-40a5-9944-4a18119aa576
的URL
但blob
被视为本地资源,泄露url给服务器重定向,也不能Location
,会导致ERR_UNSAFE_REDIRECT
,使用Javascript会显示无法加载本地资源
选择使用<meta>
重定向blob
的url,这是同源的,可以用
1 |
|
CSP绕过
CSP:default-src 'self' 'unsafe-eval'
选择利用worker.js
由于 worker 全局项和 window 全局项之间的相似性,worker.js 实际上在被包含在 window 上下文中时工作得很好,只需要从另一个窗口postMessage
,然后再次绕过防护获得 XSS。
大佬的exp
1.
1 |
|
2.
1 |
|