CSRF/XSRF跨站请求伪造 WHAT? WHY? HOW?


本文主要内容有三点:

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,会造成什么后果?

跨站请求伪造:CSRFXSRF(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有三点要素:

  1. 合法目标网站在cookie中存储用户的身份token且以此token作为用户身份鉴权(仅以此鉴权或结合其他字段鉴权,结合其他字段鉴权的情况可参考3-2 CSRF与XSS结合);
  2. 合法用户登陆了该合法目标网站,本地cookie中存有该token;
  3. 引导用户进入攻击网站 。

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属性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容