CERT

웹 모의해킹: CSRF

Pdev37 2024. 10. 5. 12:37

특징

  • CSRF는 Cross-Site Request Forgery의 약어로, "사이트 간 요청 위조"라는 의미
  • 이는 사용자의 의도와 무관하게 공격자가 사용자의 권한으로 특정 웹 서버에 의도된 행위(예: 게시글 작성, 수정, 삭제, 비밀번호 변경)를 요청할 수 있는 취약점
  • 주로 사회공학적 기법 중 하나인 피싱(Phishing)을 통해 악의적인 사이트로 유도하여 공격에 이용

DVWA 실습

Security Level low 에서 실습 진행

  • CSRF 공격탭에 존재하는 비밀번호 교체 페이지
  • 교체할 비밀번호 입력후 비밀번호 변경 요청
  • 이때, burp suite 사용하여 패킷 분석

  • CSRF 공격탭에서 패스워드 변경을 위해 입력한 값이 password_new, password_conf 파라미터에 저장되고 change 파라미터와 함께 GET 메소드를 이용하여 서버에 전송하는 것을 확인

  • 위에서 확인한 URL에 비밀번호 정보를 바꿔서 다른탭에서 접속 시도
  • 만약 하이퍼링크를 통해 URL의 정보를 가리고 피싱으로 클릭을 유도한다면 사용자가 공격에 노출될 확률 증가

  • CSRF탭이 열리면서 비밀번호가 변경됨

소스코드 분석

<?php
if( isset( $_GET[ 'change' ] ) ) {
    // 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("MySQL Connect Error: " . mysqli_connect_error(), E_USER_ERROR)) ? "" : "" ));
        $pass_new = md5( $pass_new );

        // Update the database
        $current_user = dwuCurrentUser();
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . $current_user . "';";
        $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()) ? false : $___mysqli_res))) . '</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);
?>
  • CSRF 보호를 위한 보호 매커니즘이 존재 하지 않음
  • 변경시 주로 입력하는 기존비밀번호 검증 없음

대응방안

  • 사용자 관점에서 의심 되는 URL을 클릭 금지
  • 패스워드 변경 요청을 위조한 공격의 경우에는 기존 패스워드를 추가적으로 입력하게 구현
  • 다른 요청을 위조할 경우에는 HTTP 헤더의 Referrer가 현재 같은 도메인에서 오는 요청인지 검증하여 다른 도메인에서의 요청 차단
  • Security Token(CSRF Token)을 사용하여 세션에 저장된 토큰값과 요청 파라미터에 전달되는 토큰 값이 일치하는지 검증