
novel V3.5.0 における DOMベースのクロスサイトスクリプティング(XSS)脆弱性(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 にレンダリングします (サニタイズなし)。
攻撃者は (ログイン後に) 悪意のあるコメントを送信し、ユーザーに影響を受けるページへのアクセスを誘導し、コード実行をトリガーしてセッション Cookie を盗んだり、なりすましを行ったり、ページコンテンツを改ざんしたりする可能性があります。
対象バージョン: 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 ディレクティブを介して (サニタイズなしで) 直接 DOM にレンダリングします (<li class="dec"> タグに挿入されます)。
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") を見つけ、悪意のあるペイロード (<script>alert(document.cookie)</script>) を入力します。
「Submit」ボタンをクリックして BookDetail.SaveComment(37, 0, payload) メソッドをトリガーします (37 は bookId)。
小説詳細ページをリフレッシュします。フロントエンドは /api/book/comment/list?bookId=37 を呼び出して悪意のあるコメントを取得し、window.localStorage (キー: book_comment_37) に保存します。
ユーザーのセッション Cookie を表示するポップアップウィンドウがページに表示されるのを確認します (悪意のあるコードの実行を確認)。
F12 を押して開発者ツールを開き、「Elements」パネルに切り替え、DOM 構造内で <script>alert(document.cookie)</script> を検索します (<li class="dec"> タグにペイロードが挿入されていることを確認)。
