
DOM-based Cross-Site Scripting (XSS) Vulnerability in novel V3.5.0 (CWE-79)
novel (V3.5.0)은 Spring Boot 3 + Vue 3 기반의 소설 읽기 플랫폼으로, 책 댓글 모듈에 DOM 기반 XSS 취약점이 있습니다. 이 결함은 사용자가 제출한 댓글 내용에 대한 부적절한 검증/인코딩에서 발생합니다: 백엔드: BookComment 엔티티/DTO의 commentContent 필드는 악성 HTML/JS 코드를 필터링하지 않고 데이터베이스에 저장되고 API를 통해 반환됩니다. 프론트엔드: 플랫폼은 인코딩되지 않은 댓글을 가져와 window.localStorage (키: book_comment_{bookId})에 저장하고, Vue 3의 v-html (살균 처리 없음)을 통해 데이터를 DOM에 직접 렌더링합니다. 공격자는 (로그인 후) 악성 댓글을 제출하고, 사용자가 영향을 받는 페이지에 접속하도록 유도하여 세션 쿠키를 탈취하거나, 신원을 도용하거나, 페이지 내용을 변조하는 코드 실행을 트리거할 수 있습니다.
대상 버전: novel V3.5.0 환경: Chrome/Firefox, 합법적인 사용자 계정 (로그인 필요) 영향 받는 URL: 소설 상세 페이지 (http://117.72.165.13:8888/book/detail.html?id={bookId}) 및 댓글 목록 페이지 (http://117.72.165.13:8888/book/comment-{bookId}.html)
취약점은 책 댓글 모듈 (핵심 비즈니스 로직)에서 트리거됩니다:
백엔드: BookComment 엔티티/DTO의 commentContent 필드는 book_comment 데이터베이스 테이블에 저장되고, 댓글 목록 API (/api/book/comment/list?bookId={bookId})를 통해 악성 HTML/JS 코드를 필터링하지 않고 반환됩니다.
프론트엔드: 페이지는 API에서 인코딩되지 않은 댓글 내용을 가져와 window.localStorage (키: book_comment_{bookId}, 예: book ID 37의 경우 book_comment_37)에 저장하고, Vue 3의 v-html 디렉티브 ( <li class="dec"> 태그에 삽입)를 통해 살균 처리 없이 DOM에 직접 렌더링합니다.
http://117.72.165.13:8888/book/1935650139770011648/1984484631582167040.html?switch=on&wvstest=<svg onload="alert('DOM-XSS-Test')">
(페이지는 wvstest 매개변수의 값을 window.localStorage에 저장합니다)
localStorage.setItem('book_comment_37', '');
http://117.72.165.13:8888/user/login.html에 접속하여 합법적인 계정으로 로그인하고 소설 상세 페이지로 이동합니다.
페이지에서 댓글 텍스트 영역 (id="txtComment")을 찾아 악성 페이로드 ()를 입력합니다. "제출" 버튼을 클릭하여 BookDetail.SaveComment(37, 0, payload) 메서드를 트리거합니다 (37은 bookId).
소설 상세 페이지를 새로 고칩니다. 프론트엔드가 /api/book/comment/list?bookId=37을 호출하여 악성 댓글을 가져오고 window.localStorage (키: book_comment_37)에 저장합니다.
페이지에서 사용자의 세션 쿠키를 표시하는 팝업 창이 나타나는지 관찰합니다 (악성 코드 실행 확인). F12를 눌러 개발자 도구를 열고 「Elements」 패널로 전환한 후 DOM 구조에서 를 검색합니다 (