ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DVWA - CSRF ( Low )
    모의해킹/Groot - 스터디 2023. 6. 4. 14:50

    DVWA - CSRF ( Low ) 입니다

     

     개요 

    이 포스팅에서는 DVWA(Damn Vulnerable Web Application)  CSRF, Low 단계 실습을 진행하면서 공부했던 내용에 대한 내용을 정리해 보았고, 모두 본인이 소유한 가상머신에서 실습이 이루어졌습니다

    실습환경
    M1 MacBook Air
    16G RAM
    UTM - 가상머신
    Kali Linux 2023.1  - Apple Silicon (ARM64)

     

     

     목차 

    1. 취약점 설명 및 분석  -  소스코드 분석, CSRF

    2. CSRF 실습

    3. 대응방안

     

     

     

     취약점 설명 및 분석 

     

     소스코드 분석 

    // 위치 : /var/www/html/dvwa/vulnerabilities/csrf/source -> low.php
    // 중요내용 제외 삭제하였음
    <?php
    
    if( isset( $_GET[ 'Change' ] ) ) {
    
        $pass_new  = $_GET[ 'password_new' ];	// 비밀번호, 비밀번호 확인 정보 가져오기
        $pass_conf = $_GET[ 'password_conf' ];
    
        if( $pass_new == $pass_conf ) {		// 비밀번호 일치 확인
                    
                // 비밀번호가 일치할 경우 비밀번호에 md5 적용
                $pass_new = md5( $pass_new )
                
                // 데이터베이스 변경
                $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser()
                $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die(이하생략);
                    
                // 사용자에게 변경 완료 알려주기
                $html .= "<pre>Password Changed.</pre>";
        }
        else {
                // 비밀번호가 일치하지 않을 경우 에러 메시지 보여주기
                $html .= "<pre>Passwords did not match.</pre>";
        }
    
    }
    
    ?>

    입력된 비밀번호 일치 여부를 확인하고 일치한다면 현재 사용자의 비밀번호를 변경한다

     

    // 위치 : /var/www/html/dvwa/vulnerabilities/csrf -> test_credentials.php
    // 중요내용 제외 삭제하였음
    <?php
    
    // db 연결
    dvwaDatabaseConnect();
    $login_state = "";
    
    if( isset( $_POST[ 'Login' ] ) ) {
    
        $user = $_POST[ 'username' ];			// 아이디 비밀번호 가져오기
    
        $pass = $_POST[ 'password' ];
        $pass = md5( $pass );				// 비밀번호 md5 적용
    
    	// 유저 정보 조회하기
        $query  = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
        $result = @mysqli_query($GLOBALS["___mysqli_ston"], $query) or die('이곳의 내용은 생략');
            
        if( $result && mysqli_num_rows( $result ) == 1 ) {    
        // 로그인 성공
        $login_state = "<h3 class=\"loginSuccess\">Valid password for '{$user}'</h3>";
        }else{
        // 로그인 실패
        $login_state = "<h3 class=\"loginFail\">Wrong password for '{$user}'</h3>";
        }
    
    }
    
    ?>

    아이디와 비밀번호로 유저 정보를 조회하고 유저 정보가 있다면  로그인 성공/실패 메시지를 띄운다

     

     

     CSRF 

    DVWA - CSRF ( Low ) 는 비밀번호를 변경하는 과정에서 비밀번호만 일치한다면 현재 사용자의 비밀번호를 바꾸는 취약점이 있다

     

     

     

     CSRF 실습 

     

     CSRF 적용하기 

    새로운 비밀번호를 asdf로, 비밀번호 확인란도 asdf로 한 뒤 전송했다

     

    유저 정보가 존재하는지 확인하기 위해 로그인을 해 보니 성공했다

     

     

     

     대응방안 

    비밀번호를 변경하는데 별다른 검증 없이 입력된 비밀번호만 일치한다면 해당 유저의 비밀번호를 변경하는데 취약점이 있다

    1.  비밀변호 변경을 정상적으로 이루어지게 하기 위해서 비밀번호 변경 요청은 비밀번호 변경페이지에서 온 요청만 처리하도록 해야 한다

    2.  현재 사용자의 비밀번호까지 입력하도록 한다면 실제 사용자가 아닌 이상 비밀번호를 변경하는데 어려움이 있다

     

     

     

     문제풀이 

    https://ruang0124.tistory.com/212

     

    728x90
Designed by Tistory.