발자취
#09 크로스 사이트 스크립팅, 크로스 사이트 요청 변조 공격 본문
#01 크로스 사이트 스크립팅 공격
정의
- 공격자가 사용자의 웹 브라우저에 악성 스크립트 코드를 주입하고, 사용자가 악성 스크립트 코드를 실행함으로써, 사용자의 정보를 악의적으로 탈취하는 공격 기법
종류
- 반사된 크로스 사이트 스크립팅
- 저장된 크로스 사이트 스크립팅
- DOM 기반의 크로스 사이트 스크립팅
1. 반사된 크로스 사이트 스크립팅 (세션 토큰 탈취)
공격 흐름
1) 정상 사용자가 서버에 로그인해 접속
2) 공격자가 정상 사용자라는 희생자를 통해 서버에 악성 스크립트를 주입 (마치 정상 사용자의 정상적인 요청인 것처럼 반사시킴)
3) 서버는 그 코드를 받아 정상 사용자에게 응답함
4) 받은 악성 스크립트가 정상 사용자의 브라우저에서 실행됨
5) 정상 사용자의 주변 정보가 공격자에게 탈취됨
6) 공격자는 탈취한 세션 토큰을 가지고 자기가 마치 정상 사용자인 것처럼 접속함
2. 저장된 크로스 사이트 스크립팅 (세션 토큰 탈취)
공격 흐름
1) 공격자가 먼저 서버에 접속하여 서버의 안에 악성 자바 스크립트를 심어둠 (서버의 데이터베이스나 오랜 시간 저장되는 곳에 악성 스크립트를 심음)
2) 정상 사용자가 서버에 접속해서 악성 자바 스크립트를 실행함
3) 정상 사용자가 조작된 URL을 액세스해 서버에 요청함
4) 서버로부터 응답이 옴
5) 정상 사용자가 악성 스크립트를 실행함
6) 공격자가 마치 정상 사용자인 것처럼 접속함
3. DOM 기반의 크로스 사이트 스크립팅 (세션 토큰 탈취)
반사된 크로스 사이트 스크립팅과 거의 유사한 공격 흐름을 가짐
반사된 크로스 사이트 스크립팅과의 차이점: 서버의 응답에 공격자의 악성 자바 스크립트가 포함되지 않음. (서버의 취약점을 이용한 공격이 아니라 DOM, 즉 브라우저의 취약점을 통해 자바 스크립트가 실행되는 구조)
4. 크로스 사이트 스크립팅 공격 비교
1) 반사된 크로스 사이트 스크립팅
- 서버의 취약점 악용 -> 서버의 응답에 스크립트 코드가 포함됨
- 공격자는 사용자가 URL 요청을 보내는 시간을 알아야 함 (근데 사실 이건 개념적인 이야기이고, 더 정확히는 악성 스크립트에 연결되는 링크가 짧은 시간동안 올라가 있음)
2) 저장된 크로스 사이트 스크립팅
- 서버의 취약점 악용 -> 서버의 응답에 스크립트 코드가 포함됨
- 공격자는 사용자가 URL 요청을 보내는 시간을 몰라도 됨 (더 정확히는 악성 스크립트에 연결되는 링크가 긴 시간동안 올라가 있음)
3) DOM 기반의 크로스 사이트 스크립팅
- 서버의 응답을 변경하지 않음
- 브라우저의 DOM에 대한 취약점을 악용함
5. XSS 공격의 payload
1) 가상 디페이스먼트: 피싱의 목적을 가지고 XSS 공격 사용
- 악의적인 데이터(거짓된 html 사이트 정보, 스크립트를 이용한 정교한 콘텐츠와 네비게이션)를 웹 어플리케이션의 페이지에 넣어서 사용자에게 거짓된 정보를 전달
2) Trojan 기능 주입: 정상 사이트처럼 보이지만 사실 악의적인 사이트 (트로이목마처럼)
3) 클라이언트 측 공격기능 증대
- Log keystroke: 윈도우 상에서 입력된 키값들을 수집하는 공격 가능. 사용자가 키보드에서 키를 누르는 순간 function이 발생함. (은행에서 키보드가 아니라 마우스로 입력하게 하는 이유도 이것때문)
- 클립보드의 콘텐츠를 수집: 어떤 정보를 입력하면 클립보드에 잠깐 들어가 있게 됨 -> 이 정보를 악성 스크립트 코드로 수집
- 사용자가 최근에 방문한 Third part 사이트 발견: 사이트 방문 기록 확인 -> 희생자가 자주 방문한 사이트에 악성 스크립트 코드를 심어 놓을 수 있음.
6. XSS 취약점을 찾고 악용하기
1) XSS 취약점 확인하는 기본 방법
“><script> alert(document.cookie) </script> 와 같은 형태의 공격 문자열을 보내봤을 때, 응답 안에 이 문자열이 그대로 나타나면 해당 어플리케이션은 XSS 공격에 취약한 것이다
- 예제1: form의 value 부분에 “><script>alert(document.cookie)</script><!-- 와 같은 악성 자바 스크립트를 입력
- 예제2: <script>의 변수 값에 ';alert(document.cookie); var foo=' 와 같은 내용을 포함하게 함
7. XSS 공격 예방
1) 입력 유효성 검사 (입력값 필터링)
- 입력값 길이 제한
- 지정된 문자들만 허용
- regular expreesion과 일치해야만 허용: 허용된 문자들이 다양한 형태로 변형될 수 있기 때문에 이를 정형화된 표현으로 바꿔 표현
2) 출력 유효성 검사
alert와 같이 대화상자를 띄우거나 사용자가 의도하지 않은 출력값이 나타나면 XSS 공격일 가능성이 있음.
3) 위험한 insertion point 제거
사용자가 제어하는 데이터가 직접 자바스크립트에 삽입되지 못하게 함
8. 문자열 기반 XSS 필터 회피 예제
1) 필터 1: 필터 안의 문자열의 형태를 살짝 변형해서 사용
필터 안에 <script>가 있다고 하면
- <script >
- <ScRiPt>
- foo%00<script>
- <scr%00ipt>
- %3cscript%3e: URL 인코딩
과 같이 회피할 수 있음
2) 필터 2: 공격 문자열에 있는 인용부호 (') 앞에 역슬래시 (\) 문자를 붙임
-> 효과: 인용부호 앞에 역슬래시를 붙이는 방어체계가 있는 경우, 방어체계에 의해 붙은 역슬래시와 공격자가 붙인 역슬래시까지 총 2개의 역슬래시가 붙어 역슬래시 방어의 의미가 없어짐
9. Cross-Site Request Forgery (CSRF) 공격
1) 기본 개념
- 공격자가 다른 사용자의 HTTP 요청을 위조하는 공격
2) CSRF 공격 취약점: 이미지, 그림 파일과 같은 Src를 위조함
3) CSRF 공격 방어
- 안전하게 생성되고 관리된 SameSite 쿠키를 이용해서 공격을 방어함
[SameSite 쿠키를 이용하여 CSRF 공격을 방어하는 법]
사이트 도메인 URL(실제 사용자가 사용하는 사이트)과 쿠키 도메인 URL(실제 진짜 사이트)를 사용함
1) 정상적인 경우: 사이트 도메인 URL == 쿠키 도메인 URL
2) CSRF 공격: 사이트 도메인 URL != 쿠키 도메인 URL
- CSRF 공격은 요청값을 위조하는 공격이므로 사이트 도메인 URL은 위조된 URL, 쿠키 도메인 URL은 정상 URL을 줌
- 사이트 도메인 URL 정보와 쿠키 도메인 URL 정보가 같아야 쿠키를 발급받을 수 있음!
[SameSite 쿠키 옵션]
- None
- Lax: 링크 통한 사이트 도메인
- Strict: 직접 입력된 사이트 도메인에서만 SameSite 쿠키를 발급해줌 (링크 통해 들어가면 쿠키 안 줌)
'3-1 > 웹 어플리케이션 보안' 카테고리의 다른 글
| #11 RAON CTF 문제 풀이-2 (XSS 1,2 / JavaScript 1,2,3) (0) | 2023.05.16 |
|---|---|
| #10 RAON CTF 문제 풀이-1 (Protocol Level 1,3 / Client Lever 1,2,3) (0) | 2023.05.09 |
| #08 클라이언트 통제 우회 (0) | 2023.05.07 |
| #07 SQL Injection 공격 (0) | 2023.05.07 |
| #06 자바 스크립트 코드 실습 (0) | 2023.04.14 |