第一个XSS漏洞发现过程
由于Facebook生产环境网站中采用了MicroStrategy Web SDK,因此,有了上一次漏洞发现,这里我着重把关注点放到MicroStrategy的文件上传功能上,寄希望能实现webshell上传。
针对https://m-nexus.thefacebook.com预建任务端点taskProc的枚举后,我发现其存在的一个注册且可访问的文件上传功能-uploadFile:
MicroStrategy说明书中没有太多关于该功能的解释,我只好手动对它进行了一些分析。我把完整的MicroStrategy Web SDK部署在了我的本地系统中,开始查找这个uploadFile功能相关的Java类,有了线索-com.microstrategy.web.tasks.UploadFileTask”:
在jd-gui帮助下,我把SDK中的每个jar文件进行了反编译,然后在WebTasks.jar文件中发现了“com.microstrategy.web.tasks.UploadFileTask” 的身影:
可以观察到,它确实支持文件上传和相关的处理功能。首先,它会检查与上传文件名匹配的URL参数fileFieldName,然后检查文件扩展名格式,如果是excel类型文件(xlsx、xls),它会调用方法parseUploadedExcelFile,如果是其它文件则调用parseUploadedFile:
MicroStrategy Web SDK对parseUploadedExcelFile的调用过程会执行一个有效身份会话的校验,所以,从这点来看,至少是不可利用的。但是,在parseUploadedFile的调用过程中,却完全不需要校验身份会话。
从代码分析来看,这里的文件上传功能仅只是从HTML上传页面中处理上传文件,然后把其文件内容显示给客户端,并不会把上传文件存储到服务端中。因此,前面我想上传webshell的想法就基本无望了。
但是我注意到,这里的UploadFileTask类在处理上传文件后的加载显示过程中,没有采取任何输出格式编码,这可能会导致主网站m-nexus.thefacebook.com中的任意JS代码执行。
从上可以看出,至少反射型XSS漏洞是存在的,那如何利用呢?接下来,我创建了一个网页式的Payload:
不幸的是,由于无法控制上传文件的内容,所以XSS的漏洞利用也是无效的。原因在于,表格或弹窗形式的文件上传操作中,不允许用户指定内容。
咋办呢?经过反复试验,我创建了一个很小的HTML+JavaScript代码文件,在其中嵌入了一个针对https://m-nexus.thefacebook.com/*的典型POST操作,去触发一个alert(document.domain)的XSS执行。
我只需把上述文件托管在我的网站中,然后把其文件链接发送给受害者,只要他点击访问,即会触发https://m-nexus.thefacebook.com/的XSS执行:
从Burp中的响应内容可以看到,m-nexus.thefacebook.com响应回来的HTML/JS代码确实没有输出格式编码:
利用该XSS漏洞,攻击者可以在受害者客户端中实现信息收集窃取、结合DOM进行迷惑点击等危险操作。漏洞上报后,Facebook给了我一个相对较高的赏金奖励。
第二个XSS漏洞发现过程
没过几天,我又在MicroStrategy Web SDK的预建任务中枚举发现了用于抓取wiki-pedia内容的wikiScrapper任务-wikiScrapperTask,它用参数searchString来匹配获取wiki-pedia中的相关数据内容。
然后我发现,如果我在其中给定形如http:// 或 https://的网站URL字符串,它就会执行针对相应http:// 或 https://网站的内容抓取操作,且是任意网站都行。而且同样的是,它在加载给定网站的Web内容时,也没采用任何输出格式编码,所以基于上述第一个XSS漏洞分析来看,这里应该同样会存在XSS漏洞。
要执行针对任意网站任意web页面的抓取,需要满足两个条件。一个是网站页面须是带标签的HTML页面,另一个就是其中须包含一个表格格式,且其表格标签必须包含一个wikitable的维基表格类。
为了实现漏洞利用,我在匿名Web页面托管服务HTML Pasta中创建了满足上述两个条件的页面,生成了相应的文件链接-craftierduskydolphin.htmlpasta.com:
然后,在m-nexus.thefacebook.com的wikiScrapper任务参数searchString中传入上述文件链接,形成以下URL,直接在浏览器中打开,即成功触发了XSS:
https://m-nexus.thefacebook.com/servlet/taskProc?taskId=wikiScrapper&taskEnv=html&taskContentType=json&searchString=https://{PASTE_LINK_HERE}&shouldSuggest=false&publicDataSuggestionURL=&publicDataSearchURL=&publicDataPageURL=
同样的,从Burp中的响应内容可以看出,Facebook服务端对HTML/JS代码的输出未采取输出格式编码:
该漏洞上报后,Facebook同样给了我一个较高的赏金奖励。
总结
我用上述源码分析方式前后发现了m-nexus.thefacebook.com上的3个XSS漏洞,收到了将近了一万美金的奖励。m-nexus.thefacebook.com现已不能再公开访问了。经验就是,当我们针对目标站点找不到线索时,可以深入看看其中部署的第三方应用。