码迷,mamicode.com
首页 > 其他好文 > 详细

新手DVWA-CSRF

时间:2020-07-22 23:28:09      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:成功   strip   conf   where   主机名   count()   anti   链接   res   

CSRF

CSRF (Cross Site Request Forgery)即跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法

low

服务器核心代码

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

?>

从代码看到,对比了输入密码和确认密码是否相同后,对其进行了防SQL注入的过滤,没发现防CSRF的功能

解法

直接构造链接:http://192.168.37.141:89/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#

技术图片

修改成功

medium

服务器核心代码

<?php

if( isset( $_GET[ ‘Change‘ ] ) ) {
    // Checks to see where the request came from
    if( stripos( $_SERVER[ ‘HTTP_REFERER‘ ] ,$_SERVER[ ‘SERVER_NAME‘ ]) !== false ) {
        // 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>";
        }
    }
    else {
        // Didn‘t come from a trusted source
        echo "<pre>That request didn‘t look correct.</pre>";
    }

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

?>

medium难度的代码加了对Referer的判断,需要Referer中包含主机名

解法

burp抓个包 改一下

技术图片

加入Referer

技术图片

修改成功

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来防CSRF,需要在修改密码时同时提交用户的token,所以这里的关键是获取token

常规思路是构造个页面,在用户点击的时候,代码访问修改密码的页面并获取token,然后拼接后提交,完成修改,然而现在的浏览器都不允许跨域访问,页面是不能获取到token的,所以这里仅利用CSRF是不能修改密码的(网上还有很多组合了XSS漏洞的方法,不过利用XSS能获取cookie应该直接登录也可以了)

impossible

服务器核心代码

<?php

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

    // Get input
    $pass_curr = $_GET[ ‘password_current‘ ];
    $pass_new  = $_GET[ ‘password_new‘ ];
    $pass_conf = $_GET[ ‘password_conf‘ ];

    // Sanitise current password input
    $pass_curr = stripslashes( $pass_curr );
    $pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass_curr = md5( $pass_curr );

    // Check that the current password is correct
    $data = $db->prepare( ‘SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;‘ );
    $data->bindParam( ‘:user‘, dvwaCurrentUser(), PDO::PARAM_STR );
    $data->bindParam( ‘:password‘, $pass_curr, PDO::PARAM_STR );
    $data->execute();

    // Do both new passwords match and does the current password match the user?
    if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
        // It does!
        $pass_new = stripslashes( $pass_new );
        $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 database with new password
        $data = $db->prepare( ‘UPDATE users SET password = (:password) WHERE user = (:user);‘ );
        $data->bindParam( ‘:password‘, $pass_new, PDO::PARAM_STR );
        $data->bindParam( ‘:user‘, dvwaCurrentUser(), PDO::PARAM_STR );
        $data->execute();

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

// Generate Anti-CSRF token
generateSessionToken();

?>

直接输入当前密码,能获取到token也无解了

新手DVWA-CSRF

标签:成功   strip   conf   where   主机名   count()   anti   链接   res   

原文地址:https://www.cnblogs.com/N0ri/p/13363418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!