이번에는 크로스 사이트 스크립팅 (XSS, Cross-Site Scripting) 공격에 대해 설명하고, 이를 예방하는 방법을 다뤄보겠습니다. XSS 공격은 웹 애플리케이션에서 사용자 입력을 처리할 때 발생하는 스크립트 삽입 취약점을 악용하여 공격자가 악성 스크립트를 실행할 수 있게 하는 공격입니다. 이 공격은 웹 애플리케이션에서 사용자 데이터를 처리할 때 중요한 보안 취약점이 될 수 있습니다.
6. 크로스 사이트 스크립팅 (XSS, Cross-Site Scripting) 공격
6.1. XSS 개요
크로스 사이트 스크립팅(XSS)은 공격자가 악성 JavaScript 코드를 웹 페이지에 삽입하여, 해당 페이지를 보는 다른 사용자의 브라우저에서 그 스크립트를 실행하는 공격입니다. 이 공격은 사용자의 세션 쿠키, 개인 정보, 계정 권한 등을 탈취하거나 피싱 공격을 수행하는 데 사용될 수 있습니다.
XSS는 주로 사용자 입력을 제대로 처리하지 않고, 이를 웹 페이지에 삽입할 때 발생합니다. 공격자는 사용자의 웹 브라우저에서 임의의 JavaScript 코드를 실행하여 악성 동작을 유도할 수 있습니다.
6.2. XSS 발생 원인
XSS 공격이 발생하는 주요 원인은 입력 값을 제대로 검증하거나 인코딩하지 않고 웹 페이지에 그대로 출력할 때입니다. 예를 들어, 사용자가 입력한 값을 웹 페이지에 직접 출력할 때, HTML 태그나 JavaScript 코드가 실행될 수 있습니다.
- 입력값 필터링 부족: 사용자 입력을 처리할 때 특수 문자(예: <, >, " 등)를 제대로 처리하지 않으면, 공격자는 해당 문자를 사용하여 악성 스크립트를 삽입할 수 있습니다.
- HTML 컨텍스트에서의 스크립트 실행: 사용자가 입력한 값이 HTML 문서 내에서 JavaScript 코드로 실행될 때, 해당 코드가 악용될 수 있습니다.
6.3. XSS 공격 유형
XSS 공격은 주로 세 가지 유형으로 나눌 수 있습니다:
저장된 XSS (Stored XSS):
- 공격자가 악성 스크립트를 서버에 저장하고, 이 스크립트가 다른 사용자에게 제공되는 웹 페이지에 포함되어 실행되는 방식입니다.
- 예시: 사용자가 게시판에 메시지를 작성할 때, 악성 스크립트를 포함한 메시지를 작성하고, 다른 사용자가 이 게시글을 볼 때 해당 스크립트가 실행됩니다.
<div>작성자: <b>admin</b><br>댓글: <script>alert('Hacked!');</script></div>
반환형 XSS (Reflected XSS):
- 공격자가 악성 스크립트를 URL이나 쿼리 파라미터에 삽입하고, 해당 URL을 통해 즉시 실행되게 하는 방식입니다.
- 예시: 사용자가 로그인 페이지에서 잘못된 로그인 정보를 입력하고, 공격자는 로그인 실패 메시지에 악성 스크립트를 삽입하여, 사용자가 페이지를 새로 고침할 때 해당 스크립트가 실행되도록 합니다.
<h1>로그인 실패: <script>alert('Hacked!');</script></h1>
DOM 기반 XSS (DOM-based XSS):
- 클라이언트 측에서 JavaScript를 통해 HTML 요소를 동적으로 수정하거나, DOM을 변경할 때 발생하는 취약점입니다.
- 예시: 클라이언트 측에서 사용자의 URL 파라미터를 받아 처리하는 코드가 취약할 경우, 사용자가 URL에 악성 스크립트를 삽입하여 실행할 수 있습니다.
let user_input = window.location.hash;
document.getElementById("output").innerHTML = user_input;
6.4. XSS 공격의 영향
XSS 공격의 영향은 매우 심각할 수 있으며, 주로 다음과 같은 피해를 야기할 수 있습니다:
- 세션 탈취: 공격자는 세션 쿠키를 훔쳐서 사용자 세션을 가로챌 수 있습니다. 이를 통해 공격자는 다른 사용자의 권한을 탈취할 수 있습니다.
- 피싱 공격: 악성 스크립트를 사용하여 피싱 사이트로 유도하거나, 가짜 로그인 창을 띄워 사용자 정보를 훔칠 수 있습니다.
- 키로깅: 스크립트를 사용하여 사용자의 키 입력을 기록하고, 이를 통해 민감한 정보를 탈취할 수 있습니다.
- 웹 페이지 변조: 공격자는 웹 페이지의 내용을 변경하여 사용자에게 잘못된 정보를 제공하거나, 광고를 삽입할 수 있습니다.
- 서비스 거부(DoS): 악성 스크립트로 인해 브라우저의 성능을 저하시킬 수 있습니다. 예를 들어, 무한 루프를 돌게 하거나, 브라우저 리소스를 과다 사용하게 만들 수 있습니다.
6.5. XSS 대응 방안
XSS 공격을 방어하려면, 주로 입력 값 검증과 출력 시 이스케이프 처리가 필요합니다. 아래는 XSS 공격을 예방하기 위한 주요 대응 방안입니다.
입력 값 검증 및 인코딩
- 입력값 검증: 사용자로부터 받은 입력을 HTML 인코딩이나 JavaScript 인코딩을 통해 스크립트로 실행되지 않도록 처리합니다.
- 인코딩: 사용자가 입력한 특수 문자는 HTML 엔티티로 변환해야 합니다. 예를 들어, <는 <, >는 >로 변환합니다.
- HTML, JavaScript, URL 인코딩: 사용자의 입력을 HTML, JavaScript, URL 각각의 환경에서 처리할 때 인코딩하여 스크립트가 실행되지 않도록 합니다.
// 예시: HTML 이스케이프 처리
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
Content Security Policy (CSP) 사용예시:
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none';">
**CSP(Content Security Policy)**는 웹 애플리케이션이 스크립트나 스타일 시트 등을 어떤 출처에서만 로드하도록 제한하는 보안 기능입니다. 이를 통해 외부 스크립트나 악성 스크립트의 실행을 차단할 수 있습니다.
HTTPOnly, Secure 쿠키 플래그 사용
setcookie("session", $session_value, 0, "/", "", true, true); // Secure 및 HttpOnly 설정
- HTTPOnly 플래그를 사용하면 JavaScript에서 쿠키를 접근할 수 없게 만들 수 있습니다. 또한 Secure 플래그를 사용하면 HTTPS 연결에서만 쿠키가 전송되도록 할 수 있습니다. 이를 통해 세션 쿠키를 안전하게 보호할 수 있습니다.
- 프레임워크 사용 (자동 XSS 방어)
- 최신 웹 프레임워크(예: Django, Ruby on Rails, Express.js 등)는 자동으로 XSS 공격을 방지하는 기능을 제공하며, 출력 시 자동으로 이스케이프를 처리해줍니다. 프레임워크에서 제공하는 템플릿 엔진을 사용하면 XSS 취약점을 줄일 수 있습니다.
DOM Manipulation 시 안전하게 처리
// 안전한 방법
document.getElementById("output").textContent = user_input;
- DOM 조작을 할 때 innerHTML을 직접 사용하는 것보다는 textContent나 setAttribute와 같은 안전한 방법을 사용해야 합니다.
- 정기적인 보안 테스트와 감사
- 자동화된 보안 스캐닝 도구나 침투 테스트를 통해 XSS 취약점을 사전에 탐지하고 수정합니다.
- **웹 애플리케이션 방화벽(WAF)**을 사용하여 XSS 공격을 차단할 수 있습니다.
결론
크로스 사이트 스크립팅(XSS)은 사용자 입력을 처리할 때 발생하는 웹 애플리케이션 보안 취약점으로, 이를 통해 공격자는 악성 스크립트를 삽입하여 세션 탈취, 피싱, 서비스 거부 등의 공격을 할 수 있습니다. 이를 예방하기 위해서는 입력값 검증, 출력 시 이스케이프 처리, CSP 등 다양한 방법을 적용하여 XSS 공격을 방어해야 합니다.
XSS는 웹 애플리케이션 개발 시 반드시 고려해야 할 보안 문제이며, 이를 적절히 방어하는 것이 중요합니다.
'IT' 카테고리의 다른 글
| 인증 우회 (Authentication Bypass) 공격 (0) | 2025.07.15 |
|---|---|
| 서버 사이드 요청 위조 (SSRF, Server-Side Request Forgery) 공격 (0) | 2025.07.15 |
| 버퍼 오버플로우(Buffer Overflow) 공격 (1) | 2025.07.15 |
| 디렉터리 트래버설 (Directory Traversal) 공격 (0) | 2025.07.15 |
| RCE (Remote Code Execution) 해킹 수법 (0) | 2025.07.15 |