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)을 사용하여 세션에 저장된 토큰값과 요청 파라미터에 전달되는 토큰 값이 일치하는지 검증