DVWA系列(五)——使用Burpsuite进行CSRF(跨站请求伪造)

一、CSRF(跨站请求伪造)简介:

1、CSRF(Cross-site request forgery)

CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。
.
关键词:(1)未失效的身份认证 (2)欺骗其点击恶意连接或者访问包含攻击代码的页面

  • 注意事项:
    • csrf属于业务逻辑漏洞,在服务器上看,所有请求都是合法正常的;
    • xss,sql注入等等都是属于技术漏洞;(客户信任服务器)
    • 不同浏览器之间不能使用cookie值,同一浏览器之间可以使用cookie值;
    • 注意图片不显示,是在浏览器的页面看不到,但是可以通过网页的源码看到的。
2、CSRF与XSS的区别:
  • CSRF属于业务逻辑漏洞,在服务器看来,所有的请求都是合法正常的;
  • XSS、SQL注入等等都属于技术漏洞;
  • XSS:客户信任服务器;
  • CSRF:服务器信任客户(经过身份认证);
3、CSRF攻击成功的前提:
  • 用户必须登录;
  • 黑客必须懂得一些发包请求;
  • 服务器不会有二次认证;
  • 被害者是不知情的;

二、CSRF攻击图示

在这里插入图片描述

  1. 用户首先登录服务器;
  2. 服务器返回cookie;
  3. 然后hacker将可以用于修改用户密码的URL发送给用户;
  4. 用户如果点击该URL,则密码将会被更改(如果没有点击,则密码不会被修改,但密码是否会被更改hacker是不知道的);
  5. 最后,黑客使用用户的用户名和密码尝试进行登录服务器;如果成功,则证明用户点过url,如果没有登录成功,则用户没有点击URL;

三、CSRF(跨站请求伪造)

实验环境
(1)Windows服务器:Win7安装phpStudy服务,IP地址:192.168.85.112;在这里插入图片描述
(2)测试机:Win7物理机(开启代理,代理服务器为burpsuite)

在这里插入图片描述

(3)受害者:虚拟机Win7,IP地址:192.168.85.112;

在这里插入图片描述

实验过程

注:每次登录进去都需要重置数据库,是密码恢复为初始密码!!!

Low级别

1、设置级别——Low

在这里插入图片描述

2、查看源代码;
 <?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Get input
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_new = md5( $pass_new );

        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>
3、分析源码:
  • 从源码中可以看到,密码中不能包含SQL中的特殊字符;
  • 可以看到,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了身份验证的,是检查的cookie,只是这里的代码没有体现= =)。
4、实验步骤:

(注:每次登录进去都需要重置一下数据库,将密码恢复为初始密码)

方式一:构造修改密码连接
  • 如果受害者点击了这个连接,密码就会被修改;
  • 这个修改密码的连接一眼就能看出来这个连接是修改密码的,而且在点击了这个连接后,页面就会显示密码已修改;
4.1> 通过BurpSuite抓取CSRF的包;

通过物理机Win10登录DVWA的CSRF;
在这里插入图片描述

4.2> 保存连接:http://192.168.85.112/DVWA/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change

并查看效果;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.3> 在物理机Win10上点击4.2>中修改密码的链接;

需要注意的是,CSRF最关键的是利用受害者的cookie向服务器发送伪造请求,所以如果受害者之前用Chrome浏览器登录的这个系统,而用搜狗浏览器点击这个链接,攻击是不会触发的,因为搜狗浏览器并不能利用Chrome浏览器的cookie,所以会自动跳转到登录界面。

  • 当受害者点击了这个链接,他的密码就会被改成123;
  • 这种攻击显得有些拙劣,链接一眼就能看出来是改密码的,而且受害者点了链接之后看到这个页面就会知道自己的密码被篡改了;

在这里插入图片描述

有人会说,这个链接也太明显了吧,不会有人点的,没错,所以真正攻击场景下,我们需要对链接做一些处理。

如果修改密码的链接过于明显,可以使用一些缩短链接的方法:

  • 在浏览器百度中直接搜索“”

在这里插入图片描述

  • 输入需要进行短连接的IP地址,获取该IP的短连接为:https://w.url.cn/s/AGuiLyY

在这里插入图片描述

  • 将该短连接输入到浏览器中,进行连接;

在这里插入图片描述

在这里插入图片描述

4.4> 修改密码后就可以按照新密码登录成功了;
  • 源密码登录失败;
    在这里插入图片描述

  • 新密码登录成功;

在这里插入图片描述

方式二:写一个修改密码的脚本文件,尝试访问该页面就可以修改密码;
(1)复制修改密码的连接,并在kali上写入脚本;
  • 复制修改密码连接;
    在这里插入图片描述

  • 上面的连接在kali中写成脚本;

在这里插入图片描述

(2)重置数据库,是其密码恢复为初始值;

在这里插入图片描述

(3)通过物理机Win10访问kali上的脚本;

(如下我们是直接拿物理机进行尝试的,因为我的BurpSuite是安装在物理机上的,两者效果是一样的,都是访问文件,进行点击,密码被修改)

在这里插入图片描述

(4)点击CSRF超级链接,就可以通过BurpSuite抓取修改密码的数据包;

在这里插入图片描述

(5)在BurpSuite中点击Forward是流表通过,此时就可以通过新修改的密码登录成功了;

在这里插入图片描述

方式三:构造攻击页面

显示攻击场景下,这种方法需要实现在公网上上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击。这里为了方便演示(真正的的原因是我租不起服务器==!),就在本地写一个test.html文件,具体代码如下:

<img src="http://192.168.85.112/DVWA/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#" border="0" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>

在这里插入图片描述

访问test.html页面,一般情况下,普通用户看到404的页面信息时会下意识的关闭它,二此时,密码已经在用户访问test.html的时候进行了更改;(我是直接在物理机上的操作,也可以直接认为物理机就是受害者)

在这里插入图片描述

尝试用原始密码登录;

在这里插入图片描述

方式四:结合存储型XSS进行重定向

使用存储型XSS,重定向到test.html页面;

Medium级别

1、查看源码;

在这里插入图片描述

2、源码分析;
  • int eregi(string pattern, string string) —— 检查string中是否含有pattern(不区分大小写),如果有返回True,反之False;
  • Medium级别的代码使用 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,即要求本地登录),希望通过这种机制抵御CSRF攻击。
  • 过滤规则是http包头的Referer参数的值中必须包含主机名(192.168.85.112);
2.1> 在kali中开启apache服务,并将之前的1.html文件(具体内容上面已经写过,这里就不复述了)在原目录中复制一份,重命名为192.168.85.112.html;

在这里插入图片描述

2.2> 使用kali中文件1.html,对Win7中的DVWA进行修改密码,修改密码失败;

在这里插入图片描述

在这里插入图片描述

2.3> 使用kali中文件192.168.85.112.html,对Win7中的DVWA进行修改密码,修改密码成功;

可以发现Referer参数完美绕过过滤规则!!!
在这里插入图片描述

在这里插入图片描述

High级别

1、查看源码:

查看服务器核心代码:

在这里插入图片描述

2、源码分析:

High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。

3、实验步骤:
3.1> 抓包获取登录页面的数据包;

在这里插入图片描述

3.2> 将源码导入到Repeater中,并将数据包的安全级别由High改为Low;

在这里插入图片描述

可以发现密码已经修改成功!!!

4、提供另一种攻击思路:

攻击思路: 当受害者点击进入这个页面,脚本会通过一个看不见框架偷偷访问修改密码的页面,获取页面中的token,并向服务器发送改密请求,以完成CSRF攻击。
.
然而理想和现实的差距是巨大的,这里牵扯到了跨域问题,而现在浏览器是不允许跨域请求的:
.
这里简单解释下跨域,我们的框架iframe访问地址是http://192.168.153.130/dvwa/vulnerabilities/csrf,位于服务器192.168.85.112上,二我们的攻击页面为于黑客服务器10.4.253.2上,两者的域名不同,域名B下的所有页面都不允许主动获取域名A下页面的内容,除非与域名A下的页面主动发送信息给域名B的页面,所以我们攻击脚本时不可能取得修改密码界面中的user taken。
由于跨域是不能实现的,所以我们要将攻击代码注入到目标服务器192.168.85.112中,才有可能完成攻击。下面利用High级别的XSS漏洞协助获取Anti-CSRF token(因为这里的XSS注入有长度限制,不能够注入完整的攻击脚本,所以值获取Anti-CSRF token)。

Impossible级别

1、设置安全级别:

在这里插入图片描述

2、查看源代码:

在这里插入图片描述

3、源码分析:
  • Impossible级别的代码利用PDO技术防御SQL注入;
  • 对于防护CSRF,则要求用户输入原始密码,攻击者在不知道原始密码的情况下,无法进行CSRF攻击。

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值