CORS解决方案汇总

Cors介绍

Cors全称"跨域资源共享"(Cross-origin resource sharing),Cors的出现是用来弥补SOP(同源策略)的不足。在当时SOP有些限制了网页的业务需求,不能够使不同域的网页互相访问,因此提出了Cors:用于绕过SOP(同源策略)来实现跨域资源访问的一种技术。

Cors漏洞就是攻击者利用Cors技术来获取用户的敏感数据,从而导致用户敏感信息泄露。

漏洞验证方法

curl -vv -H "Origin: http://hack${你的域名}" http://${你的域名}

例如:curl -vv -H "Origin: http://hackbaidu.com"  http://xxxx.baidu.com

然后观察ACCESS-CONTROL-ALLOW-ORIGIN设置内容:

  • 如果Access-Control-Allow-Origin返回了*或http://hackbaidu.com,则存在漏洞;

  • 如果未返回Access-Control-Allow-Origin头,则不存在漏洞;

漏洞修复方法-代码篇

1. 对单个controller进行设置

  • 示例代码,如下:

import com.xili.security.SecurityUtil;
import ......

//备注:此方案只能使用在需要跨域的mapping上,若不需要跨域,请不要设置跨域
//仅适用于需要跨域的接口,否则会因为获取不到origin导致业务无法正常访问
//方案一: 在此设置允许跨站的域名, 不允许使用通配符配置
// 如果按照这种方式配置仍然有漏洞,必定是你用通配符做了origins设置,并且该通配符可被绕过
@CrossOrigin(origins = {"http://localhost:9000", "http://www.baidu.com"})
@RequestMapping("/testCors.do")
    public @ResponseBody  String CORSTest(HttpServletRequest request,HttpServletResponse response) {
        String map = "no_pass";
        String origin = request.getHeader("Origin");   // 方案二: 在此获取origin,对origin来源进行判断
        if(origin != null){
            String safeOrigin = SecurityUtil.getSafeUrl(origin); 
            if(safeOrigin != null){
                map = "pass";
                ((HttpServletResponse) res).setHeader("Access-Control-Allow-Origin", safeOrigin);
    			((HttpServletResponse) res).setContentType("application/json;charset=UTF-8");
    			((HttpServletResponse) res).setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    			((HttpServletResponse) res).setHeader("Access-Control-Max-Age", "3600");
    			((HttpServletResponse) res).setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");//表明服务器支持的所有头信息字段
    			((HttpServletResponse) res).setHeader("Access-Control-Allow-Credentials", "true"); //如果要把Cookie发到服务器,需要指定Access-Control-Allow-Credentials字段为true;
    			((HttpServletResponse) res).setHeader("XDomainRequestAllowed","1");
            }
            else{
              	map = "checked_no_pass"
            }
        }else{
            map = "pass"; 
            //若某接口开启cors,并确实是在跨域访问,肯定会有origin。
            //没有origin的情况只有在同域访问时才会出现,此时无任意cors访问风险,所以通过
            
        }
        
        return map;
    }

一般CORS和jsnop接口不开放给外部进行调用,白名单内只设置企业内部域名

2. 对所有controller进行设置

方式一. 使用Java bean注解进行配置
研发自己编写bean,在配置文件中进行域设置。并通过configuration/bean等注解注册到上下文中
  • 示例代码如下:

@Configuration
public class MyConfiguration {
    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        //你允许跨域的域名,不允许设置为『*』,可以设置的pattern有: (具体域名不用任何通配符, *.test.com一级域名不能被统配)
        config.addAllowedOrigin("http://domain1.com");  』
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;
    }
}
方式二. 使用XML进行配置
<!-- support cors-->
<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,xsrf-token</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  //你允许跨域的域名,不允许设置为『*』,可以设置的pattern有: (具体域名不用任何通配符, *.test.com一级域名不能被统配)
  <url-pattern>www.test.com</url-pattern>
</filter-mapping>

漏洞修复方法-nginx配置篇

在笔者实践过程中,大部分cors的场景确实可以通过代码进行一部分修复,但是有的场景明明代码通过检测是不存在cors问题的。在实际黑盒测试的过程中发现依然可以检测出问题,现在大部分工程都是前后端分离,且在企业级生产应用中都是增加了 Nginx 进行代理和路由,较多的一种场景是因为nginx上配置了跨域策略。

nginx上多域名白名单的配置示例如下:

set $cors_origin "";
    if ($http_origin ~* "^http://127.0.0.1$") {
            set $cors_origin $http_origin;
    }
    if ($http_origin ~* "^http://localhost$") {
            set $cors_origin $http_origin;
    }
    add_header Access-Control-Allow-Origin $cors_origin;

    location / {
            if ($request_method = 'OPTIONS') {
               add_header Access-Control-Allow-Origin $cors_origin;
               add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
                    return 204;
            }

白名单原则如上文所述,然后回答之前为什么代码没扫描出来漏洞的原因,因为对于在代码中未设置Access-Control-Allow-Origin的则扫描引擎认为未允许跨域,没有风险,但nginx配置上加上了允许任意访问的值,所以黑盒测试出现问题。这也很好的印证了需要黑白盒交叉测试才能保证安全水位的道理。

需要补充的是,有同学会觉得我白+黑更安全,nginx和代码中都进行cors的安全配置是不是双保险?大部分场景下sdl实践是推崇多级防御的,遗憾的是,该场景下却适得其反

当 nginx 和后端同时配置跨域配置后,会导致跨域配置失败,浏览器报错如下图所示

1711422786_66023d42d84bae1678b68.png!small?1711422789870

打开F12会发现,返回的 response 头里有两个Access-Control-Allow-Origin.也就是说,只使用 Nginx 或者后端或者其他方式进行控制跨域,不要两边都配置。

漏洞修复方法-yaml配置篇

现在很多企业已经上云和使用虚拟化技术,相当多的应用部署在容器内。以笔者遇到过的K8S集群部署为例,上文中的nginx配置需要写在ingress的yaml里,这里也给一个示例:(加入一个lua脚本来支持正则匹配test.com)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    # 添加lua脚本片段
    nginx.ingress.kubernetes.io/configuration-snippet: |
      set $allow_cors "";
      if ($http_origin ~ "^https?://([a-zA-Z0-9.-]+\.)?test\.com(:\d+)?$") {
        set $allow_cors "true";
      }
      more_set_headers 'Access-Control-Allow-Origin: $allow_cors';
spec:
  rules:
  - host: your.host.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-service-name
            port:
              name: http

在rancher中可以进行简单的图形化输入脚本,保存后即时生效

跨域简单测试方案

最后补充一个跨域的简单测试方案,对于粗放型设置企业内全部域名为白名单的情况可以忽略,对于需要精细化控制cors白名单又怕影响到业务,一定要仔细的测试资源能否被正确的跨域调用:

进入浏览器开发者控制台,在控制台输入如下请求,接口地址更改为所需要检测的地址

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.xxx.com/api/action');
xhr.send(null);
xhr.onload = function(e) {
    var xhr = e.target;
    console.log(xhr.responseText);
}

当出现该报错意味着网络不通。。因为xxx.com是随便写的无效地址所以请求超时

当支持跨域时会正常返回

当不支持跨域时会返回该内容

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

  • 2023届全国高校毕业生预计达到1158万人,就业形势严峻;
  • 国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

 “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 

网络安全行业特点

1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

 2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。

 行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

 1.学习路线图 

 攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

 (都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。 

 因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。 

 还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

 最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

 因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值