특징
- 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 파라미터 하나로만 구성되어 임의로 조작하면 우회가 가능한 상황
대응방안
- CAPTCHA 응답은 반드시 JSON으로 디코딩하여 그 성공 여부를 확인
- 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 |