
Calibre-Web 是一个开源的、基于Web的Calibre电子书数据库管理工具,提供直观的界面供用户浏览、阅读和下载电子书。然而,在其版本 0.6.25 的用户管理组件中发现了一个严重的存储型跨站脚本(XSS)漏洞,允许经过身份验证的攻击者(需具备管理员权限)在用户名中注入恶意脚本,进而危及整个应用的安全。
/ajax/listusers 端点以JSON格式获取所有用户信息,用于前端展示。该漏洞的根本原因在于,应用程序在创建新用户时,对 username 字段的输入未进行严格的服务器端验证和消毒。同时,当 /ajax/listusers 端点返回包含恶意用户名的数据时,前端在渲染用户列表时未对数据进行HTML实体编码,导致注入的脚本在浏览器上下文中被执行。
0.6.25/ajax/listusers 实现逻辑的早期版本。攻击者利用管理员权限,在创建新用户时,于 Username 字段中插入精心构造的XSS payload。该payload随后被存储在服务器上。当任何管理员(包括payload的创建者或其他管理员)访问用户列表页面时,前端会请求 /ajax/listusers 接口,该接口返回包含恶意payload的数据,导致浏览器解析并执行该payload。
为了复现此漏洞,您需要搭建一个Calibre-Web 0.6.25 的测试环境。
venv\Scripts\activate
pip install -r requirements.txthttp://localhost:8083 启动。http://localhost:8083admin / admin123以下步骤演示了如何复现此存储型XSS漏洞。
0.6.25。admin)的访问权限。使用管理员账户登录Calibre-Web。
GET /ajax/listusers,或者通过前端页面(如再次查看用户列表)触发请求。虽然我们无法直接访问Calibre-Web 0.6.25 的全部源代码,但可以推断出漏洞存在的关键代码位置。
在 POST /admin/user/new 的处理逻辑中,应用程序从请求中获取 username 参数,并直接存储到数据库,未进行任何过滤或编码。
# 假设的代码: /cps/admin.py (或类似位置)
from flask import request
from .models import User
def create_user():
username = request.form['username'] # 直接从表单获取,无任何验证
password = request.form['password']
# ... 其他字段
new_user = User(username=username, password=password) # 直接存储原始值
db.session.add(new_user)
db.session.commit()
# ... 重定向或返回响应在 /ajax/listusers 的处理逻辑中,应用程序从数据库查询所有用户,并将包含原始用户名的用户列表以JSON格式返回。
# 假设的代码: /cps/admin.py (或类似位置)
from flask import jsonify
from .models import User
def list_users_ajax():
users = User.query.all()
user_list = []
for user in users:
# 直接从数据库取出用户名,未进行编码
user_list.append({'id': user.id, 'username': user.username})
return jsonify(user_list)前端JavaScript代码接收到 /ajax/listusers 返回的JSON数据后,使用 innerHTML 或其他不安全的方法将用户名插入到DOM中。
<!-- 假设的代码: /cps/templates/admin.html (或类似位置) -->
<script>
fetch('/ajax/listusers')
.then(response => response.json())
.then(users => {
const userListDiv = document.getElementById('user-list');
users.forEach(user => {
// 漏洞点:直接将用户名字符串插入到HTML中,innerHTML会解析并执行其中的脚本
userListDiv.innerHTML += '<div>' + user.username + '</div>';
});
});
</script>
<div id="user-list"></div>CVE-2025-65858 是一个典型的存储型XSS漏洞,其根源在于对用户输入的不信任和对输出编码的缺失。此漏洞允许拥有管理员权限的攻击者将恶意负载持久化,进而危害其他管理员或应用自身的安全。修复方案应包括:在后端对用户名进行严格的输入验证,并在将数据输出到HTML上下文时进行严格的HTML实体编码。建议所有使用受影响版本的用户尽快升级或应用补丁。FINISHED
6HFtX5dABrKlqXeO5PUv/6LSj2QdUDGX+cmMlh0332NX4+31qteAH/vWua1xnBtr
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。