【開山安全笔记】跨站请求伪造CSRF


我的博客:https://kitescat.github.io/
欢迎关注公众号:打代码的猫

1 CSRF原理

CSRF, Cross-site request forgery,即“跨站请求伪造”,是指攻击者可能利用网页中的恶意
代码强迫受害者浏览器向被攻击的Web站点发送伪造的请求,篡夺受害者的认证Cookie等身份
信息,从而假冒受害者对目标站点执行指定的操作。
简单来讲,CSRF 攻击就是黑客冒用用户身份并通过第三方的站点执行非法操作。这种攻击我们也称为“One Click Attack”或者Session Riding。

1.1 什么是cookie?

在 Web认证中 ,因为HTTP协议本身的局限,必须采用其他技术将相关认证标记以某种方式持续传送,以免客户从一个页面跳转至另一个页面时重新输入认证信息。
Cookie由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。
图片
csrf漏洞的成因就是网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要是访问这个网站,都会默认你已经登录的状态。而在这个期间,攻击者发送了构造好的csrf脚本或包含csrf脚本的链接,可能会执行一些用户不想做的功能(比如是添加账号等)。这个操作不是用户真正想要执行的。

1.2 攻击流程

一个典型的CSRF攻击有着如下的流程:

受害者登录 a.com,并保留了登录凭证(Cookie)。

攻击者引诱受害者访问 b.com。

b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带 a.com 的 Cookie。

a.com 接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。

a.com 以受害者的名义执行了 act=xx。

攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让 a.com 执行了自己定义的操作。

在这里插入图片描述

典型的CSRF攻击

一个CSRF漏洞攻击的实现,其需要由三个部分来构成

有一个漏洞存在(无需验证、任意修改后台数据、新增请求);

伪装数据操作请求的恶意链接或者页面;

诱使用户主动访问或登录恶意链接,触发非法操作

2 CSRF防御

CSRF的防御可以从两个方面考虑,一是后台接口层做防御,另一个则是在前端做防御。

2.1 后端防御CSRF

后端防御主要是区分哪些请求是恶意请求,哪些请求是来自本网站的请求。区分恶意请求的方式有很多,以下介绍两种。

一、CSRF Token

这种方式是在表单页面生成一个随机数,这个随机数一定要后端生成,并且对这个随机数进行存储。举个例子,在前端页面中,对这个Token表单项进行隐藏。代码如下:

<form method="post" action="/transfer">
<input type="hidden" name="_csrf" value="4bfd1575-3ad1-4d21-96c7-4ef2d9f86721"/>
<input type="text" name="amount"/>
<input type="hidden" name="account"/>
<input type="submit" value="Transfer"/></form>

_csrf就是CSRF Token。我们看到他的value是一个UUID,这个UUID是后台生成的。当用户点击转账按钮时,会给银行的后台发送请求,请求中包含_csrf参数,如下:

POST /transfer HTTP/1.1Host: www.a-bank.comCookie: JSESSIONID=randomidContent-Type: application/x-		www-form-urlencoded
amount=100.00&account=9876&_csrf=4bfd1575-3ad1-4d21-96c7-4ef2d9f86721

银行后台接收到这个请求后,判断_csrf的值是否存在,如果存在则是自己网站的请求,进行后续的流程;如果不存在,则是恶意网站的请求,直接忽略。

二、通过请求头中的referer字段判断请求的来源

每一个发送给后端的请求,在http请求头中都会包含一个referer字段,这个字段标识着请求的来源。如果请求是从银行网站发出的,这个字段会是银行网站转账页的链接,比如:https://www.a-bank.com/transfer-view;如果是从恶意网站发出的,那么referer字段不会是银行网站。我们在做后端防御时,可以先取出每个请求的请求头中的referer字段,判断是不是以自己网站的域名开头,在咱们的示例中,如果referer字段是以https://www.a-bank.com/开头的,则继续执行转账操作;如果不是,则直接忽略掉这个请求。

以上就是后端防御CSRF攻击的两种方式,都需要在后端做特殊的处理。当然也可以在前端做处理,我们接着往下看。

2.2 前端防御CSRF

既然CSRF攻击的危害这么大,为什么不能在前端禁止这种请求呢?各大浏览器厂商似乎也注意到了这个问题,谷歌提出了same-site cookies概念,same-site cookies 是基于 Chrome 和 Mozilla 开发者花了三年多时间制定的 IETF 标准。它是在原有的Cookie中,新添加了一个SameSite属性,它标识着在非同源的请求中,是否可以带上Cookie,它可以设置为3个值,分别为:1) Strict 2) Lax 3) None

Cookie中的内容为:

POST /transfer HTTP/1.1Host: www.a-bank.com
Cookie: JSESSIONID=randomid; SameSite=Strict;

Strict是最严格的,它完全禁止在跨站情况下,发送Cookie。只有在自己的网站内部发送请求,才会带上Cookie。不过这个规则过于严格,会影响用户的体验。比如在一个网站中有一个链接,这个链接连接到了GitHub上,由于SameSite设置为Strict,跳转到GitHub后,GitHub总是未登录状态。

Lax的规则稍稍放宽了些,大部分跨站的请求也不会带上Cookie,但是一些导航的Get请求会带上Cookie,如下:

上面的表格就是SameSite设置为Lax的时候,Cookie的发送情况。

None就是关闭SameSite属性,所有的情况下都发送Cookie。不过SameSite设置None,还要同时设置Cookie的Secure属性,否则是不生效的。

3 常见问题

1. CSRF 与 SSRF 区别

CSRF (Cross-Site Request Forgery) 即跨站请求伪造,伪造用户请求,冒用用户身份。

SSRF (Server-Side Request Forgery) 即服务端请求伪造,就是伪造一个服务端请求,攻击者伪造服务端的请求发起攻击,攻击者借由服务端为跳板来攻击目标系统。

用非常通俗的语言讲的话,CSRF 更像是钓鱼的举动,是用户攻击用户的;而对于 SSRF 来说,是由服务器发出请求,用户攻击服务器的。

2. XSS 与 CSRF的区别

XSS (Cross Site Scripting) 跨站脚本攻击 与 CSRF 的最大区别在于对 Cookie 的使用,XSS 把受害者 的 Cookie 偷过来,而 CSRF 则是借用了受害者的 Cookie。

3. samesite防御CSRF的原理

在原有的Cookie中,新添加了一个SameSite属性,它标识着在非同源的请求中,是否可以带上Cookie,它可以设置为3个值,分别为:Strict Lax None

4. json格式的CSRF如何防御?

前景知识:

json格式的CSRF存在的条件是POST 传参采用 JSON 格式,而不是传统的parameter=value的格式。一般采用 Json 格式传输参数时,请求包中都有 Content-Type 头,一般服务器也会验证 Content-Type 值是否为 application/json,当服务器验证 Content-Type 时,若不符合要求,则会抛出异常,导致传输的数据失效。
1)用户操作验证,在提交数据时需要输入验证码
2)请求来源验证,验证请求来源的referer
3)表单token验证

5. 什么是同源策略?

同源策略由Netscape公司引入浏览器。目前,所有浏览器都实行这个策略。含义是指:A网页设置的Cookie,B网页不能打开,除非这两个网页“同源”。所谓同源指的是“三个相同”

协议相同
域名相同
端口相同

4 总结

CSRF的关键字有:冒用用户身份凭证,前端same-site,后端token及refer检测防御。由于还在学习阶段,CSRF总结笔记后面再进行补充。

5 参考链接

https://www.freebuf.com/articles/web/206407.html
https://xz.aliyun.com/t/7911
https://cloud.tencent.com/developer/beta/article/1458194
https://mp.weixin.qq.com/s/XRqiLVdUzvzhD-bw2L3hhQ
WEB常见漏洞之CSRF(靶场篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值