CSRF漏洞利用以及防御手段(详细解释)

Posted Le叶a子f

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF漏洞利用以及防御手段(详细解释)相关的知识,希望对你有一定的参考价值。

基础知识

CSRF漏洞基础知识

靶场实验(DVWA)

DVWA security: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);
}

?>

发现源码对csrf漏洞没有进行防御,输入一次新密码然后再确认一次就可以改密码。

那么我们现在模拟攻击者的视角,将内容填写,并且抓包

 发现这里是使用GET请求进行传递变量的,所以第一种攻击手段就是可以发送url给受害者,但是如果直接发送下面这个链接会太过于明显

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

 可以利用短地址进行伪装,这里可以百度搜索百度短地址

http://af0.cn/GzPRv

然后我们现在模拟受害者点击这个恶意地址

发现受害者的密码被成功修改了,但是这种方法可以看出,受害者也可以发现自己的密码被进行了修改,所以介绍下面一种方法,隐蔽性更强。

把构造好的html页面放到公网上。

诱导受害者访问这个html页面,这个页面也可以添加元素修改为中奖页面,并且访问后跳转到其他页面,隐蔽性更强

后面就不再详细列出实验步骤,主要说明防御手段和绕过手段

DVWA security:medium

<?php

    if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
}
其余部分和上面一样
?> 

防御手段:验证Referer

$_SERVER['HTTP_REFERER']:PHP中获取链接到当前页面的前一页面的url链接地址,即HTTP数据包中的Referer参数的值。

$_SERVER['SERVER_NAME']:PHP中获取服务器主机的名称,即HTTP数据包中的Host参数的值。

可以看到,Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME

如果使用上面的手段不进行绕过的化,['HTTP_REFERER']的值是“攻击者构造的html的地址”['SERVER_NAME']的值是“受害者的主机名称”,所以可以得知攻击者和受害者肯定不是同局域网下的。

那么如果想通过上面的防御措施,首先我们是无法修改受害者的主机名称的,但是我们可以将构造的html文件的名字改为“受害者的主机.html”,这样受害者的主机就被包括在referer中了

DVWA security:medium

添加随机token值,并验证

查看源码

checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' )

发现代码中多了这一段内容,这就是验证用户的token。

High 的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。

以上是关于CSRF漏洞利用以及防御手段(详细解释)的主要内容,如果未能解决你的问题,请参考以下文章

CSRF的攻击与防御 详细版

3大Web安全漏洞防御详解:XSS、CSRF、以及SQL注入解决方案

CSRF漏洞的概念利用方式防御方案

CSRF漏洞分析利用及防御

CSRF漏洞攻击原理及防御方案

安全漏洞XSS、CSRF、SQL注入以及DDOS攻击