一、基础概念

什么是同源策略?

浏览器出于对安全的考虑,对同源请求放行,对异源请求限制。这些限制规则统称为同源策略,因此限制造成的开发问题,称之为跨域问题。

怎么判断是否同源?

当请求服务器的url中,协议域名端口都一致时,被称为同源。

image-20231019171228574

何为同源请求?

我们的页面源向目标源发起各种各样的网络请求,比如请求一个css,请求一个js,请求一张图片,或者用ajax请求别的资源等等,双方源地址url如果满足同源的条件,则被称为同源请求。

image-20231019171245235

对于不同源的请求,浏览器如何限制?

标签发出的跨域请求轻微限制

AJAX发出的跨域请求严厉限制

所以我们讨论同源策略,往往讨论的AJAX的同源限制。

二、流程梳理

这里主要讨论浏览器对于AJAX跨域资源访问的限制,详细如下图。当我们通过XHR/fatch发起AJAX请求去跨域访问资源的时候,浏览器会放出请求,但是在浏览器收到响应的时候,浏览器进行校验,只有校验通过了,浏览器才会同意将资源返回给页面源。

image-20231019172521271image-20231019172709684

浏览器如何进行校验呢?

实际上浏览器是通过服务器返回的响应头Access-Control-Allow-Origin进行判断的,具体看解决跨域问题的CORS方法。

三、解决跨域问题的方法

3.1 CORS

CORS全名跨域资源共享(Cross-Origin-Resourece-sharing),该机制主要是解决浏览器同源策略所带来的不便,使不同域的应用能够无视同源策略,进行信息传递。它是官方推荐的解决跨域的方式,但是它和jsonp一样,必须在后端服务器上做修改

这里详细说一说CORS是如何通过校验的

只要服务器明确表示允许,则校验通过

服务器明确拒绝没有表示,则校验不通过

那么怎么才算服务器允许了呢?去进行跨域访问资源的时候,浏览器会先发一个Origin: http://www.1.com的头,其中www.1.com就是我们从哪个网站发起的请求,如果允许跨域的话,服务器会返回响应头。

返回响应头如下:

1
2
Access-Control-Allow-Origin: http://www.corsattack.pm.test
Access-Control-Allow-Credentials: true

有时候会遇到这种头,以前的老版本浏览器支持:

1
2
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

这样浏览器就不会阻止我们去访问目标网站的资源/接口。否则可能会导致CSRF问题。

3.2 jsonp

我们知道,跨域对于js这种资源的请求的限制是比较宽松的,因此jsonp就是利用了这种方式获取资源http://192.168.155.190:8090/jsonp?callback=1。我们利用js返回我们需要的数据资源,这里利用了js的回调函数,一般都会有callback的关键字,后端的返回格式也必须满足callback({"id":1,"name":"test","email":"test@test.com"})这种方式,所以它的缺点也是必须在后端服务器上做修改

有了CORS这种正统的方案,为什么还要jsonp这种方式呢?其实是为了兼容一些老的、不支持CORS的浏览器。

3.3 代理服务器

我们知道跨域是浏览器请求数据造成的问题,因此我们不直接用浏览器去请求目标源,我们利用一台代理服务器去请求,然后将收到的结果包装返回给我们的浏览器,由于是我们自己的代理服务器,因此就可以通过以上两种方式解决跨域问题了。

image-20231019175704620

四、跨域相关漏洞的挖掘

4.1 CORS

第一步:

我们发送一个请求到需要检测漏洞的网站,请求包含下面的请求头:

1
Origin: http://www.baidu.com

注意:进行测试的时候,我们可以测试包含网站名的域名,比如这种:

1
2
Origin: http://www.1baidu.com
Origin: http://www.baidu1.com

第二步:

查看返回包中的响应头是否存在刚才的Origin网站,如果存在,则说明有漏洞:

1
2
Access-Control-Allow-Origin: http://www.corsattack.pm.test
Access-Control-Allow-Credentials: true

如果是返回的下面的格式,在新的版本浏览器中还是表示不允许,所以不能判断存在漏洞:

1
2
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

或者直接工具进行扫描

工具地址: GitHub - chenjj/CORScanner: 🎯 Fast CORS misconfiguration vulnerabilities scanner

4.2 jsonp

挖这个站的特征:

  • 参数名是 http://192.168.155.190:8090/jsonp?callback=1

  • 然后返回的值和参数名的值一样 比如:callback({"id":1,"name":"test","email":"test@test.com"})

  • 然后能弹出信息,就证明存在jsonp漏洞

测试的html文件如下,需要更改src为我们测试的站:

1
2
3
4
5
6
7
<script type="text/javascript">
function callback(result){
alert(result.name);
}
</script>

<script type="text/javascript" src=http://192.168.155.190:8090/jsonp?callback=1></script>