跨域相关问题
一、基础概念
什么是同源策略?
浏览器出于对安全的考虑,对同源请求放行,对异源请求限制。这些限制规则统称为同源策略,因此限制造成的开发问题,称之为跨域问题。
怎么判断是否同源?
当请求服务器的url中,协议、域名、端口都一致时,被称为同源。
何为同源请求?
我们的页面源向目标源发起各种各样的网络请求,比如请求一个css,请求一个js,请求一张图片,或者用ajax请求别的资源等等,双方源地址url如果满足同源的条件,则被称为同源请求。
对于不同源的请求,浏览器如何限制?
对标签发出的跨域请求轻微限制
对AJAX发出的跨域请求严厉限制
所以我们讨论同源策略,往往讨论的AJAX的同源限制。
二、流程梳理
这里主要讨论浏览器对于AJAX跨域资源访问的限制,详细如下图。当我们通过XHR/fatch发起AJAX请求去跨域访问资源的时候,浏览器会放出请求,但是在浏览器收到响应的时候,浏览器进行校验,只有校验通过了,浏览器才会同意将资源返回给页面源。
浏览器如何进行校验呢?
实际上浏览器是通过服务器返回的响应头Access-Control-Allow-Origin
进行判断的,具体看解决跨域问题的CORS方法。
三、解决跨域问题的方法
3.1 CORS
CORS全名跨域资源共享(Cross-Origin-Resourece-sharing),该机制主要是解决浏览器同源策略所带来的不便,使不同域的应用能够无视同源策略,进行信息传递。它是官方推荐的解决跨域的方式,但是它和jsonp一样,必须在后端服务器上做修改。
这里详细说一说CORS是如何通过校验的
只要服务器明确表示允许,则校验通过
服务器明确拒绝或没有表示,则校验不通过
那么怎么才算服务器允许了呢?去进行跨域访问资源的时候,浏览器会先发一个Origin: http://www.1.com
的头,其中www.1.com
就是我们从哪个网站发起的请求,如果允许跨域的话,服务器会返回响应头。
返回响应头如下:
1 | Access-Control-Allow-Origin: http://www.corsattack.pm.test |
有时候会遇到这种头,以前的老版本浏览器支持:
1 | Access-Control-Allow-Origin: * |
这样浏览器就不会阻止我们去访问目标网站的资源/接口。否则可能会导致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 代理服务器
我们知道跨域是浏览器请求数据造成的问题,因此我们不直接用浏览器去请求目标源,我们利用一台代理服务器去请求,然后将收到的结果包装返回给我们的浏览器,由于是我们自己的代理服务器,因此就可以通过以上两种方式解决跨域问题了。
四、跨域相关漏洞的挖掘
4.1 CORS
第一步:
我们发送一个请求到需要检测漏洞的网站,请求包含下面的请求头:
1 | Origin: http://www.baidu.com |
注意:进行测试的时候,我们可以测试包含网站名的域名,比如这种:
1 | Origin: http://www.1baidu.com |
第二步:
查看返回包中的响应头是否存在刚才的Origin
网站,如果存在,则说明有漏洞:
1 | Access-Control-Allow-Origin: http://www.corsattack.pm.test |
如果是返回的下面的格式,在新的版本浏览器中还是表示不允许,所以不能判断存在漏洞:
1 | Access-Control-Allow-Origin: * |
或者直接工具进行扫描
工具地址: 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 | <script type="text/javascript"> |