특징

  • Completely Automated Public Turing test to cell Computer and Humans Apart 의 약어
  • 보통 로그인 등의 과정에 추가적인 인증 요소로 포함되어 접근하고자 하는 대상이 실제 사용자인지 컴퓨터인지 구별하기 위해 사용되는 프로그램

DVWA 실습

 

  • captcha 탭에서 변경할 패스워드 입력 후 captcha 진행
  • change 버튼을 클릭하여 변경 요청 전송

  • burp suite를 사용하여 요청 패킷 분석
  • step =1 , 변경된 패스워드 파라미터와 captcha 관련 암호화된 문자와 change 파라미터 확인가능

  • captcha 확인후 change 요청을 다시보내면 변경이 확정되는 요청
  • 비밀번호 변경 완료

  • 이때 요청을 분석해보면
  • step 2 와 변경된 패스워드가 패킷에 담겨 있는 것으로 확인 가능

  • 이 요청을 가지고 와서 임의로 조작후 그대로 재요청
  • 비밀 번호가 변경이 됨
  • step 파라미터만 조작하면 captcha를 무시할수 있는 것으로 추정

소스코드 분석

<?php
if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {
    // Hide the CAPTCHA form
    $hide_form = true;

    // Get input
    $pass_new = $_POST[ 'password_new' ];
    $pass_conf = $_POST[ 'password_conf' ];

    // Check CAPTCHA from 3rd party
    $resp = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=" . DVWA_recaptcha_private_key . "&response=" . $_POST['g-recaptcha-response']);

    // Did the CAPTCHA fail?
    if( !$resp ) {
        // What happens when the CAPTCHA was entered incorrectly
        $html .= "<pre><br/>The CAPTCHA was incorrect. Please try again.</pre>";
        $hide_form = false;
        return;
    }
    else {
        // CAPTCHA was correct. Do both new passwords match?
        if( $pass_new == $pass_conf ) {
            // Show next stage for the user
            echo "<pre><br/>You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>";
            echo '<form action="" method="POST">';
            echo '<input type="hidden" name="step" value="2" />';
            echo '<input type="hidden" name="password_new" value="' . $pass_new . '" />';
            echo '<input type="hidden" name="password_conf" value="' . $pass_conf . '" />';
            echo '<input type="submit" name="Change" value="Change" />';
            echo '</form>';
        }
        else {
            // Both new passwords do not match.
            echo "<pre>Both passwords must match.</pre>";
            $hide_form = false;
        }
    }
}

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
    // Hide the CAPTCHA form
    $hide_form = true;

    // Get input
    $pass_new = $_POST[ 'password_new' ];
    $pass_conf = $_POST[ '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
        $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()) ? false : $___mysqli_res))) . '</pre>' );

        // Feedback for the end user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with the passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }
}

(is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"])) ? false : $___mysqli_res);
?>
  • 현재 페이지는 captcha 확인 절차가 step 1,2 파라미터 하나로만 구성되어 임의로 조작하면 우회가 가능한 상황

대응방안

  1. CAPTCHA 응답은 반드시 JSON으로 디코딩하여 그 성공 여부를 확인
  2. CAPTCHA가 실패하면 그 이후의 모든 비밀번호 변경 프로세스가 중단

'CERT' 카테고리의 다른 글

웹 모의해킹: DOM Based XSS  (2) 2024.10.05
웹 모의해킹: Weak Session IDs  (2) 2024.10.05
웹 모의해킹: File Upload  (2) 2024.10.05
웹 모의해킹: File Inclusion  (0) 2024.10.05
웹 모의해킹: CSRF  (2) 2024.10.05

+ Recent posts