ToB企服应用市场:ToB评测及商务社交产业平台

标题: CSRF攻防 [打印本页]

作者: 饭宝    时间: 2024-4-20 03:20
标题: CSRF攻防
早在2018年就了解CSRF,偶然间注意到项目的VerifyCsrfToken中间件,心血来潮,于是就写了这篇文章。
简介

CSRF (跨站请求伪造),或称之为XSRF, 是一种网络安全漏洞,黑客借用(不一定是盗用)受害者在已经登录过的网站上存留的会话凭证,作为通行证,借用受害者的身份实施的攻击行为。
CSRF特点:属于攻击方式隐蔽,非硬扛目标服务器。身份伪造,危害性大。难以排查,因为请求都是合法请求。
与XSS区别

标题XSSCSRF极简概括项目被植入恶意客户端代码,被受害者客户端执行的行为。利用客户端会话冒充用户身份做坏事的行为。对登录凭证的影响植入恶意代码盗取会话凭证利用会话凭证冒充真实用户注意:
举例

场景一:常规手段

小明登录了安全性不高的网站A,小明的浏览器自然就记录了cookie,黑客也熟悉这个网站A,知道有个更改登录密码的接口:/api/change_pwd?new_pwd=xxx,于是黑客做了一个网站B,小明点进去网站B后,此时小明的密码已被重置为12345678。
场景二:CSRF联合XSS

小明登录了安全性不高的网站A,小明的浏览器自然就记录了cookie,黑客也熟悉这个网站A,知道有个更改登录密码的接口:/api/change_pwd?new_pwd=xxx,也知道这个项目有存储型XSS漏洞,但是网站A的cookie设置了HttpOnly属性,导致恶意代码无法获取cookie,好在可以利用存储型XSS伪造一个提交按钮或者具有诱导性图片,小明点击了这个按钮或图片,此时小明的密码已被重置为12345678。
原理解析

诱导小明点击网站B(这里不纠结是社工引导 ),又或者是网站A伪造的图片或按钮,背后都有一个触发/api/change_pwd?new_pwd=12345678的链接,触发后,请求了网站A的重置密码接口,浏览器自然而然的带上了登录的cookie,很顺利的更改了登录密码。
防御

维护层面(不保险)

网上一些开源项目被很多用户使用,这些项目无法保证一定没有CSRF漏洞,搞不好就是群体性网络安全事件,及时更新补丁,及时排查。
弃用get(不保险)

可以使用POST,避免一个链接就引发的CSRF攻击。
弃用cookie改用token(不保险)

只要浏览器存有cookie,哪怕请求是一个图片也会被带上cookie信息。改用LocalStorage存token后,默认任何请求不会携带token,利用js仅让请求业务接口时带上token就好。
检测referer(不保险)

referer是浏览器请求头的一个属性,用于检测当前请求的资源,是来源于那个页面,如果没有这个属性,那就是本页面。
服务端可以在业务代码前,检测referer的值,如果不是受信任的站点,直接拒绝。注意referer可以伪造。
添加验证码(还行)

关键的节点可以添加验证码的前置验证,通过蹦出来的验证码阻断恶意请求。
如果每个请求都加,用户体感很不好。
添加csrf_token(保险)

前提要保证,有CSRF风险的接口,不允许GET请求,除了GET请求之外的全部需要CSRF_TOKEN,从而实现安全隔离。
为什么我认为get请求不需要csrf_token?

get是用来获取数据的,一般可以定义为检索数据,没有写操作。get也可以添加csrf_token,技术上能实现,但是可能增加复杂度,并且大部分业务场景下不需要。
为什么csrf_token要放置在session中,而不放置在cookie中?

前后端分离的架构,用cookie存令牌,还需要csrf_token吗?

没必要,因为有了也不安全。因为用cookie存令牌,csrf_token也无法像MVC那样,在页面加载时同步生成,需要请求接口,期间并不安全(下文有讲)。
为什么前后端分离的架构,不推荐用csrf_token?


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4