湖北国联计算机科技有限公司
  • 首页HOME
  • 公司简介INTRODUCTION
  • 安全防御DEFENSE
  • 软件开发SOFTWARE
  • 物联网IOT
  • 运行维护SRE
  • 成功案例CASE
  • 联系我们CONTACT
  • SOFTWARE |软件开发

    SOP,CORS,CSP 是什么,是做什么的,如何绕过?
    来源:湖北国菱计算机科技有限公司-湖北国联计算机科技有限公司-荆州网站建设-荆州软件开发-政府网站建设公司 时间:2025-06-10

    大家好,因为之前的文章中一些有小伙伴提内容安全策略,还有同源策略等内容,这篇文章一起讲一下它们是什么,以及它们能做什么,还有如何绕过它们。

    JSRPC

    同源策略和内容安全策略会影响JSRPC 代码注入和执行的过程,所以为了更好的进行 JSRPC 注入,需要了解如何绕过它们。

    同源策略

    同源策略(Same-origin policy)是浏览器强制实施的一种安全机制,限制不同源的文档或脚本之间的交互。默认情况下,浏览器禁止非同源请求,除非目标服务器明确返回 Access-Control-Allow-Origin 响应头。

    说到同源策略,可能有小伙伴会疑惑,那跨域是啥?跨域这个词在后端开发中经常听到,和同源策略有什么关系呢?

    跨域是指从浏览器中发起的请求与当前页面来源不同,即违反同源策略,违反同源策略的请求会被浏览器拒绝。

    例如从 https://aa.com 请求 https://bb.com 的数据,会被浏览器拦截并且报错提示用户,我这里使用百度来演示:

    image-20250331194830390

    所以,同源策略和跨域的区别就是:同源策略是浏览器制定的安全规则,跨域是触发该规则限制的请求或操作。

    那如何绕过同源策略呢?有下面几种方案:

    1. 服务端设置响应头:Access-Control-Allow-Origin: *  // 或指定域名,这种方式就叫做:跨源资源共享(CORS,或通俗地译为跨域资源共享)

    2. 通过 <script> 标签加载跨域脚本,也就是 JSONP,但是只支持 GET 请求。

    3. 使用nginx 或者其他代理服务器进行转发。

    4. 在浏览器的启动参数中添加 --disable-web-security 参数,可以临时禁用同源策略,但是会降低浏览器的安全性,不要用于生产环境。

    那应该如何绕过同源策略呢?可以使用第一种方案,直接修改响应头。

    注:websocket 协议默认是不会受到同源策略限制的,可以随意使用。

    proxyman 打个断点,重新执行刚才访问百度的代码,在 proxyman 中给访问百度的请求手动添加请求头 Access-Control-Allow-Origin,即可绕过同源策略访问百度了。当然了,如果是自己可控的服务器,可以直接在后端设置,就不用抓包了。

    image-20250331203621767

    image-20250331203329530

    总结一下同源策略,说白了就是限制其他的网站读取本服务器的响应,它保护的是服务器资源不被未授权的网站读取

    内容安全策略

    内容安全策略(Content Security Policy,简称CSP),相比于同源策略更加可靠,它是一种白名单机制,开发者明确配置哪些外部的资源可以执行,在白名单以外的所有资源都不会被执行。开发者只需要提供一些配置即可,浏览器会自动按照配置执行。

    内容安全策略可以通过两种方式启用,一种是 Content-Security-Policy 请求头,另一种是 <meta> 标签。

    内容安全策略可以控制是否加载图片、脚本、AJAX和CSS资源,并且默认情况下会禁止执行 eval , newFunction , setTimeoutsetInterval

    如果一个网站开启了内容安全策略,那默认情况下你无法在控制台使用 document.head.append 添加一个外部源的脚本,并且内容安全策略还会影响 Safari 浏览器中的油猴脚本的执行,因为 Safari 中的拓展脚本会遵守网站的内容安全策略,导致油猴脚本无法执行。

    同时因为设置了白名单,也能阻止一些攻击,例如XSS。

    那应该如何绕过内容安全策略呢?

    部分的浏览器拓展可以通过浏览器拓展的网络拦截Api 删除掉网站设置的内容安全策略请求头,但是无法修改响应 body,也就导致了如果策略设置在 body 中的 <meta> 标签中,则无法绕过。这个时候可以尝试使用这个浏览器拓展[1]来绕过,它会连接devtools 工具来拦截修改 Body,具体使用方式见项目中的readme。

    还有一种方式就是通过中间人的方式来绕过。因为中间人是独立于浏览器之外的,不会受到浏览器的任何限制,且可以随意更改请求和响应,所以用它来绕过内容安全策略再方便不过了。

    来看一个示例:

    image-20250331212223837

    Github 默认是启动内容安全策略的,并且在策略中配置了一大堆域名,也就是说默认情况下,任何非 Github 域名的脚本都无法被加载和执行。

    尝试一下加载外部的脚本,被拒绝了,提示它不是Github 官方的脚本。尝试使用中间人的方式来绕过内容安全策略,因为策略是设置在响应头中的,那么只需要打个断点在响应头中删掉它就好了。

    image-20250331212754761

    打个断点,在响应头中,删除图中的这个响应头,然后点击右下角的执行。

    image-20250331212830419

    可以看到浏览器中的响应头中已经没有内容安全策略对应的响应头了。

    image-20250331212907740

    image-20250331212921118

    并且在浏览器中加载外部的脚本不会报错了,虽然这个脚本404 了,因为这个脚本本来就是不存在的,只是为了测试能否正常加载。

    至此,就可以完全绕过内容安全策略的保护了。如果嫌打断点麻烦,可以使用上篇文章中提到的中间人脚本的方式实现自动化删除内容安全策略的响应头,同时也可以修改body 删除对应的 <meta> 标签,就可以完全绕过内容安全策略的保护了。

    总结

    如果大家在实际的逆向中遇到了JSRPC 注入代码被拦截的情况,可以使用上面的方式尝试绕过。

    转载自:程序员指北

    荆州地区政府网站建设 解决方案 专业团队 腾讯第三方平台 地址:湖北省荆州市沙市区荆沙大道楚天都市佳园一期C区29栋112       地址:湖北省松滋市新江口街道才知文化广场1幢1146-1151室     邮编:434200 联系电话:0716-6666211     网站编辑部邮箱:business@gl-ns.com 鄂公网安备 42100202000212号 备案号:鄂ICP备2021015094号-1     企业名称:湖北国菱计算机科技有限公司