原文:https://medium.com/@win3zz/simple-story-of-some-complicated-xss-on-facebook-8a9c0d80969d
这篇文章讲述了在facebook上挖掘一些反射型XSS漏洞的心路历程。在上一篇文章中提到;MicroStrategy Web SDK托管在Facebook的生产服务器上,利用文件上传功能,可以将web shell上传至服务器。
通过枚举预先构建的任务,我发现uploadFile任务已注册并且可以访问。
MicroStrategy网站上提供的关于uploadFile的参考文档不多。纸上得来终觉浅,绝知此事要躬行。因此,我决定从它的源代码入手,分析uploadFile功能。
我使用jd-gui工具反编译了SDK的每个JAR文件,在WebTasks.jar文件下有一个类“com.microStrategy y.web.tasks.UploadFileTask”。
这个类支持文件上传及其处理功能。首先,检查fileFieldName URL参数,该参数应与实际文件名(要上传的文件名)匹配。然后,检查文件扩展名,对于Excel文件(xlsx和xls),调用函数parseUploadedExcelFile进行处理,对于其他文件,调用parseUploadedFile函数处理该文件。
parseUploadedExcelFile函数首先检查有效session,因此上传excel文件不太现实,但是parseUploadedFile函数没有检查有效session。
parseUploadedFile实际上并没有将上传的文件存储在服务器上,而是使用ploadFile任务来处理来自HTML表单的上传文件,并将文件内容返回给客户端。因此我们也无法上传web shell。
我发现UploadFileTask类处理上传文件的数据,并在没有输出编码的情况下进行渲染。这导致在m-nexus.thefacebook.com上下文中执行任意JavaScript代码。
反射型XSS被我逮到了,但如何进行下一步利用?
我创建了一个网页来利用这个XSS。
不幸的是,我无法控制该文件的内容,所以我不能有效地进行XSS利用。
经过一阵研究,我确认基于表单的文件上传不允许攻击者指定文件内容。
经过多次试验,我编写了一段简单的HTML+JavaScript代码,我可以通过POST表单发送文件,并触发XSS。
接下来就是在服务器上托管这个文件,并将其链接发送给受害者,当受害者点击链接时,将弹出带有域名的XSS窗口。
在burp中可以看到HTTP响应
通过这个XSS,黑客可以在客户端计算机上执行脚本,从而收集有关系统的信息并发送给恶意第三方。
XSS攻击会产生潜在的严重后果。攻击者可以通过操作应用程序DOM欺骗用户触发XSS。facebook方面非常重视我的这个漏洞报告,并给了我一份很不错的奖励。
这个故事与之前的帖子中讨论的blind SSRF漏洞有关。
我通过枚举找到了一个wikiScrapper任务。它有一个searchString参数,该参数接受关键字并从Wikipedia抓取数据。
我发现,如果我们提供一个以http://
或https://
,开头的字符串,那么它将从该网站提取数据。渲染Web内容时没有对数据进行编码,这说明searchString参数容易受到反射型XSS的攻击。
要抓取域上托管的任何网页,有两个条件必须要满足。第一个条件是该网页是一个包含所有必需标记(如HTML、Body和H1)的HTML页面。其次,网页必须包含一个表,并且表标记必须至少包含一个wikitable类。
要利用这个漏洞,我要做的就是托管一个满足上述所有条件的特殊网页,然后将其链接传递给searchString参数。我快速编写了一个HTML代码(具有XSS payload)并将其托管在HTML Pasta上(允许免费匿名托管HTML)
现在,在浏览器中打开这个精心构造的链接,弹出带有域名的XSS。
报告完这些漏洞后,我又收到了五位数的赏金,所有问题现已修复。现在已经不能公开访问m-nexus.thefacebook.com域。
上一篇文章:https://medium.com/@win3zz/how-i-made-31500-by-submitting-a-bug-to-facebook-d31bb046e204