DVWA--CSRF(全难度)

DVWA–CSRF(跨站请求伪造)

原理参考:网络安全笔记-99-渗透-CSRF

逻辑

在输入框中输入新密码,可修改当前用户的密码。

难度分级

Low

image-20210204165013208

通过BP抓包,可以发现修改密码的请求是GET方式,直接修改GET请求参数就可以完成密码修改。

image-20210204164845575

只要访问该链接即可修改密码: http://192.168.17.141/DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change

在BP里生成POC:

image-20210204170352644

image-20210204170414747

然后点击"Test in browser"。

复制url并访问即完成了密码修改。

我们也可以创建一个恶意页面,诱使用户访问。当用户访问的时候,dvwa的登录用户密码即被修改。

<!DOCTYPE html>
<html>
<head>
	<title>csrf test</title>
</head>
<body>
<script type="text/javascript" src=" http://192.168.17.141/DVWA/vulnerabilities/csrf/?password_new=12345678&password_conf=12345678&Change=Change"></script>
hello
</body>
</html>

访问这个页面即被修改密码。

核心代码:
<?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);
}

?> 
分析:

如果两次输入的密码一致,则更新数据库密码的密码。

Medium

核心代码:

image-20210204173103051

验证了当前请求的Referer。

  • ‘SERVER_NAME’

    当前运行脚本所在的服务器的主机名(可能与Host相同)

  • ‘HTTP_REFERER’

    Referer值

分析:

同样使用BP 的POC功能,发现Referer值不对,此处修改Referer值为:http://192.168.17.141/DVWA/vulnerabilities/csrf/即可成功完成密码修改。

image-20210204180701522

High

核心代码:
<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // 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);
}

// Generate Anti-CSRF token
generateSessionToken();

?> 
分析:

High级别加入了Token机制。

抓包如下:

image-20210204182502280

Impossible

核心代码:

image-20210204185703535

分析:

抓包如下:

image-20210204190320635

需要验证token。

在修改密码之前需要验证当前密码,这是一种比较普遍的做法。在攻击者不知道当前密码的情况下是无法完成攻击的。并且在数据库操作上采用了PDO的方式防止SQL注入。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值