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,继而提交恶意请求


  • 相关阅读:
    结构体和枚举
    [转载]玩转Asp.net MVC 的八个扩展点
    SQLServer处理亿万级别的数据的优化措施
    Lambda表达式
    匿名类型
    单例模式——懒汉式和饿汉式详解
    Cglib动态代理实现原理
    集合的子集
    深入剖析ThreadLocal
    java注解的自定义和使用
  • 原文地址:https://www.cnblogs.com/vspiders/p/7399089.html
Copyright © 2011-2022 走看看