zoukankan      html  css  js  c++  java
  • DVWA笔记之三:CSRF

    CSRF与XSS不同,它称为跨站请求伪造,它是利用其他页面的恶意脚本来加载访问或操作存在CSRF的漏洞的可信网站。

    1.Low级别

    核心代码如下:

    <?php 

    if( isset( $_GET'Login' ] ) ) { 
        
    // Get username 
        
    $user $_GET'username' ]; 

        
    // Get password 
        
    $pass $_GET'password' ]; 
        
    $pass md5$pass ); 

        
    // Check the database 
        
    $query  "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"
        
    $result mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res mysqli_connect_error()) ? $___mysqli_res false)) . '</pre>' );

        if( 
    $result && mysqli_num_rows$result ) == ) { 
            
    // Get users details 
            
    $row    mysqli_fetch_assoc$result ); 
            
    $avatar $row["avatar"]; 

            
    // Login successful 
            
    echo "<p>Welcome to the password protected area {$user}</p>"
            echo 
    "<img src="{$avatar}" />"
        } 
        else { 
            
    // Login failed 
            
    echo "<pre><br />Username and/or password incorrect.</pre>"
        } 

        ((
    is_null($___mysqli_res mysqli_close($GLOBALS["___mysqli_ston"]))) ? false $___mysqli_res); 


    ?> 

    没有加任何过滤和验证,抓去请求包如下:



    发现它是通过GET形式提交,因此可以构造如下恶意网页1.html:

    <iframe hidden src="http://www.xxx.com/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change" ></iframe>

    将其如果能让可信用户访问,那么会自动更改密码为passowrd。

    2.Medium级别

    核心代码:

    <?php 

    if( isset( $_GET'Change' ] ) ) { 
        
    // Checks to see where the request came from 
        
    if( stripos$_SERVER'HTTP_REFERER' ] ,$_SERVER'SERVER_NAME' ]) !== false ) { 
            
    // 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>"
            } 
        } 
        else { 
            
    // Didn't come from a trusted source 
            
    echo "<pre>That request didn't look correct.</pre>"
        } 

        ((
    is_null($___mysqli_res mysqli_close($GLOBALS["___mysqli_ston"]))) ? false $___mysqli_res); 


    ?> 

    首先想到的是直接伪造REFFER头,但是Cookie也要跟着伪造,此时的PHPSESSION却无法获取,因此只能换一种其他思路。

    还是想着如何进行绕过过滤函数吧。

    首先了解下striops函数

    stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。

    因此访问的地址里只要存在HOST就可以实现过滤的绕过,因此直接构造链接文件为HOST.html即可。

    其中构造的恶意代码不变

    3.HIGH级别

    核心代码如下:

    <?php 

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

    ?> 


    HIGH级别中加入了令牌机制,一种思路是获取USER_token,带USER_TOKEN提交,第二种思路就是通过XSS获取SESSION,继而提交恶意请求


  • 相关阅读:
    1046 Shortest Distance (20 分)(模拟)
    1004. Counting Leaves (30)PAT甲级真题(bfs,dfs,树的遍历,层序遍历)
    1041 Be Unique (20 分)(hash散列)
    1036 Boys vs Girls (25 分)(查找元素)
    1035 Password (20 分)(字符串处理)
    1044 Shopping in Mars (25 分)(二分查找)
    onenote使用小Tip总结^_^(不断更新中...)
    1048 Find Coins (25 分)(hash)
    三个故事
    领导者的举止
  • 原文地址:https://www.cnblogs.com/vspiders/p/7399089.html
Copyright © 2011-2022 走看看