카테고리 없음

크로스 사이트 스크립트(XSS, Cross-Site Scripting)

텍엔카 2024. 12. 13. 08:51
728x90

1. 개요
크로스 사이트 스크립트(XSS)는 웹 애플리케이션의 보안 취약점을 이용해 악성 스크립트를 삽입하고, 이를 통해 사용자 세션 탈취, 정보 유출, 피싱 공격 등을 수행하는 공격 기법이다.
XSS는 사용자 입력 값을 적절히 검증하거나 필터링하지 않을 때 발생하며, 공격자는 이를 통해 피해자의 브라우저에서 악성 스크립트를 실행할 수 있다.

2. 공격 기법
XSS는 공격 방법에 따라 주로 다음 세 가지 유형으로 분류된다

   1) 저장형 XSS (Stored XSS)
       - 설명 : 악성 스크립트가 서버에 영구적으로 저장되고, 이후 페이지 로드 시 사용자에게 제공됨
              (예: 게시판, 댓글, 프로필 정보에 악성 스크립트 삽입)
       - 공격 과정
     ① 공격자가 웹 애플리케이션에 악성 스크립트를 입력
     ② 서버에 저장된 데이터를 다른 사용자에게 제공
     ③ 사용자 브라우저에서 악성 스크립트 실행
       - 다수의 사용자에게 악성코드 배포 가능

   2) 반사형 XSS (Reflected XSS)
       - 설명 : 악성 스크립트가 서버에 저장되지 않고, 즉시 반사되어 사용자에게 반환됨
              (예: 검색어 입력값에 스크립트를 포함해 응답 페이지에서 실행)
       - 공격 과정
     ① 공격자가 악성 링크를 생성하여 피해자에게 전달
     ② 피해자가 링크를 클릭하면 요청이 서버로 전달되고, 악성 스크립트가 응답에 포함됨
     ③ 사용자 브라우저에서 스크립트 실행
       - 주로 특정 사용자를 표적으로 공격

   3) DOM 기반 XSS (DOM-based XSS)
       - 설명:
         . 서버를 거치지 않고, 브라우저의 DOM(Document Object Model) 조작을 통해 발생
         . 클라이언트 측 스크립트에서 사용자 입력을 신뢰하고 DOM을 직접 수정할 때 발생
       - 공격 과정
     ① 클라이언트 측 스크립트가 URL, 쿠키 등의 값을 DOM에 직접 삽입
     ② 브라우저에서 악성 스크립트 실행.
       - 주로 클라이언트 측 코드 취약점을 악용

3. 취약점 점검
   1) 수동 점검
       - 사용자 입력을 처리하는 모든 부분(입력 필드, URL, 쿠키 등)을 분석
       - 입력값이 적절히 검증되고 필터링되는지 확인
         (예: <script>alert('TEST!!')</script>와 같은 악성 입력값을 직접 테스트)

   2) 자동 점검 : 자동 점검 도구로 XSS 취약점을 탐지하고 약한 요청 및 응답을 분석(예: Burp Suite, OWASP ZAP 등)

   3) 코드 리뷰 : 소스 코드를 검토하여 입력 값 처리 및 출력 로직에서 취약점 여부 확인


4. 대응 방법
   1) 입력값 검증 및 필터링
       - 입력 검증 : 사용자의 입력값을 서버에서 철저히 검증 (허용된 데이터만 입력받도록 제한)
       - 출력 이스케이프 : HTML, JavaScript, URL에 사용자 데이터를 삽입할 때 이스케이프 처리
         예: HTML: & → &, < → &lt;, > → &gt; JavaScript: " → \", ' → \' 

   2) CSP(Content Security Policy)를 설정하여 스크립트의 실행 범위를 제한
         예: Content-Security-Policy: default-src 'self'; script-src 'self';

   3) 쿠키 보안 강화
       - HttpOnly : 쿠키가 JavaScript를 통해 접근되지 않도록 설정
         예: Set-Cookie: sessionid=abc123; HttpOnly
       - Secure : HTTPS 통신에서만 쿠키가 전달되도록 설정

   4) 안전한 프로그래밍
       - 클라이언트 측 스크립트에서 DOM을 조작할 때, 사용자 입력값을 신뢰하지 않도록 설계
       - JavaScript에서 innerHTML 대신 textContent 사용

   5) 라이브러리 사용 : XSS 방어를 위한 검증된 라이브러리 사용 (OWASP Java Encoder, DOMPurify 등)

 

※ 저장형 XSS, 반사형 XSS, DOM 기반 XSS 비교

구분 저장형 XSS (Stored XSS) 반사형 XSS (Reflected XSS) DOM 기반 XSS (DOM-based XSS)
공격 방식 악성 스크립트를 서버에 저장하여 다수의 사용자에게 전달 악성 스크립트가 서버를 거쳐 즉시 반사되어 사용자에게 전달 서버를 거치지 않고, 브라우저의 DOM을 직접 조작하여 실행
저장 여부 서버에 저장됨 서버에 저장되지 않고 즉시 응답에 포함 서버와 무관, 클라이언트 측에서만 실행
공격 대상 다수의 사용자 (게시판, 댓글 등) 특정 사용자 (악성 링크를 클릭한 사람) 클라이언트 측 코드 취약점이 있는 사용자
공격 경로  - 게시판, 댓글, 사용자 프로필에 악성 스크립트 삽입
 - 서버가 해당 데이터를 다른 사용자에게 전달
 - 악성 링크를 이메일, 메시지 등으로 전달
 - 사용자가 링크 클릭 시 실행.
 - URL, 쿠키, DOM 내 값 등을 클라이언트 스크립트가 직접 읽어 실행
예시  - <script>alert('TEST!!');</script>를 댓글에 삽입
 - 페이지 로드 시 악성코드 실행
 - 악성 링크: http://example.com?q=<script>alert('TEST!!')</script>  - JavaScript가 document.location.hash를 그대로 HTML에 삽입
위험성 지속적 : 서버에 저장되어 다수에게 영향을 미침 일시적 : 특정 사용자가 링크를 클릭해야 발생 클라이언트 제한적 : 특정 브라우저에서만 실행
공격 난이도 상대적으로 어려움 상대적으로 쉬움 중간
주요 피해  - 다수 사용자의 세션 탈취, 정보 유출.
 - 악성코드 확산
 - 특정 사용자의 세션 탈취.
 - 피싱 및 개인정보 유출.
 - 클라이언트 코드 기반 피해.
 - 세션 탈취, DOM 조작.
방지 방법  - 입력값 검증 및 필터링.
- 출력값 이스케이프 처리.
 - CSP 설정.
 - 입력값 검증
 - URL 파라미터 필터링.
- 악성 링크 식별.
 - 안전한 DOM 조작 API 사용
- DOMPurify 같은 라이브러리 사용.

 

728x90