선릉역 1번 출구

[DVWA] CSRF 본문

Hacking & Security/Hacking

[DVWA] CSRF

choideu 2022. 11. 30. 19:46

CSRF(cross site request forgery)

사용자의 권한을 이용해 웹 애플리케이션을 공격하여 서버에서는 CSRF 공격을 탐지하는 것이 어려움

-> 공격 대상의 세션 토큰을 이용해 세션 토큰이 인증을 허용하고 있을 때 가능한 공격

ex) 사용자가 자신도 모르게 게시물을 작성하거나 자신도 모르게 비밀번호를 변경하는 행위

 

 

1. 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>";            
        }

    }
?>

low의 경우 새 비밀번호와 확인 비밀번호가 같으면 새로운 비밀번호 설정이 가능함 -> 기존 비밀번호를 확인하지 않기 때문에 CSRF에 악용될 가능성이 존재함

 

2. Medium

<?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>";            
            }    

        }
        
    }
?>

Low에서 server의 referer Header를 통해 이전 요청 주소를 확인하는 문구를 추가함 -> 이런 검증 방법은 HTTP 요청 헤더 조작으로 쉽게 우회가 가능함

 

3. High

<?php
            
    if (isset($_GET['Change'])) {
    
        // Turn requests into variables
        $pass_curr = $_GET['password_current'];
        $pass_new = $_GET['password_new'];
        $pass_conf = $_GET['password_conf'];

        // Sanitise current password input
        $pass_curr = stripslashes( $pass_curr );
        $pass_curr = mysql_real_escape_string( $pass_curr );
        $pass_curr = md5( $pass_curr );
        
        // Check that the current password is correct
        $qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';";
        $result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );

        if (($pass_new == $pass_conf) && ( $result && mysql_num_rows( $result ) == 1 )){
            $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 or current password incorrect. </pre>";            
        }

    }
?>

high는 비밀번호를 변경할 때 기존 비밀번호도 같이 작성함 -> 현재 비밀번호를 물어보는 것은 많은 사이트에서 차용한 방식으로 안전한 로직임, CSRF를 차단하는데 효과적임

 

Low

게시글 등록

Stored Xss를 통해 CSRF 공격 수행

로그인 성공

'Hacking & Security > Hacking' 카테고리의 다른 글

System Hacking - Memory Layout  (0) 2022.12.22
Cobalt Strike란?  (0) 2022.12.22
[DVWA] Burp Suite를 사용한 Brute Force  (0) 2022.11.30
XSS and CSRF  (0) 2022.11.19
Command Injection  (0) 2022.10.26
Comments