SOP,CORS,CSP 是什么,是做什么的,如何绕过?

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

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> 标签中,则无法绕过。这个时候可以尝试使用这个浏览器拓展来绕过,它会连接 devtools 工具来拦截修改 Body,具体使用方式见项目中的 readme。

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

来看一个示例:

image-20250331212223837

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

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

image-20250331212754761

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

image-20250331212830419

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

image-20250331212907740

image-20250331212921118

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

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

总结

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

本文章首发于个人博客 LLLibra146’s blog

本文作者:LLLibra146

更多文章请关注公众号 (LLLibra146):LLLibra146

版权声明:本博客所有文章除特别声明外,均采用 © BY-NC-ND 许可协议。非商用转载请注明出处!严禁商业转载!

本文链接
https://blog.d77.xyz/archives/d6bc8360.html