本文主要内容有三点:
1. WHAT?
1-1. 什么是跨站请求伪造 CSRF,会造成什么后果?
2. WHY?
2-1. 为什么CSRF会有 1 中提及的危害,如何实现?
3. HOW?
3-1 如何防范CSRF?
3-2 CSRF与XSS结合
3-3 cookie的samesite属性
1-1 什么是跨站请求伪造 CSRF,会造成什么后果?
跨站请求伪造:CSRF
或XSRF
(Cross Site Request Forgery)
攻击者盗用
目标网站的合法
用户的身份
,向目标网站发送合法请求
。
2-1 为什么CSRF会有 1 中提及的危害,如何实现?
CSRF攻击举例:
1、 用户登录了xx社交平台,xx社交平台在用户本地cookie保存表征身份的token;
2、用户点击邮件中链接或其他方式进入攻击者的网站aahack.com,攻击者网站aahack.com向xx社交平台静默发出 关注、点赞、投票、转账等请求,由于携带了合法用户的xx社交平台的全部cookie,xx平台认可为合法用户的操作;
从CSRF攻击的例子可以看出,若合法网站在cookie中存储用户的身份token且以此token作为用户身份鉴权的部分(仅以此鉴权或结合其他字段鉴权),则此网站一定存在CSRF的漏洞。无论在何页面向此合法网站发送请求,都可以携带所有此网站已存在的所有cookie。
即实现CSRF有三点要素:
- 合法目标网站在cookie中存储用户的身份token且以此token作为用户身份鉴权(仅以此鉴权或结合其他字段鉴权,结合其他字段鉴权的情况可参考
3-2 CSRF与XSS结合
); - 合法用户登陆了该合法目标网站,本地cookie中存有该token;
- 引导用户进入攻击网站 。
3-1 如何防范CSRF?
1. Server端验证请求来源
Server端验证Referer 和 Origin(但Origin只存在于post请求,Referer 和 Origin都可能为空,Referer可以被伪造)
2. 增加鉴权参数csrf-token
【2-1】csrf-token有两种存放方式
在页面中或在cookie中,若服务端渲染的页面可放在页面中,前端渲染的页面可以在response中set cookie。
注意服务端Access-Control-Allow-Origin 不要设置为*
,防止CSRF攻击页面请求目标网站页面 通过解析respose得到页面中存放的csrf-token或response header中的set-cookie
【2-2】 请求时将csrf-token加在header中
若通过xss等方式获取到了csrf-token,csrf-token作为自定义字段加在header中时 该请求变成跨域的复杂请求,浏览器会先发Options嗅探请求,服务端可通过Access-Control-Allow-Origin和Access-Control-Allow-Methods进行拦截
3-2 CSRF与XSS结合
CSRF
可在浏览器中向合法地址的请求中携带合法用户的全部cookie,但不能操作cookie的值,cookie之外的鉴权信息也获取不到(除非合法地址的服务端特别设置了Access-Control-Allow-Origin:*);
XSS
可以获取到页面上几乎所有的鉴权信息包含cookie和存储在页面上的信息,但是获取不到httpOnly属性被设置为true的cookie
(防xss还可以在response增加防xss的header头x-xss-protection:1;mode=block // 开启浏览器过滤xss,发现xss攻击不删除页面,只是阻止页面加载
content-security-policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none' //现代浏览器可以通过设置content-security-policy禁止不安全的内联);
二者结合
则可以获取到全量的cookie 和页面信息,并可以使用httpOnly属性不为true的cookie
3. cookie中存储的鉴权参数需设置httpOnly属性为true
3-3 cookie的属性samesite
此属性为17年新定义,只有较新版本的浏览器支持
Strict、Lax
Strict:当发生跨站请求时,浏览器发出的请求不会携带目标网站的cookie;
Lax:当用户主动点击而发生跨站请求时,浏览器发出的请求会携带目标网站的cookie;
tips
: 跨站不是跨域, 是根据Public Suffix List 来判断
4. 合理设置网站cookie的samesite属性
综上,防范CSRF可参考四点:
1. Server端验证请求来源
2. 增加鉴权参数csrf-token
3. cookie中存储的鉴权参数需设置httpOnly属性为true
4. 合理设置网站cookie的samesite属性