CSRF漏洞的攻击与防御

什么是CSRF?

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。它在 2007 年曾被列为互联网 20 大安全隐患之一。CSRF 攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作。

 

CSRF与XSS的关系

XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。

 

Wooyun案例

WooYun-2016-177823

WooYun-2016-182693

 

CSRF攻击实例

这里以DVWA为实例。

 

难度等级:低

查看后端发现是没有任何验证的

 

 

CSRF漏洞的攻击与防御_第1张图片

 

通过F12把表单复制出来

修改action地址

CSRF漏洞的攻击与防御_第2张图片

 

CSRF漏洞的攻击与防御_第3张图片

输入密码123456,点击channge后会跳转页面并提示密码被改变。

 



 

难度等级:中

 

查看后端代码,发现有一定的防御机制,验证了referer,但是只是验证了server_name是否存在。

 

CSRF漏洞的攻击与防御_第4张图片

 

 



CSRF漏洞的攻击与防御_第5张图片

 

我们只要利用在http请求中Referer字段中包含Host就可以,因此我们重命名csrf.html为www.dvwa.com.html,然后通过在新建一个网页1.html,1.html页面嵌入www.dvwa.com.html,然后先访问1.html,然后输入密码点击change,可以发现修改成功了。

 

CSRF漏洞的攻击与防御_第6张图片

 



 

 

难度等级:高

通过后端代码,我们可以看到它验证了user_token,因此我们需要打一套组合拳,csrf攻击经常需要配合其他漏洞,才能发挥其最大功能。

 

CSRF漏洞的攻击与防御_第7张图片

CSRF漏洞的攻击与防御_第8张图片

CSRF漏洞的攻击与防御_第9张图片

 

 

CSRF防御之道

 

1.验证 HTTP Referer 字段。

 

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://pay.website.com/pay?account=bob&amount=1000000&for=Mallory,用户必须先登陆 pay.website.com,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的 Referer 值就会是转账按钮所在的页面的 URL,通常是以 pay.website.com 域名开头的地址。而如果黑客要对网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到网站时,该请求的 Referer 是指向黑客自己的网站。因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 pay.website.com 开头的域名,则说明该请求是来自网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

 

2.在请求地址中添加 token 并验证。

CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

 

 

3.在 HTTP 头中自定义属性并验证。

这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

 

你可能感兴趣的:(CSRF漏洞的攻击与防御)