Dvwa之CSRF全级别学习笔记

发布于:2022-12-06 ⋅ 阅读:(169) ⋅ 点赞:(0)

Csrf

 

CSRF,全称Cross-site request forgery,就是跨站请求伪造,指利用受害者尚未失效的身份认证信息,诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向服务器发送请求,从而完成非法操作(如转账、改密等)。

参考文章:DVWA之CSRF攻击(Low&medium&High)_lwblovezj的博客-CSDN博客

本文为学习笔记,仅供学习!!!

Low

没有进行任何防护直接就可以修改密码

利用url将其修改成能修改管理员账号和密码的恶意链接:

http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

明眼人一眼都能看出这个链接的用途,所以我们可以利用域名缩短工具,发送到被攻击者主机,诱使被攻击者点击链接,从而导致密码被修改。或者编造具有诱惑性的网站(性感荷官在线发牌、某某颜色网站、某豆等不健康的网站,或安全破解工具网站即使安装的安全软件提醒,管理员也会对其放松警惕)诱使被攻击者点击从而修改密码

编造恶意网页

<html>

     <head>

     </head>

            <body>

               <a href="http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#" />

<img src="http://127.0.0.1/tupian.jpg" border="0"  width="800" height="600" />

</a>

            </body>

</html>

生成链接发送给被攻击者,诱使其点击链接

 

 

点击链接发现是某网红潘某,驻足看了一下浑然不知我们已经修改了他的登录密码

等他发现密码被修改了已经为时已晚。

成功将admin的管理员密码修改成12345

Medium

话不多所,继续访问low级别网站

发现行不通,这是怎么回事?原来是忘点图片了,因为是图片链接,不点不生效

为什么和low级别一样可以使用呢?查看源码

 

和low级别相比多stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false

用来检查HTTP包头的Referer参数的值是否包含host参数,通过这个来防御CSRF攻击,意思就是HTTP包头referer必须包含主机名,必须为本地申请才行。

 

本次直接使用low级别的还能攻击成功的原因是,我将恶意网站放在了该网站的服务器里,导致被攻击者访问时点击进入恶意网站,发出修改指令的文件头还是这个主机,所以才能试验成功,通常情况下可以通过上传漏洞将文件传入被攻击者网页中。

High

点击了链接但是没有成功,查看一下源码

 

增加了token用来验证,但可以通过xss漏洞获取user_token来实现攻击,具体实施还不太会,大家可以参考

DVWA之CSRF攻击(Low&medium&High)_lwblovezj的博客-CSDN博客

Impossible

High都不太会,就直接看代码吧

<?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又防止了暴力重试的可能性,基本上算得上是完满了。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到