一般来说Markdown都会被转换为HTML代码,而程序员往往不会考虑到这层,都是使用的第三方库,这也利于我们进行攻击。比较常见的的Markdown漏洞语法为超链接以及标签可被闭合,接下来我们以非常著名的Editor.md这款程序来进行演示。
在这里我们使用开发者工具来查看html代码:
一共有三个可插入点,分别是:
只需要将标签闭合或者直接使用伪协议即可:
但是为协议被过滤了,不过没关系事实上html属性的值是可以使用html实体化编码的,我们只需要将JavaScript中某个字符编码一下就可以了:
其他两处能够被注入的地方均被过滤掉了。
在目标程序新建笔记可以新建Markdown笔记:
而Markdown语法会被翻译成HTML代码,这一点从右边的预览栏就能看出来:
点开后就会打开百度,可以将它理解成一个a标签:
click
那么我们这里得代码就一共有两个注入点,分别是中括号里面的click对应了a标签中间的click,小括号中的url对应href后面的url。所以我们只需要构造payload就可以了:
通过进行闭合成功注入进了img标签。那么我们使用alert呢?
并没有弹窗,所以我们得重新找一个渲染点让他弹窗,最后我找到了历史记录:
其实到这里我又思考到了他同步到云端是不是云端的输出也没过滤?
他在左侧有个同步到博客功能:
在打开此链接后:http://leanote.com/blog/post/5e7235d9ab64414a2200769e发现果然被写入数据库了:
并且XSS漏洞还好被同步到web端的笔记:
在之前客户端的时候我就在想他到底是怎么去解析的JS,通过翻目录发现了:
打开login.html发现这不是登陆界面吗:
到这里我其实已经知道是Electron开发的了,因为很明显的前端界面,然后询问同事要了个软件叫Procmon,去监听软件情况,发现了:
不出我所料,果然是Electron框架,而Electron框架基于Note.js 因为之前有遇到NoteJS的站就了解了一下。知道NoteJS可以通过child_process来执行命令
本来以为不能远程利用的时候经过部门大佬提示,找了下导入导出的功能,发现可以进行导入导出:
而导出的文件内容为:
第一次导入发现目标会过滤script以及img标签,如图所示:
但是可以绕过,html属性前后可以跟空格,也就是说我可以这样:onerror=[空格]”payload”:
同时在web端还具有分享功能:
然后目标在移动到自己的分组中:
当他登陆客户端时查看历史记录时也会被触发:
客户端XSS和服务端XSS其实早在几个月前我就提交给了官方,但官方依然不重视,截止现在也没有修复。
https://github.com/leanote/leanote/issues/899