跨域CORS、JSONP原理及漏洞的利用

0x01 介绍

浏览器为了一定的安全因素,增加了同源策略。有违同源策略的操作都是被禁止的,这个时候就会发生我们所说的跨域。如果没有同源策略会怎样?这就好玩了。

0x02 古老的JSONP来实现跨域通信

JSONP的优点就是因为他够老,能兼容各种浏览器,无兼容问题,众生平等。
他发送的不是ajax请求,而是利用了script标签加载机制。他发送的不是ajax请求。

客户端代码
function jsonp() {
    var script = document.createElement('script');
    script.type = 'text/javascript';

    // 传参并指定回调执行函数为backFn
    script.src = 'http://localhost:8100/getUserInfo?uid=100&callback=backFn';
    document.head.appendChild(script);
}

// 回调执行函数
function backFn(res) {
    alert(JSON.stringify(res));
}

document.getElementById('btn_get_data').addEventListener('click',()=>{
    jsonp();
});

代码很简单,利用script标签加载机制,传参并指定回调执行函数为backFn,再回调执行函数利用alert输出获取到的结果。
这种请求方式只支持Get,不支持Post,而且存在一定安全问题。

服务端代码
let uid = ctx.query.uid;
let callback=ctx.query.callback;
ctx.body = 'backFn({"code": 0, "user": "admin"})';

0x03 CORS跨域

CORS,跨域资源共享,需要浏览器和服务器同时支持,基本思想为使用自定义的HTTP头部让浏览器和服务器通信。
目前主流浏览器都已基本提供对跨域资源共享的支持,移动端浏览器也几乎全部支持。

简单请求

浏览器直接发出CORS请求,在头信息中添加一个Origin字段,用来说明请求来自哪个源,服务器根据这个值,决定是否同意这次请求。

  • 如果服务器不许可,则返回的信息中不会包含Access-Control-Allow-Origin字段,这个错误需要onerror捕获,返回的状态码可能为200
  • 如果服务器许可,则服务器返回的响应中会多出Access-Control-字段
  • CORS默认不发送cookie,需要发送cookies,则需要服务器指定Access-Control-Allow-Credentials字段,需要在ajax请求中打开withCredentials属性
非简单请求
  • 请求方法是PUT或DELETE,Content-Type字段类型是application/json会在正式通信前,增加一次OPTIONS查询请求,预检请求
  • 询问服务器,网页所在域名是否在服务器的许可名单中,以及可以使用那些HTTP动词和头信息字段,只有得到肯定答复,浏览器才会发出正式XMLHTTPRequest请求,否则会报错
  • 服务器通过预检请求,以后每次浏览器正常CORS请求,都会和简单请求一样,会有一个Origin字段,服务器的回应也会有yieldAccess-Control-Allow-Origin头信息字段
安全隐患
image.png
CSRF攻击的大致原理是:
  • 用户通过浏览器,访问正常网站A(例如某银行),通过用户的身份认证(比如用户名/密码)成功A网站。
  • 网站A产生Cookie信息并返回给用户的浏览器。
  • 用户保持A网站页面登录状态,在同一浏览器中,打开一个新的TAB页访问恶意网站B。
  • 网站B接收到用户请求后,返回一些攻击性代码,请求A网站的资源(例如转账请求)。
  • 浏览器执行恶意代码,在用户不知情的情况下携带Cookie信息,向网站A发出请求。
  • 网站A根据用户的Cookie信息核实用户身份(此时用户在A网站是已登录状态),A网站会处理该请求。

0x04 以DoraBox演示漏洞

靶机是这样的,先开启burp监听,刷新这个靶机抓取数据包,比如说我们在测试网站的时候,抓到数据包。

image.png

访问该网页抓请求包


image.png

返回包看见这两个的时候,可以去测一下这个跨域攻击。怎么测呢?

image.png

可以添加Origin:http://www.baidu.com这样一条参数,看它是否可控,那么执行之后,我们返回包原本是星号,添加了这一条参数后,就变成了百度的域名。

image.png

Cors跨域攻击有什么用???可以获取一个用户的敏感信息,如果能获取到敏感信息,那么它就是个高危了,可以看见我的靶机,那么我们就可以确定了他这里存在跨域攻击了。

image.png

就用这个cors的利用靶机,那我们就选择get,然后生成poc利用的包。


image.png

这里它就是一个响应的数据。
Cors和jsonp都是csrf系列里面的一种,是读取型的。

image.png

0X04 挖到过的

总而言之,跨域漏洞的利用,也可以说是CSRF读取型漏洞,利用主站的跨域配置不当,可以随意引入第三方网站、子站进行内容读取,又上传到第三方网站。


image.png

你可能感兴趣的:(跨域CORS、JSONP原理及漏洞的利用)