今天分享的Writeup是关于Outlook for Android中的存储型XSS漏洞。作者通过朋友发送的技术电子邮件无意中发现了该漏洞。经过几个月的重现结构后开yun体育app官网网页登录入口,微软终于承认了该漏洞(CVE-2019 -1105)。
发现漏洞原因
2018 年底,我的一位朋友发了一封电子邮件,要求我帮助分析他正在研究的一些 JavaScript 代码。虽然我不做漏洞挖掘,但他发送的电子邮件在我的手机上显示了一些奇怪的东西。我的手机是Android,下面是隐藏发件人信息的邮件截图:
越看越觉得灰色边框有点奇怪。当我分析它时我发现了。这可能是因为 JavaScript 包含 HTML 形式的 iframe。解析iframe时,移动应用程序无法正常显示。但可疑的是,当我用笔记本电脑打开邮件时,整个解析正常,如下图:
我觉得这是一个问题:在电子邮件中嵌入 iframe 可能是一个漏洞,并且可能与我手机上的 Outlook 应用程序有关。就 Outlook 而言,矛盾之处在于 iframe 不受阻止外部图像的 BlockExternalImages 设置的影响。然而,如果攻击者有能力在电子邮件中植入可运行的 JavaScript 代码,这将是一个危险的安全威胁。
BlockExternalImages:iOS/Andriod 版 Outlook 中的安全设置。 BlockExternalImages 设置为 true 时将启用阻止外部图像。
鉴于此,为了验证我的猜测,我尝试在电子邮件中插入脚本标签而不是iframe,但没有成功。然而,我发现有趣的是,我可以通过在 iframe 中使用 JavaScript URL 来构建一种绕过此限制的方法。
通过电子邮件存储的 XSS
通常,在网络浏览器中,可以通过语法形式 javascript: 来调用 URL。但由于同源策略限制,单独域下的iframe框架中的JavaScript无法访问页面中的其他数据。 。在 Outlook for Andriod 应用程序中,没有这样的限制。我构建的 iframe 中的 JavaScript 可以访问我的用户 cookie、令牌甚至其他电子邮件。不仅如此,它还可以将此信息发送回攻击者。远程控制终端,汗……
这个安全问题是相当可怕的。要利用该漏洞,攻击者只需向受害者发送一封包含构造的 JavaScript 代码的电子邮件,受害者在 Outlook 中打开就会被感染。通常,Outlook 会过滤和转义一些不安全的语法和语义。但是,由于构建的 JavaScript 代码位于 iframe 中,因此 Outlook 服务器不会检测到它。因此,邮件投递后,Outlook客户端不会对其进行过滤和转义。最后,iframe 中包含的 JavaScript 可以在客户端移动设备上成功运行。这就是我们所说的存储型XSS(Stored XSS)。此类漏洞存在很大的风险。攻击者可以利用它来实现多种目的,包括窃取信息和返回数据。攻击者只需向受害者发送精心设计的电子邮件,当受害者阅读该电子邮件时,他就可以窃取受害者的 cookie、其他电子邮件或个人数据等敏感信息。更严重的是,这种存在于电子邮件阅读客户端中的存储型 XSS 可以被武器化和部署,以蠕虫或恶意软件的形式造成大规模破坏和感染。
漏洞报告后的重现流程
我认为这是一个需要紧急向微软通报的大问题。因此,针对这个漏洞,我创建了一个简短的PoC,它将执行任意外部脚本来窃取并返回敏感的个人信息。由于漏洞利用结构不够深入,因此对电子邮件数据的访问不多。我立即将此 PoC 发送给 Microsoft 安全团队。
关于这个漏洞,我确实不知道导致漏洞的源代码在哪里,因为我自己没有Outlook程序的源代码,而且我基本上没有调试移动应用程序的经验,但我认为开发人员看到这个 PoC 后应该能够做到这一点。理解。
不幸的是,微软安全团队无法重现该漏洞,我陷入了尴尬和进退两难的境地。但这显然是真的。我将我这边的漏洞重现视频发送给了微软安全团队。之后,我了解到有安全研究人员也报告了这个漏洞,但根据POC,微软安全团队仍然没能成功重现。
为了确认是否是Outlook设置差异导致的,我进行了一些测试,但没有发现问题。看来这个漏洞正在消失。
微软:如果无法重现则不是漏洞
每个安全工程师和开发人员都会告诉你,不可重现的错误是令人头疼的,他们的时间对于企业来说是宝贵且有限的资源。供应商安全团队可能会花费大量精力来重现漏洞,最终的原因是,如果他们无法成功重现漏洞,那么攻击者就不太可能成功重现并利用它。所以从这个角度来看,厂商的安全团队会尝试将责任转嫁到报告漏洞的安全研究人员身上。他们想要的是一种尽可能容易复制和确认的报告方法。
突破
我不能就这样放弃。几个月后,这个漏洞仍然是我担心的问题。如何让微软安全团队确认是一个难题。为此,我想到了一种方法,从Outlook应用程序中提取HTML加载内容,然后我意识到,这种提取方法可能是漏洞本身的问题!我能够从 Outlook 应用程序窃取数据,这意味着我可以使用它来读取和加载 HTML 内容。所以,基于这一点,我构造了一个新的Payload云开·全站体育app登录,执行效果如下:
我构建的有效负载如下所示:
style="position:absolute;left:-2330px;" src=h
有效负载将在 Outlook 服务器上转义为 HTML 形式,但在 Outlook 客户端上,它将被解析为:
style="position:absolute;left:-2330px;" src=h
该漏洞存在于客户端的代码解析中。 Payload中的电话号码tel:+442330最终会被形成一个可点击的按钮。此漏洞之前微软并未成功复现,因为我将手机的本地化设置为英国kaiyun.ccm,其电话号码会被判断为有效号码,而其他风格的本地化设置会识别这个英国号码。这是一个无效的号码,因此无法有效地复制。
最后我发现了问题所在。我将payload中的电话号码设置为美国格式xxx-xxx-xxxx,该格式支持在多个区域设置中重现漏洞。我很快将 POC 报告给了 Microsoft 安全团队。 2019年3月26日,微软重现了该漏洞,并承诺90天内修复。
漏洞报告流程
2018.12.10 – 向 Microsoft 提交初始漏洞报告
2019.1.16 – Microsoft无法成功重现该漏洞
2019.3.26 – 我向 Microsoft 发送了通用 POC
2019.3.26 – 微软成功复现
2019.6.20 – 错误修复
总结
2019年6月20日,微软修复了该漏洞,并将其编号为CVE-2019-1105。威胁影响被评为重要。对于个人和企业用户来说,及时更新应用软件以最大程度地降低入侵攻击的风险非常重要。当然,作为研究人员,漏洞发现和报告同样重要,这可以帮助制造商修复漏洞并实现更安全的产品。