Calibre-Web 存储型XSS漏洞分析 (CVE-2025-65858)

📅 发布时间:2026/7/6 7:02:23 👁️ 浏览次数:
Calibre-Web 存储型XSS漏洞分析 (CVE-2025-65858)
Calibre-Web 存储型跨站脚本(XSS)漏洞分析 (CVE-2025-65858)项目概述Calibre-Web 是一个开源的、基于Web的Calibre电子书数据库管理工具提供直观的界面供用户浏览、阅读和下载电子书。然而在其版本0.6.25的用户管理组件中发现了一个严重的存储型跨站脚本XSS漏洞允许经过身份验证的攻击者需具备管理员权限在用户名中注入恶意脚本进而危及整个应用的安全。功能特性用户管理提供管理员创建、编辑和删除用户的功能。用户列表API通过/ajax/listusers端点以JSON格式获取所有用户信息用于前端展示。数据存储用户信息包括用户名直接存储于后端数据库。漏洞详情 (CVE-2025-65858)核心问题该漏洞的根本原因在于应用程序在创建新用户时对username字段的输入未进行严格的服务器端验证和消毒。同时当/ajax/listusers端点返回包含恶意用户名的数据时前端在渲染用户列表时未对数据进行HTML实体编码导致注入的脚本在浏览器上下文中被执行。影响范围确认受影响版本Calibre-Web0.6.25可能受影响版本所有使用相同用户管理和/ajax/listusers实现逻辑的早期版本。所需权限攻击者需要拥有管理员权限才能创建新用户。攻击向量攻击者利用管理员权限在创建新用户时于Username字段中插入精心构造的XSS payload。该payload随后被存储在服务器上。当任何管理员包括payload的创建者或其他管理员访问用户列表页面时前端会请求/ajax/listusers接口该接口返回包含恶意payload的数据导致浏览器解析并执行该payload。安装指南 (用于本地测试与复现)为了复现此漏洞您需要搭建一个Calibre-Web0.6.25的测试环境。克隆仓库并切换到受影响版本gitclone https://github.com/janeczku/calibre-web.gitcdcalibre-webgitcheckout0.6.25安装依赖建议使用Python虚拟环境。python3 -m venv venvsourcevenv/bin/activate# 在Windows上使用 venv\Scripts\activatepipinstall-r requirements.txt运行应用python cps.py应用默认会在http://localhost:8083启动。登录后台访问http://localhost:8083使用默认管理员凭证登录admin/admin123使用说明 (漏洞复现步骤)以下步骤演示了如何复现此存储型XSS漏洞。前提条件已按照安装指南搭建并运行Calibre-Web0.6.25。拥有管理员账户如默认的admin的访问权限。复现步骤1. 登录为管理员使用管理员账户登录Calibre-Web。2. 创建带有恶意Payload的用户导航至“管理”页面点击“添加新用户”按钮。在Username字段中输入以下XSS payloadimg srcx onerroralert(XSS)填写其他必填字段如密码、邮箱然后提交表单。3. 触发漏洞应用程序已将恶意用户名存储到数据库。现在直接访问用户列表API端点GET /ajax/listusers或者通过前端页面如再次查看用户列表触发请求。浏览器会立即弹出一个包含“XSS”字样的警告框证明JavaScript代码已成功执行。核心代码分析虽然我们无法直接访问Calibre-Web0.6.25的全部源代码但可以推断出漏洞存在的关键代码位置。1. 后端用户创建处理 (假设代码)在POST /admin/user/new的处理逻辑中应用程序从请求中获取username参数并直接存储到数据库未进行任何过滤或编码。# 假设的代码: /cps/admin.py (或类似位置)fromflaskimportrequestfrom.modelsimportUserdefcreate_user():usernamerequest.form[username]# 直接从表单获取无任何验证passwordrequest.form[password]# ... 其他字段new_userUser(usernameusername,passwordpassword)# 直接存储原始值db.session.add(new_user)db.session.commit()# ... 重定向或返回响应2. 后端用户列表API (假设代码)在/ajax/listusers的处理逻辑中应用程序从数据库查询所有用户并将包含原始用户名的用户列表以JSON格式返回。# 假设的代码: /cps/admin.py (或类似位置)fromflaskimportjsonifyfrom.modelsimportUserdeflist_users_ajax():usersUser.query.all()user_list[]foruserinusers:# 直接从数据库取出用户名未进行编码user_list.append({id:user.id,username:user.username})returnjsonify(user_list)3. 前端渲染用户列表 (假设代码)前端JavaScript代码接收到/ajax/listusers返回的JSON数据后使用innerHTML或其他不安全的方法将用户名插入到DOM中。!-- 假设的代码: /cps/templates/admin.html (或类似位置) --scriptfetch(/ajax/listusers).then(responseresponse.json()).then(users{constuserListDivdocument.getElementById(user-list);users.forEach(user{// 漏洞点直接将用户名字符串插入到HTML中innerHTML会解析并执行其中的脚本userListDiv.innerHTMLdivuser.username/div;});});/scriptdividuser-list/div结论CVE-2025-65858 是一个典型的存储型XSS漏洞其根源在于对用户输入的不信任和对输出编码的缺失。此漏洞允许拥有管理员权限的攻击者将恶意负载持久化进而危害其他管理员或应用自身的安全。修复方案应包括在后端对用户名进行严格的输入验证并在将数据输出到HTML上下文时进行严格的HTML实体编码。建议所有使用受影响版本的用户尽快升级或应用补丁。FINISHED6HFtX5dABrKlqXeO5PUv/6LSj2QdUDGXcmMlh0332NX431qteAH/vWua1xnBtr更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号网络安全技术点滴分享