CSRF详细剖析
CSRF (Cross Site Request Forgery)是跨站域请求伪造。
这个Cross Site跨站类似XSS,但是两者有区分,XSS的Cross Site是指本网站运行了来自其它网站的脚本;而CSRF的Cross Site指的是我在其它的网站对本网站产生了影响。
原理:我以www.a.com和www.b.com两个网站为例子,用户用的是www.a.com,用户正常使用,登陆网站,输入用户名和密码点击登陆,这时候会到a网站后台请求,后台验证用户名和密码正确,登陆成功,后台会会发送一个cookie给到用户的浏览器。
www.b.com是攻击者网站,攻击者通过b网站对a网站发起请求,这个时候他利用用户的cookie,(为什么会有cookie,因为攻击者发送链接比如是一个发表评论功能的poc(poc可以通过burpsuite生成,将提交的表单通过burpsuite抓包右键有个生成CSRF poc)链接给用户)用户去点击用该浏览器打开,刚好该浏览器有用户的cookie,所以就以用户的身份对网站发表评论的操作了。
小结:攻击者利用b.com发起请求到a.com的后端完成相关功能操作,而没有访问前端(后端需要前端登陆才能进入后台,因为用户之前登陆过,浏览器存在cookie了,点开链接的时候就默认不再进入登陆页面,直接操作)
危害:利用用户登录态 用户不知情 完成业务请求 冒充用户发帖 冒充用户发帖背锅
防御:1.禁止第三方网站带Cookies
cookie有个sameSite属性,sameSite=strict这个设置不允许第三方链接带有cookie发送请求,也就是说攻击者链接发过来,用户点击不会带有自身cookie请求。所以用户身份不会被利用,但是sameSite这个设置只适用Chrome和Opera两个浏览器,这两个浏览器共有一个内核,但是还有其他浏览器不适用,所以这个方法目前不太适用。(浏览器未能普及,不适用)
2.验证码:就是每个功能都使用验证码输入验证,比如每次发表评论,需要填写验证码才可以。这样的话攻击者给用户的链接都会失败,因为没有输入验证码,所以做不了任何功能,但是这个方法显然让用户体验性很差,因为任何一个功能都需要输验证码,评论、删除、退出等等,显然体验性不好,所以这个方法目前也不太适用。(用户体验差,不适用)
3.referer:referer是请求里面的一个请求头。禁止来自第三方的链接请求,也就是说,在referer头里面,设置当前a网站的请求访问,来自其它网站都拦截。当然这种方法规则要写严谨,否则也是存在绕过机制,因为有的referer是个摆设,没有做验证。相对来说,这种方法目前很适用。(流行,适用)
4.token:后端生成随机字符串,放到两个地方,一个是页面表单中,第二个是放到cookies中。
实际使用中,input会使用hidden属性隐藏token,第一步下发,就是用户到了发表页面,后端随机给用户这个页面一个token,然后用户发表评论,会带着这个token去后端验证那个token是否一样,如果一样就能成功发表。而攻击者发送链接给用户,用户点击这时候链接给不了token值,所以做不了任何操作。这种方法目前很流行适用,
核心思想:页面中有一个token,而攻击者不会访问前端页面,两个token他都拿不到。
如果两者token缺一呢?只有cookies 的token没有表单中的token提交的时候会把这个token带过去,没办法防御;如果有表单中的token没有cookies中的token,那攻击者随意捏造一个,也可以绕过。所以两者缺一不可。
当然这个token设置一定要随机,而不是一个摆设,像万能验证码那种,随便一串数字就能验证
。而是要真实的去做验证。(很流行,很适用)