웹 애플리케이션이 점점 더 복잡해짐에 따라, 보안 문제 역시 중요한 이슈로 떠오르고 있습니다.
그 중에서도 XSS (Cross-Site Scripting)는 매우 흔하고 위험한 웹 보안 취약점입니다. 이 포스팅에서는 XSS가 무엇인지, XSS 공격의 종류, 그리고 이를 방지하는 방법에 대해 자세히 알아보겠습니다.
XSS(Cross-Site Scripting)란❓
XSS (Cross-Site Scripting)는 공격자가 웹 페이지에 악성 스크립트를 삽입하여, 해당 웹 페이지를 방문하는 사용자의 브라우저에서 이 스크립트가 실행되도록 하는 공격 기법입니다.
이 공격을 통해 공격자는 사용자의 세션 쿠키를 탈취하거나, 악성 코드 실행, 피싱 사이트로 리다이렉트 등의 악의적인 행위를 할 수 있습니다.
XSS 공격의 위험성
세션 하이 재킹
- 사용자의 세션 쿠키를 탈취하여 사용자를 가장할 수 있습니다.
피싱
- 사용자를 피싱 사이트로 리다이렉트(redirect)하여 민감한 정보를 탈취합니다.
키로깅
- 사용자가 입력하는 모든 데이터를 기록할 수 있습니다.
브라우저 익스플로잇
- 브라우저의 보안 취약점을 이용해 악성 소프트웨어를 설치할 수 있습니다.
XSS(Cross-Site Scripting)공격의 종류
XSS 공격은 크게 세 가지로 분류됩니다.
1. 반사형 XSS(Reflected XSS)
반사형 XSS는 사용자가 웹 애플리케이션에 제공한 입력(예: URL 파라미터, 폼 데이터 등)이 즉시 웹 페이지에 반영될 때 발생합니다.
이 입력이 적절히 필터링되지 않은 경우, 공격자는 악성 스크립트를 포함한 링크를 생성하여 사용자가 해당 링크를 클릭하게끔 유도할 수 있습니다.
- 예시
- 사용자가 검색 기능을 통해 검색어를 입력했을 때, 입력된 검색어가 페이지에 그대로 출력된다면, 악성 스크립트를 검색어에 포함시켜 이를 실행시킬 수 있습니다.
- 공격 흐름
- 공격자는 악성 스크립트가 포함된 URL을 생성합니다.
- 사용자가 이 URL을 클릭하면, 악성 스크립트가 서버로 전달되어 그대로 반영됩니다.
- 브라우저는 반사된 스크립트를 실행하게 됩니다.
2. DOM 기반 XSS(DOM-based XSS)
DOM 기반 XSS는 서버가 아닌 클라이언트 측에서 발생하는 공격입니다.
웹 페이지의 DOM(Document Object Model) 구조가 악성 스크립트에 의해 동적으로 변경되면서 발생하는 XSS입니다. 주로 클라이언트 측 자바스크립트 코드가 사용자의 입력을 처리하는 과정에서 발생합니다.
1. 공격자가 악성 스크립트가 포함된 URL을 생성하고 이를 피해자에게 전송합니다.
- 이 URL에는 악성 스크립트나 데이터가 포함되어 있어, 클라이언트 측 JavaScript가 이 데이터를 처리할 때 문제가 발생하도록 설계되어 있습니다.
2. 피해자가 URL을 클릭하면, 브라우저는 해당 URL로 페이지를 요청합니다.
- 이 요청은 서버에 도달하고, 서버는 정상적인 페이지를 응답으로 돌려줍니다.
- 이 단계에서는 서버 측에서
특별한 조작이 발생하지 않습니다.
3. 서버가 반환한 응답에는 일반적인 HTML 및 JavaScript 코드가 포함되어 있습니다.
- 이 JavaScript 코드가 클라이언트 측에서 실행될 때, URL에서 전달된 데이터를 처리하는 부분이 있습니다.
4. 클라이언트 측 JavaScript가 URL의 파라미터를 분석하고, DOM을 동적으로 수정합니다.
- 이때, 악성 스크립트나 데이터가 DOM에 삽입되며, JavaScript가 이 데이터를 직접 실행하거나 렌더링합니다.
5. 피해자의 브라우저가 악성 스크립트를 실행하여 공격자에게 쿠키 등의 민감한 정보를 전송하거나, 공격자의 의도대로 브라우저 동작을 조작합니다.
- 이로 인해 피해자의 세션 쿠키나 기타 중요한 정보가 유출됩니다.
6. 공격자는 피해자의 세션을 하이재킹하거나 추가적인 공격을 시도합니다.
- 이 단계에서 공격자는 피해자의 권한을 도용하거나, 다른 악의적인 행동을 수행할 수 있습니다.
3. 저장형 XSS (Stored XSS)
저장형 XSS는 공격자가 입력한 악성 스크립트가 서버에 저장되고, 이후 웹 페이지를 방문하는 사용자들에게 그 스크립트가 실행되는 형태입니다.
이 방식은 반사형 XSS보다 더 위험할 수 있습니다. 왜냐하면 한번 공격에 성공하면 다수의 사용자들에게 악성 스크립트를 실행시킬 수 있기 때문입니다.
- 공격자는 악성 스크립트를 포함한 게시물을 작성하고 이를 서버에 저장시킵니다.
- 다른 사용자가 이 게시물을 조회할 때, 악성 스크립트가 포함된 페이지가 로드됩니다.
- 브라우저는 이 스크립트를 실행하여 악성 행동을 수행합니다.
XSS(Cross-Site Scripting) 방어 방법
입력값 검증 및 인코딩
입력값 검증
- 모든 사용자 입력은 서버 측에서 철저히 검증되어야 합니다.
- 예상치 못한
데이터가 포함되지 않도록 입력값을 필터링하고, 허용된 값만 처리하도록 해야 합니다.
출력값 인코딩
- HTML, JavaScript, CSS, URL 등에 사용자 입력을 삽입할 때는 반드시 해당 콘텐츠에 맞게 인코딩해야 합니다.
- 예를 들어, HTML 콘텐츠에서는 <, >와 같은 특수 문자를 <, >로 인코딩합니다.
CSP(Content Security Policy) 설정
CSP (Content Security Policy)는 웹 애플리케이션에서 발생할 수 있는 다양한 공격을 방어하기 위해 사용하는 보안 메커니즘입니다.
주로 XSS(크로스 사이트 스크립팅)와 같은 공격을 방지하는 데 사용됩니다.
CSP는 웹 페이지에서 허용된 콘텐츠의 출처를 명시함으로써, 신뢰할 수 없는 출처로부터의 스크립트 실행이나 리소스 로딩을 제한합니다.
CSP의 동작 방식
CSP는 HTTP 헤더 또는 HTML 메타 태그를 통해 설정할 수 있습니다. 예를 들어, 다음과 같은 HTTP 응답 헤더를 통해 CSP 정책을 설정할 수 있습니다.
Content-Security-Policy: script-src 'self' https://example.com; object-src 'none'; style-src 'self' https://trustedstyles.com
이 정책은 다음과 같은 동작을 하게 합니다:
- 스크립트는 같은 도메인('self')과 https://example.com에서만 로드 가능.
- 임베디드 객체(예: 플래시, 플러그인)는
허용되지 않음(object-src 'none'). - 스타일시트는 같은 도메인('self')과 https://example.com에서만 로드 가능.
JavaScript 안전하게 사용
- DOM 조작 시 주의
- 자바스크립트로 DOM을 조작할 때는, 사용자 입력을
직접 삽입하지 않고, 안전한 방법을 사용합니다. - 예를 들어, innerHTML 대신 textContent를 사용하여 스크립트 실행을 방지합니다.
- 자바스크립트로 DOM을 조작할 때는, 사용자 입력을
- 타사 라이브러리 사용 주의
- 신뢰할 수 없는
타사 라이브러리는 사용하지 않도록 주의하고, 사용 시에도 라이브러리의 보안 상태를 확인합니다.
- 신뢰할 수 없는
HTTPOnly 쿠키 사용
HTTPOnly는 쿠키의 속성 중 하나로, 브라우저의 JavaScript 코드에서 해당 쿠키에 접근하지 못하도록 제한하는 기능입니다.
이 속성을 설정하면, 클라이언트 측 스크립트(예: document.cookie를 통해)로 쿠키에 접근할 수 없게 되며, 쿠키는 오직 서버 간의 HTTP(S) 통신을 통해서만 사용될 수 있습니다.
XSS 공격의 목적 중 하나는 사용자의 세션 쿠키를 탈취하는 것입니다.
세션 쿠키를 탈취하면 공격자는 피해자의 계정에 무단으로 접근할 수 있습니다. 하지만 HTTPOnly 속성이 설정된 쿠키는 브라우저의 JavaScript에서 읽을 수 없기 때문에, 공격자가 XSS를 통해 쿠키를 탈취할 수 없습니다.
Set-Cookie: sessionId=abc123; HttpOnly; Secure
예를 들어 위와 같은 HTTP 응답 헤더가 있을 때 위 설정은 sessionId 쿠키가 JavaScript 코드에서 접근되지 않고, 오직 HTTP 요청에만 사용되도록 보장합니다.
'Security' 카테고리의 다른 글
[Security] CSRF란 무엇일까❓ (0) | 2024.08.20 |
---|---|
[Security] 웹 보안의 필수 요소, CORS: 기본 개념부터 동작 원리까지 (0) | 2024.08.20 |