网上拼凑的资料
(上图右下角的水印实在是太多了,加我一个应该没事8)
简单理解,在 A 网站的 Session 以及 Cookie 仍然存在的时候,用户访问 B 网站,B 网站执行跨站访问的恶意代码。
首先理清楚执行的恶意代码大概是个什么样子(图片白嫖自CSDN,图片中的代码是 Burp CSRF Poc generator 生成的)
(form action = "xxx" 中的地址是存在 CSRF 漏洞的目标网站) history.pushState 我的理解是在最新历史浏览记录里添加一个记录,即你点浏览器的返回按钮后会回退到那个 url 指定的地方。这个函数对于 CSRF 来说没有用处。
可以看到,其实就是构造了一个 POST 请求(这个构造的 POST 请求填入了账号密码),当然想要编写相应请求操作需要对相应网站的请求数据格式有相应的了解。因为 Cookie 的广泛使用,浏览器在访问网站(例如 POST 请求)时会自动填入目前 Session 中相应的 Cookie ,就可以不经验证执行操作。Tips:浏览器关闭时通常不会立刻关闭掉 Session ,而是会等它自动过期(详见最后)。
防御 CSRF
CSRF 防御的主要思路是,攻击者无法伪造验证信息,而 http cookie 是浏览器自动填入的。
1. HTTP Referer 字段
一个简单的办法就是利用 Http 头中的 referer 字段,检测这个字段中的 URL 是否为本网站的 URL ,如果不是则拒绝。但 referer 是可以伪造的。
上图是 js 代码伪造。
2. 加 Token
要不自己新增一个字段加上 Token ,要不就用 django 一样的模式。
django 在服务器端生成一个 Token 放入 Cookie 中(登陆后不再变化)。客户端每次提交的 form 表单的 Token 是随机变化的,表单中的 Token 是由 salt + encrpt(token,salt)组成,服务端通过解密表单中的 Token 并与 Cookie 中的 Token 对比识别是否是正常的请求。
Cookie 的一点知识
Reference:从上至下依次是:
burpsuite生成POC验证CSRF过程及原理_格洛克的博客-CSDN博客
有趣的API: history pushState/popstate 无刷新跳转 - SegmentFault 思否