csrf

csrf:跨站请求伪造
攻击者盗用你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法,但是却完成了攻击者所期望的
一个操作,比如盗取账号,添加管理员,购买商品,转账等

漏洞检测
抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么很有可能存在csrf漏洞

在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。

或者使用csrf漏洞检测工具,比如CSRFTester
CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

 

防御CSRF攻击
1.验证HTTP请求头的Referer字段
不足: 某些浏览器存在一些方法篡改 Referer 值(IE6 或 FF2)
2.在请求地址中添加 token 并验证
token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对
对应get请求,token将附在请求地址之后
对应post请求,可用js构造隐藏的input标签,值为token

实际开发中,在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。对动态生成的 html 代码手动添加 token。
对于非本站的链接不添加token
缺点:实际开发中这样添加过于麻烦

3.在 HTTP 头中自定义属性并验证
把token 放到 HTTP 头中自定义的属性里
通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。
缺点:通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作会出现问题
对于没有进行 CSRF 防护的遗留系统来说,采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,几乎是要重写整个网站,这代价无疑是不能接受的

4.关键操作添加验证码进行操作

5.在前后端分离的前提下(例如使用ajax提交数据)设置不了token,可以给 cookie 新增 SameSite 属性,通过这个属性可以标记哪个 cookie 只作为同站 cookie (即第一方 cookie,不能作为第三方 cookie),既然不能作为第三方 cookie ,那么别的网站发起第三方请求时,第三方网站是收不到这个被标记关键 cookie,后面的鉴权处理就好办了。这一切都不需要做 token 生命周期的管理,也不用担心 Referer 会丢失或被中途被篡改。

参考链接:https://blog.csdn.net/m0_37268841/article/details/105770565

posted @ 2022-07-12 20:15  lzstar-A2  阅读(63)  评论(0编辑  收藏  举报