cors&jsonp攻击&防御
同源策略
不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源。那么何为同源呢,即两个站点需要满足同协议,同域名,同端口这三个条件。
cors
CORS,跨域资源共享(Cross-origin resource sharing),是H5提供的一种机制,WEB应用程序可以通过在HTTP增加字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源的,当不同域的请求发生时,就出现了跨域的现象。
跨域访问的场景
- 比如后端开发完一部分业务代码后,提供接口给前端用,在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问的问题。
- 程序员在本地做开发,本地的文件夹并不是在一个域下面,当一个文件需要发送ajax请求,请求另外一个页面的内容的时候,就会跨域。
- 电商网站想通过用户浏览器加载第三方快递网站的物流信息。
- 子站域名希望调用主站域名的用户资料接口,并将数据显示出来。
配置允许跨域
两个重要参数:
- Access-Control-Allow-Origin指是允许访问的源
- Access-Control-Allow-Credentials指的是允许带上cookie访问资源
配置实例
<? php
header("Access-Control-Allow-Origin:http://www.evil.com");
header("Access-Control-Allow-Credentials:true");
phpinfo();
?>
注意如下配置看上去允许所有,但实际上浏览器会拒绝(浏览器的安全机制)
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
参考: https://segmentfault.com/a/1190000012550346
cors问题如何发现
可以借助bp,将请求头中添加头信息查看返回,是否信任该域,如果信任则可以进行跨域
如何判断: 当提交了如下请求侯,查看具体的响应,理论上会有一些信息返回,比如是否信任该域,以及对该域是否可允许带cookie访问的一些限制。
请求内容
Origin:foo.example.org (后面的域名信息自行替换)
响应内容
HTTP/1.0 200 OK
Access-Control-Allow-Origin: foo.example.org
Access-Control-Allow-Credentials: true
测试记录
结合nginx进行测试
nginx 配置
location / {
#include /usr/share/nginx/html/XSS/.htaccess;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'User-Agent, Referer, Content-Type';
if ($request_method = 'OPTIONS') {
return 204;
}
}
这里是允许所有来源
测试结果:
在请求头中加入origin: http://www.sina.com.cn 响应了具体的配置信息
如下:
HTTP/1.1 304 Not Modified
Server: nginx/1.10.2
Date: Mon, 18 May 2020 05:04:01 GMT
Last-Modified: Mon, 31 Oct 2016 12:37:02 GMT
Connection: keep-alive
ETag: "58173aee-e74"
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: User-Agent, Referer, Content-Type
jsonp
JSONP是一种简单的服务器与客户端跨域通信的办法,此种跨域只能发起GET请求。其基本思想是网页通过添加一个script元素,向服务器请求JSON数据,这种做法不受同源策略限制。服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。
cors 结合xss
有时候CORS配置了信任自身的任意子域,那么如果一个子域存在XSS漏洞就可以通过这个漏洞去读取其他子域的资源,类似的场景还有比如HTTPS域信任HTTP域等。
批量检测的话可以通过inurl: ?callback= 关键字来进行搜索
cors 扫描工具
github上提供了一个关于扫描CORS配置漏洞的脚本,https://github.com/chenjj/CORScanner
一些高级利用方式
参考: https://www.freebuf.com/articles/terminal/175609.html
参考
- 包含靶机:https://www.freebuf.com/column/207802.html