모의해킹&웹취약점진단/주•통기반 웹 취약점 점검

15. 크로스사이트 리퀘스트 변조(CSRF)

sheow13 2023. 12. 22. 11:31
728x90

 개요

- 웹 어플리케이션에서 정상적인 경로를 통한 요청과 비정상적인 경로를 통한 요청을 서버가 구분하지 못할 경우 공격자가 스크립트 구문을 이용하여 정상적인 사용자로 하여금 조작된 요청을 전송 하도록 하여 사용자가 의도하지 않은 악의적인 행위(ex, 게시판 설정 변경 및 자동 댓글, 회원등급 변경 등)가 수행될 수 있는 취약점

- XSS는 클라이언트를 공격하는 것이 주 목표이지만, CSRF는 서버측을 공격하는 것이 주 목표

- XSS는 인증된 세션 없이 공격을 진행하지만, CSRF는 인증된 세션을 악용하는 방법을 주로 사용한다.

- 주요정보통신기반시설 취약점 진단 기준으로 15. 크로스사이트 리퀘스트 변조에 해당

- OWASP TOP 10 2021 A01. Broken Access Control에 해당

 

 

 사전 지식

 

□ 크로스사이트 리퀘스트 변조란?

- 웹 어플리케이션에서 정상적인 경로를 통한 요청과 비정상적인 경로를 통한 요청을 서버가 구분하지 못할 경우 공격자가 스크립트 구문을 이용하여 정상적인 사용자로 하여금 조작된 요청을 전송 하도록 하여 게시판 설정 변경 및 자동 댓글, 회원 등급 변경 등의 문제가 발생할 수 있는 취약점

- CSRF(Cross Site Request Forgery)는 기본적으로 XSS 공격을 이용한 것이며, 가짜, 허위(forgery)로 요청한 값을 게시판에 숨겨 놓았을 경우, 접근자들이 클릭하면 그 접근자가 피해(패스워드 변경, 권한 변경 등)를 받을 수 있는 취약점

 

□ XSS와 CSRF 차이

- XSS 공격은 공격자가 피해자 브라우저 내에서 임의의 JavaScript를 실행하는 것으로, 클라이언트를 공격하는 것이지만 CSRF는 서버측을 공격하여 악성 스크립트를 삽입 후, 희생자 권한으로 악의적인 행위를 진행

- XSS는 인증된 세션 없이 공격하는 방법을 주로 사용하지만, CSRF는 주로 인증된 세션을 악용하는 방법을 사용한다.

 

 CSRF 공격 구문 예시

- method : CSRF 스크립트를 삽입할 메소드 선택

- action : CSRF 공격 수행할 URL 입력

- name : CSRF 공격으로 변경할 대상 선택

- value : CSRF로 변경할 값 입력

- document.forms[0].submit(); : 자동으로 양식 제출하는 스크립트 삽입

더보기

<form method=“[메소드]” action=“[URL]”>
<input type=“hidden” name=“[CSRF로 변경할 대상 선택]” value=“[CSRF로 변경할 값 입력]”>
</form>
<script>
document.forms[0].submit();
</script>

 

CSRF 점검 체크 리스트

- CSRF 점검 하기 전 XSS 취약점이 존재하는가?

- CSRF 토큰을 사용하고 있는가?

- 게시글을 작성하는 페이지가 존재하는가?

 

CSRF 실습 환경

- PortSwigger Web Acedemy

 

CSRF 실습1 

Step 1) PortSwigger Web Academy에 CSRF Lab 접근. LAB 내에 이메일을 변경하는 기능에 CSRF을 활용하여 이메일 주소를 변경하는 것이 목표.

 

 

Step 2) Lab에서 제공한 계정으로 로그인 후 이메일 주소를 변경하는 것을 burp suite으로 확인했을 때, POST 메소드로 요청하는 것을 확인하였으며 CSRF Token과 같은 보호 기법이 없는 것으로 추측.

[Lab에서 제공해 준 계정으로 로그인]

 

[이메일 주소 변경 버튼 클릭]

 

[Burp Suite로 확인 시, CSRF 보호 기법이 존재하지 않는 것으로 추측]

 

[이메일 주소 변경됨을 확인]

 

Step 3) CSRF 공격을 수행하기 위하여 Exploit 서버로 이동. 해당 페이지 Body값에 CSRF 공격을 수행하여 희생자에게 전달할 예정. 공격 수행 시 action은 현재 접근한 LAB을 가리키도록 설정하고 사용자가 수동으로 버튼을 클릭할 필요 없이 자동으로 양식을 제출하는 자바스크립트를 삽입하여 공격 수행 시 자동으로 이메일 주소가 변경되도록 진행.

[CSRF 공격을 수행하기 위하여 exploit 서버로 이동]

 

[공격자 서버로 희생자 서버에 공격할 수 있는 페이지가 뜨는 것을 확인]
[Body값에 CSRF 공격 스크립트 삽입]

 

Step 4) CSRF 공격 수행 후 서버에 저장 및 희생자에게 공격 코드를 전달. 삽입한 exploit 코드가 정상적으로 동작하는지 확인했을 때, 이메일 주소가 변경됨을 확인.

공격자가 서버에 exploit 코드를 삽입하고 희생자의 권한으로 이메일 주소가 변경되었음 확인

[삽입한 공격 구문 저장 후 희생자에게 공격 구문 전달]

 

['View exploit' 버튼을 통해 공격 성공 여부 확인했을 때, CSRF 공격 정상적으로 동작함을 확인]

 

 

크로스사이트 리퀘스트 변조 대응 방안

수동 점검

- 점검 과정에서 CSRF 토큰이 존재하는지 확인

- CSRF 취약점의 경우 XSS 취약점이 존재했을 때 공격 가능하므로, CSRF 점검 전 XSS 취약점이 존재하는 지 점검 필요

[CSRF Token과 같은 보호기법이 존재하는지 점검 필요]

 

[점검할 페이지 내 XSS 취약점이 존재하는지 점검 필요]

 

CSRF 대응 방안

1. 미들웨어에서 CSRF 토큰을 사용하여 CSRF 공격이 진행되지 않도록 설정

 - 사용자에 대한 HTTP 요청이 정상적인 절차에 의한 요청인지를 구분하기 위하여 세션별로 CSRF 토큰을 생성하여 세션에 저장 하고, 사용자가 작업 페이지를 요청할 때마다 hidden 값으로 클라이언트에게 토큰을 전달한 뒤, 해당 클라이언트의 데이터 처리 요청 시 전달되는 CSRF 토큰값을 체크하여 요청의 유효성을 검사

 - CSRF 토큰에 대한 참고 사이트

 

CSRF Token에 관하여 - 레드팀 플레이북

CSRF 토큰은 서버측 애플리케이션에서 생성되고 클라이언트와 공유되는 인증 값이다. 클라이언트는 서버의 통신에 올바른 CSRF 토큰을 포함해야 한다. 그렇지 않으면 서버는 요청된 작업 수행을

www.xn--hy1b43d247a.com

 

MIDDLEWARE = [
   'django.contrib.sessions.middleware.SessionMiddleware',
   # MIDDLEWARE 목록에서 CSRF 항목을 활성화하여 CSRF를 사용할 수 있도록 설정

   'django.middleware.csrf.CsrfViewMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.contrib.meesages.middleware.MessageMiddleware',
   'django.middleware.locate.LocaleMiddleware',
   .....
]

                                                                  [Django 미들웨어 설정(settings.py)]

 

템플릿 페이지
<!--html page-->
<form action="" method="POST">
       {% csrf_token %}   <!--csrf token 사용-->
       <table>
               {{form.as_table}}
        </table>
        <input type="submit"/>
</form>