从跨域与同源策略谈CSRF防御与绕过
阅读原文时间:2023年07月10日阅读:1

之前偶然看到群里有小伙汁问这个token相关的问题,当时我酝酿了一下子,没想好怎么总结,今天来说一下

CSRF在过去还属于OWASP TOP10 ,现在已经不是了(补充一点:关于OWASP API 请参考https://www.cnblogs.com/iamver/p/14331357.html)

在实际中也没咋遇到过(不排除自己太菜的原因),但是一些原理还是有必要了解一下的 ,比如网上最常说的防御与绕过

0x01 前言

CSRF-Cross Site Request Forgery 跨站请求伪造

之前我在DVWA那部分介绍过一些CSRF(感兴趣的可以往前翻翻往期随笔)

原理简单来说,就是这张图

1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

​ 2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

​ 3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

​ 4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行

额,所以说想利用CSRF的条件是:受害者正在访问你要攻击的网站A,且同时又打开了你的恶意链接

钓鱼佬狂喜

实际上,CSRF更像是一种“形式”,侧重于讨论对于用户请求的“伪造”、“篡改”,因此上述关于漏洞过程的描述中没有提到具体的、固定的代码和操作,而是简单描述了一下整个流程

突然想起一个事,觉得十分有必要说一下

所以这里补充一个知识点,关于跨域的问题

众所周知,浏览器存在同源策略(SOP即same-orgin policy),这个策略限制了不同源之间如何进行数据交互,属于一种安全机制

是否同源由URL的协议、域名、端口号决定,如果两个URL 的这三者均相同,则认为他们是同源的,否则有一个不同就是不同源,不同源之间相互访问资源会受到某些限制(注意不是任何资源都完全访问不了,而是某些方法会受到限制比如Document对象的很多属性啦、XHR生成的HTTP请求啦。。。)

那可麻烦了,如果按照这个标准,不同源的多了去了,难道都不能访问了?

于是就有了跨域,实现绕过同源策略

关于同源策略

  • 通常允许跨域写操作(link、redirect、表单提交)
  • 通常允许跨域资源嵌入(script、img、video…)
  • 通常禁止跨域读操作(ajax)
  • 可以正常发送请求,可以携带Cookie(withCredentials),但是浏览器会限制来自于不同域的资源的接收

请看下图:

即:

1.无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB

2.无法接触非同源网页的 DOM

3.向非同源地址发送 AJAX 请求浏览器会拒绝响应

(注:AJAX(Asynchronous JavaScript + XML)是一种描述现有技术集合及标准的模型,主要是网页增量更新用的,不用重新加载整个界面。虽然说是叫XML,但是常用json。AJAX常见的格式如下,更详细的内容参考:https://www.cnblogs.com/caifenglin/p/7797811.html,我就不细说了)

常见的跨域有JSONP跨域与CORS跨域(当然不止这两种方法,还有很多种,例如:https://zhuanlan.zhihu.com/p/81809258,这篇文章也只是列举了一些作者认为主流的方式,还有其他的没列举出来)

JSONP(json with padding)利用了