novel(V3.5.0)是一个基于 Spring Boot 3 + Vue 3 的小说阅读平台,其书籍评论模块存在基于 DOM 的 XSS 漏洞。问题在于对用户提交的评论内容缺乏充分的验证/编码: 后端:BookComment 实体/DTO 中的 commentContent 字段在存入数据库并通过 API 返回时,未对恶意 HTML/JS 代码进行过滤; 前端:平台获取未编码的评论,将其存储在 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},例如书籍 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', '');


找到页面上的评论文本框(id="txtComment"),输入恶意载荷()。 点击“提交”按钮,触发 BookDetail.SaveComment(37, 0, payload) 方法(37 为 bookId)。
刷新小说详情页;前端调用 /api/book/comment/list?bookId=37 获取恶意评论,并将其存入 window.localStorage(键:book_comment_37)。
观察页面弹出显示用户会话 cookie 的窗口(确认恶意代码已执行)。 按 F12 打开开发者工具,切换到「Elements」面板,在 DOM 结构中搜索 (确认载荷已插入到